OpenCV – 連結成分のラベリングを行う cv2.connectedComponents の使い方

目次

概要

OpenCV で2値画像の連結成分のラベリングを行う cv2.connectedComponents() の使い方について解説します。

連結成分のラベリング

連結成分のラベリング (connected component labeling) とは、2値画像の繋がっている非0の画素ごとにラベルを割り当てる処理です。

連結成分のラベリング

cv2.connectedComponents

# アルゴリズムを指定しない場合
retval, labels = cv2.connectedComponents(image[, labels[, connectivity[, ltype]]])
# アルゴリズムを指定する場合
retval, labels = cv2.connectedComponentsWithAlgorithm(image, connectivity, ltype, ccltype[, labels])
引数
名前 デフォルト値
image ndarray
2値画像 (1チャンネル)
connectivity int, {4, 8} 8
接続していると判定する基準
  • 4: 4連結
  • 8: 8連結
ltype int, {cv2.CV_32S, cv2.CV_CV_16U} cv2.CV_32S
ラベリング結果の型
ccltype ConnectedComponentsAlgorithmsTypes
  • cv2.CCL_WU: 4, 8連結の場合は SAUF アルゴリズムを使用する。
  • cv2.CCL_DEFAULT: 8連結の場合は BBDT アルゴリズム、4連結の場合は SAUF アルゴリズムを使用する。
  • cv2.CCL_GRANA: 8連結の場合は BBDT アルゴリズム、4連結の場合は SAUF アルゴリズムを使用する。
返り値
名前 説明
retval ラベル数
labels ラベリング結果

sample.jpg

In [1]:
import cv2
import numpy as np
from matplotlib import pyplot as plt

# 画像を読み込む。
img = cv2.imread("sample.jpg")

# グレースケールに変換する。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2値化する
ret, bin_img = cv2.threshold(gray, 20, 255, cv2.THRESH_BINARY)

# 連結成分のラベリングを行う。
n_labels, labels = cv2.connectedComponents(bin_img)

# ラベル数
print("number of labels:", n_labels)

fig, ax = plt.subplots(figsize=(7, 7))
ax.imshow(labels)

plt.show()
number of labels: 6

cv2.connectedComponentsWithStats

こちらの関数はラベリング結果と一緒に重心や大きさなど構造情報も返します。

# アルゴリズムを指定しない場合
retval, labels, stats, centroids = cv2.connectedComponentsWithStats(
    image[, labels[, stats[, centroids[, connectivity[, ltype]]]]])
# アルゴリズムを指定する場合
retval, labels, stats, centroids = cv2.connectedComponentsWithStatsWithAlgorithm(
    image, connectivity, ltype, ccltype[, labels[, stats[, centroids]]])
引数
名前 デフォルト値
image ndarray
2値画像 (1チャンネル)
connectivity int, {4, 8} 8
接続していると判定する基準
  • 4: 4連結
  • 8: 8連結
ltype int, {cv2.CV_32S, cv2.CV_CV_16U} cv2.CV_32S
ラベリング結果の型
ccltype ConnectedComponentsAlgorithmsTypes
  • cv2.CCL_WU: 4, 8連結の場合は SAUF アルゴリズムを使用する。
  • cv2.CCL_DEFAULT: 8連結の場合は BBDT アルゴリズム、4連結の場合は SAUF アルゴリズムを使用する。
  • cv2.CCL_GRANA: 8連結の場合は BBDT アルゴリズム、4連結の場合は SAUF アルゴリズムを使用する。
返り値
名前 説明
retval ラベル数
labels ラベリング結果
stats 各ラベルの構造情報
centroids 重心

stats(ラベル数, 5) の ndarray です。 各行には、そのラベルの (左上の x 座標, 左上の y 座標, 幅, 高さ, 面積) の情報が格納されています。

In [2]:
# 連結成分のラベリングを行う。
retval, labels, stats, centroids = cv2.connectedComponentsWithStats(bin_img)

for i, row in enumerate(stats):
    print(f"label {i}")
    print(f"* topleft: ({row[cv2.CC_STAT_LEFT]}, {row[cv2.CC_STAT_TOP]})")
    print(f"* size: ({row[cv2.CC_STAT_WIDTH]}, {row[cv2.CC_STAT_HEIGHT]})")
    print(f"* area: {row[cv2.CC_STAT_AREA]}")
label 0
* topleft: (0, 0)
* size: (420, 362)
* area: 126715
label 1
* topleft: (182, 44)
* size: (63, 62)
* area: 2016
label 2
* topleft: (256, 96)
* size: (88, 87)
* area: 3872
label 3
* topleft: (144, 166)
* size: (118, 117)
* area: 10910
label 4
* topleft: (286, 247)
* size: (83, 83)
* area: 3486
label 5
* topleft: (25, 251)
* size: (71, 71)
* area: 5041

stats(ラベル数, 2) の ndarray です。 各行には、そのラベルの重心が格納されています。

In [3]:
for i, row in enumerate(centroids):
    print(f"label: {i}, topleft: ({row[0]:.2f}, {row[1]:.2f})")
label: 0, topleft: (210.01, 172.93)
label: 1, topleft: (215.46, 74.50)
label: 2, topleft: (299.50, 139.00)
label: 3, topleft: (202.01, 224.00)
label: 4, topleft: (327.25, 274.33)
label: 5, topleft: (60.00, 286.00)

参考文献

コメント

コメントする

目次