使用python选择图像区域

时间:2018-08-07 06:24:42

标签: python image-processing roi

我正在尝试选择图像的某个区域,以对该图像的特定区域进行一些分析。

但是,当我在线搜索时,我只能找到有关如何选择矩形区域的指南。我需要选择使用鼠标绘制的区域。下面是这种区域的一个例子。

任何人都可以向我推荐一些关键词或库来搜索以帮助我解决这个问题,或能找到类似功能的指南链接吗?

我也不知道这是否是必要的信息,但我要对感兴趣区域进行的分析是找到该特定区域中白色像素与黑色像素的比率。

Example of an area I am trying to select

1 个答案:

答案 0 :(得分:1)

我基于this answer制作了一个简单的工作示例。我也尝试使用scipy.ndimage.morphology.fill_binary_holes,但无法正常工作。请注意,由于假设输入图像是灰度图像且未进行二值化,因此提供的功能会花费更长的时间。

我特别避免使用OpenCV,因为我发现该设置有些繁琐,但我认为它也应该提供等效功能(see here)。

此外,我的“二值化”有点怪异,但您可能可以自己弄清楚如何将图像解析为有效格式(如果在程序中生成结果,可能会更容易)。无论如何,我建议您确保使用正确的图像格式,因为jpeg的压缩可能会破坏您的连接性,并在某些情况下导致问题。

import scipy as sp
import numpy as np
import scipy.ndimage
import matplotlib.pyplot as plt

def flood_fill(test_array,h_max=255):
    input_array = np.copy(test_array) 
    el = sp.ndimage.generate_binary_structure(2,2).astype(np.int)
    inside_mask = sp.ndimage.binary_erosion(~np.isnan(input_array), structure=el)
    output_array = np.copy(input_array)
    output_array[inside_mask]=h_max
    output_old_array = np.copy(input_array)
    output_old_array.fill(0)   
    el = sp.ndimage.generate_binary_structure(2,1).astype(np.int)
    while not np.array_equal(output_old_array, output_array):
        output_old_array = np.copy(output_array)
        output_array = np.maximum(input_array,sp.ndimage.grey_erosion(output_array, size=(3,3), footprint=el))
    return output_array

x = plt.imread("test.jpg")
# "convert" to grayscale and invert
binary = 255-x[:,:,0]

filled = flood_fill(binary)

plt.imshow(filled)

这将产生以下结果: final result