BETA

OpenCV生活44日目 connectedComponentsWithStatsで領域の付加情報も取得

投稿日:2020-08-19
最終更新:2020-08-18

connectedComponentsでは連結した領域のラベル付をおこなってくれました。
実はconnectedComponentsWithStatsを使うことで、もっとリッチな情報を得ることができます。

connectedComponentsWithStatsの使い方

connectedComponentsWithStatsは次のような使い方になります。

n_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(bi_img)  
  • 返り値のn_labelsとlabelsはconnectedComponentsでも得られた、領域のラベルの数と画像のラベル情報を格納した行列です。
  • statsは領域の数と同じ行数をもった行列になっています。各行は5つの要素を持っており、最初の4つは領域のバウンディングボックスの左上の座標$(x,y)$とその幅$w$、高さ$h$が順に入っています。5つめの要素はバウンディングボックスの面積です。
  • centroidsは各領域の重心です。

これらの情報を次のように描画してみます。

colored_img = np.zeros(bi_img.shape + (3,), dtype=np.uint8)  

# 分かりづらいですが、背景以外で面積の大きい領域2つのインデックスを取得しています  
target_index = np.argsort(stats[1:, -1])[::-1][:2] + 1  

for i in target_index:  
    colored_img[labels == i] = [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]   

for centroid in centroids[target_index]:  
    cv2.circle(colored_img, tuple(centroid.astype(np.uint)), 3, (255, 255, 0), -1)  

for stat in stats[target_index]:  
    x, y, w, h, _ = stat  
    cv2.rectangle(colored_img, (x, y), (x + w, y + h), (255, 0, 0), 3)  

plt.imshow(colored_img)  
plt.show()  


黄色い点が重心で、赤い四角がバウンディングボックスです。
上手く情報が取得できていることがわかります。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@opqrstuvcutの技術とか技術以外のブログ 最近フリーランスになりました

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう