2017-04-21 78 views
1

我在Ubuntu上,python 2.7。使用OpenCV。cv2.connectedComponents not detected components

我想知道cv2.connectedComponents函数在做什么。 这是图像:

enter image description here

的代码:

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成分?

+2

由于前景物体应该是白色,背景的黑色。翻转图像! 'img = 255 - img'; – Miki

+0

哎哟...我怎么可以这样...那是正确的!谢谢 – daniel

回答

3

这是因为cv2.connectedComponents()只考虑白色部分作为组件。因此你得到一个单一的组件。

你必须倒置你的图像。您可以通过使用cv2.bitwise_not()函数来完成此操作。

CODE:

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

+2

在我看来更合乎逻辑的是使用'cv2.THRESH_BINARY_INV'作为类型而不是阈值,然后反转。 – beaker

+0

@beaker点很好记。但这个问题的重点是在倒置时找到连接的组件。所以这就是为什么我实际上写了一个额外的行来突出图像反转 –

相关问题