2017-04-21 4 views
1

私はUbuntu上で、Python 2.7です。 OpenCVを使って作業する。cv2.connectedコンポーネントがコンポーネントを検出しない

私は、関数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」でなければなりません。私は19を取得する必要があります

np.amax(markers) 

が、私は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) 

RESULT:

19 
+1

YEs、あなたは正しいです。正しい答えはMikiとJeru Lukeにありがとう。今それは動作します。 – daniel

+2

スレッシュホールドして反転するのではなく、 'cv2.THRESH_BINARY_INV'を型として使用する方が論理的です。 – beaker

+0

@ビーカーポイントよく記載されています。しかし、この質問のハイライトは、逆に接続されたコンポーネントを見つけることでした。だから、私は実際にイメージ反転を強調するために余分な行を書いたのです –

関連する問題