2017-04-21 105 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點很好記。但這個問題的重點是在倒置時找到連接的組件。所以這就是爲什麼我實際上寫了一個額外的行來突出圖像反轉 –

相關問題