cv2.connectedComponents无法检测到组件。

11

我在Ubuntu系统中,使用Python 2.7版本,并且正在使用OpenCV。

我试图理解cv2.connectedComponents函数的确切作用。这是图片:

输入图片描述

代码如下:

import cv2
import numpy as np

img = cv2.imread('BN.tif', 0)

img = np.uint8(img)
_, markers = cv2.connectedComponents(img)
 

据我所了解,此函数将创建一个与提供的图像大小相同的数组。 对于检测到的每个组件,将为该组件的所有(y,x)位置分配相同的数字。 如果背景全部为“0”,则圆圈将全部为“1”,下一个正方形全部为“2”等等。 最后一个组件应全部为“19”。 我通过获取定义组件的最高数字来读取组件的数量:

np.amax(markers)

我应该得到19个组件,但我只得到了1个。

我的问题是:为什么我只得到了1个组件?


4
由于前景物体应该为白色,而背景则为黑色,因此需要翻转图像!请使用img = 255 - img - Miki
哎呀... 我怎么能够这么...没错! 谢谢 - daniel_hck
1个回答

12

这是因为cv2.connectedComponents()只把白色部分视为一个连通组件,因此你得到的是单个组件。

你需要反转图像。你可以使用cv2.bitwise_not()函数来做到这一点。

代码:

import cv2
import numpy as np

img = cv2.imread('cc.png', 0)
ret, thresh = cv2.threshold(img, 127, 255, 0)

#---- Inverting the image here ----
img = cv2.bitwise_not(thresh)     
_, markers = cv2.connectedComponents(img)
print np.amax(markers)

结果:

19

1
是的,你说得对。感谢Miki和Jeru Luke提供正确的答案。现在它可以工作了。 - daniel_hck
4
使用cv2.THRESH_BINARY_INV作为类型似乎更合乎逻辑,而不是进行阈值处理然后再反转。 - beaker
1
@beaker 点已经注意到了。但是这个问题的重点是在反转后找到连接的组件。所以我实际上写了一行额外的代码来突出图像反转。 - Jeru Luke
1
对于Python3,请将最后一行更改为print(np.max(markers))。 - Rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接