如何在opencv python中删除基于掩码的图像组件?

时间:2013-12-22 10:15:42

标签: python opencv image-processing

我有两个二进制图像。让我们说图像A和B.

两者都包含具有像素值1且背景具有像素值0的对象。

图像B是一个蒙版图像。

我希望将“图像A”中的组件保留为“图像B”的对象,即使是一个像素。

我尝试了什么

我试过numpy.logical_and它给了我一个交集。

现在我必须循环“图像A”的所有组件来检查所有像素,如果相交的像素位于图像A的任何组件中并且非常慢。

我在寻找什么

opencv中是否有任何库函数可以完成所有工作?

或任何有用的python库

任何人都可以帮我提供示例代码或其他内容。

由于

1 个答案:

答案 0 :(得分:3)

from skimage.morphology import label
labels_a = label(a, 4, 0)  #CCL analysis with 4 way connectivity and 0 as background
output = np.zeros_like(a)  #output as zeros with same shape as a
intersecting_pixels_indicies = np.nonzero(a&b) #getting the indicies where a&b is true(1)

objectIDs = set()
for i,j in zip(*intersecting_pixels_indicies):
    objectIDs.add(labels_a[i,j]) #get the ID's of the indicies.

for i in range(output.shape[0]):
    for j in range(output.shape[1]):
        if output[i,j] in objectIDs: #if this id is in or list. add the value of a to output.
            output[i,j] = a[i,j]

你可以尝试一下,看看它是否足够快,如果它能给你你想要的结果。

首先,在阵列上完成连接组件分析,具有4路连接。连接到同一“对象”的所有像素将获得相同的值。因此,如果检查单元格的值,您将获得相关对象的ID。如果背景则为-1 请参阅:http://en.wikipedia.org/wiki/Connected-component_labeling以更深入地了解连接组件标签。

然后,np.nonzero(a& b)提取a和b为1的指示。然后程序将遍历所有这些指标并检查标记数组的相应ID。将它添加到我们感兴趣的一组对象中 我们现在拥有要提取的所有对象的ID。所以我们只是循环遍历数组,对于每个单元格,我们检查该值是否在我们感兴趣的objectID列表中。如果是,我们将a的值添加到输出中,否则我们什么都不做(或者我们可以将它设置为零,但输出用全零实例化)