[Py]OpenCVでのラベリング

PythonのOpenCVでラベリングを行うにあたっては,

cv2.connectedComponentsWithStats(maskImg)

を使いますが,返ってくる値が何なのかよくわかりません.

以下の写真を使って,緑色の点をラベリングするとします.

返り値は4つあるので,とりあえず以下とします.

label1,label2,label3,label4 = cv2.connectedComponentsWithStats(maskImg)
print(label1, label2, label3, label4, sep='\n')

とやってやると,実行結果は以下のようになりました.

#label1
3

#label2
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]

#label3
[[     0      0    700    394 275573]
 [   309     67     17     18    151]
 [   327    249      9     11     76]]

#label4
[[349.52311003 196.55010469]
 [316.50993377  76.0794702 ]
 [331.25       254.07894737]]

label1

単純にラベルの個数みたいです.ラベルのナンバリングは1がスタート(0が該当しない画素)なので要注意です.とりあえず,今回の場合だと3となっているので,3-1=2で,緑色の点が2つ検出できたということは間違いないでしょう.

label2

ラベルの値が格納されているらしいです.

つまり,上の画像の場合で言えば,1番目に見つかる緑色の点(上の点)があるところで,

[111111
 111111
 111111]

みたいになっており,2番め(下にある緑色の点)の場所が222…と格納されているようです.これを利用することによって,特定のラベルのみに処理を施すことができるということになります(未検証).

該当しない画素には0がラベリングされるということで,label1で0からスタートしない理由が解るということです.

label3

高さ,幅,面積が格納されています.

       x      y  width  height     Size
 [     0      0    700    394    275573] #ラベル0
 [   309     67     17     18       151]  #ラベル1
 [   327    249      9     11        76]  #ラベル2

左上の始点(x,y),幅と高さが取得できます.

画像のように赤いレクタングルをプロットしたい場合は,(x,y) , (x+width,y+height)みたいに簡単に指定できます.

label3は,以下のように書いたほうが解りやすく,扱いやすいかと思います.適当にループ回してやれば複数も問題なくできそうです.

x, y, width, height, size = label3[labelNumber]

label4

中心点(x,y)が格納されています.

[[349.52311003 196.55010469] #ラベル0
 [316.50993377  76.0794702 ] #ラベル1
 [331.25       254.07894737]]#ラベル2

 

ラベル0はあまり使うことはないと思いますので,最初から削除したほうが処理が書きやすくなると思います.

おわり.


スポンサーリンク

コメントを残す