【问题标题】:How to remove image components based on the mask in opencv python?如何根据opencv python中的掩码删除图像组件?
【发布时间】:2014-01-10 18:34:15
【问题描述】:

我有两个二进制图像。假设图像 A 和 B。

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

图像 B 是蒙版图像。

我想在“图像 A”中保留与“图像 B”的对象接触甚至一个像素的组件。

我的尝试

我试过numpy.logical_and 它给了我交叉点。

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

我在寻找什么

opencv 中是否有任何库函数可以做到这一切?

或者任何有用的python库

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

谢谢

【问题讨论】:

  • 我不太明白这部分:“现在我必须循环“图像 A”的所有组件来检查所有像素,如果相交的像素位于图像 A 的任何组件中并且它非常慢。”您的意思是您不仅考虑像素,而且考虑像素所属的“对象”?如果是这样,您如何定义“对象”?你能对输入和输出给出更清晰的解释吗?
  • 在OpenCV中你可以使用cv2. bitwise_and()

标签: python opencv image-processing


【解决方案1】:
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 的值添加到输出中,如果不是,我们什么也不做(或者我们可以将其设置为零,但输出实例化为全零)

【讨论】:

  • 我不是 OP,但这太棒了。对于像我这样以前没见过的人,这个答案使用scikit-image 并且morphology.label 将任何给定像素标识为连接区域as explained here 的一部分。
  • 您能否就这段代码的实际作用添加一些更详细的描述?也许代码中有一些 cmets?
  • @HannesOvrén 现在添加了一些 cmets 和解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多