接続コンポーネントのラベル付けをpython open cvで実装する方法は?これはイメージの例です:
白黒画像上のオブジェクトを分離するには、接続コンポーネントのラベル付けが必要です。
connectedComponents()
のOpenCV 3.0ドキュメント 言及しないでPythonですが、実際に実装されています。たとえば this SO question 。OpenCV 3.4.0以降では、ドキュメントにPython署名が含まれます。これは 現在のマスタードキュメント 。
関数呼び出しは単純です:retval, labels = cv2.connectedComponents(img)
。パラメーターconnectivity
を指定して、4ウェイまたは8ウェイ(デフォルト)接続を確認できます。違いは、4ウェイ接続では、上、下、左、および右のピクセルをチェックし、それらが接続されているかどうかを確認するだけであることです。 8ウェイピクセルは、8つの隣接ピクセルのいずれかが接続されているかどうかをチェックします。斜めの接続がある場合(ここで行うように)、connectivity=8
を指定する必要があります。各コンポーネントに番号を付けるだけで、0から始まる整数のラベルが増加することに注意してください。したがって、すべてのゼロが接続され、すべてが接続されます。それらを異なる色相にマッピングし、それらをHSV画像に結合してから、BGRに変換して表示するのが好きです。画像の例を次に示します。
import cv2
import numpy as np
img = cv2.imread('eGaIy.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1] # ensure binary
ret, labels = cv2.connectedComponents(img)
def imshow_components(labels):
# Map component labels to hue val
label_hue = np.uint8(179*labels/np.max(labels))
blank_ch = 255*np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])
# cvt to BGR for display
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)
# set bg label to black
labeled_img[label_hue==0] = 0
cv2.imshow('labeled.png', labeled_img)
cv2.waitKey()
imshow_components(labels)
2DでのCCLの私の適応:
1)画像を1/0画像に変換します。1はオブジェクトピクセルで、0は背景ピクセルです。
2)パス圧縮でUnion-Findアルゴリズムを実装して、2パスCCLアルゴリズムを作成します。もっと見ることができます こちら 。
このCCL実装の最初のパスでは、ターゲットピクセルがオブジェクトピクセルである場合に隣接ピクセルをチェックし、それらの間でラベルを比較して、それらの間で同等性を生成できるようにします。オブジェクトピクセル(label> 0)である隣接ピクセルのうち、最小のラベルをターゲットピクセルに割り当てます。この方法では、オブジェクトラベルをターゲットpixesl(label> 0)に割り当てるだけでなく、同等のリストも作成します。
2)2番目のパスでは、すべてのピクセルを調べ、Union-Findクラスに保存されている同等のテーブルを調べるだけで、前のラベルを親ラベルのラベルごとに変更します。
3)ラベルをランダムな順序(23,45,1、...)ではなく、シーケンシャルな順序(1,2,3,4 ....)にするための追加のパスを実装しました。それには、見た目を良くするためだけに「名前」というラベルを変更する必要があります。