web-dev-qa-db-ja.com

Pythonでstatsを使用してopenCVの接続コンポーネントを使用するにはどうすればよいですか?

PythonでOpenCVのConnectedComponentsWithStats()関数を使用する方法の例を探しています。これはOpenCV 3以降でのみ利用可能です。公式ドキュメントには、Python用にコンパイルされたときに関数が存在していても、C++のAPIのみが示されています。私はそれをオンラインで見つけることができませんでした。

31
Zack Knopp

この関数は次のように機能します。

# Import the cv2 library
import cv2
# Read the image you want connected components of
src = cv2.imread('/directorypath/image.bmp')
# Threshold it so it becomes binary
ret, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# You need to choose 4 or 8 for connectivity type
connectivity = 4  
# Perform the operation
output = cv2.connectedComponentsWithStats(thresh, connectivity, cv2.CV_32S)
# Get the results
# The first cell is the number of labels
num_labels = output[0]
# The second cell is the label matrix
labels = output[1]
# The third cell is the stat matrix
stats = output[2]
# The fourth cell is the centroid matrix
centroids = output[3]

Labelsは、各要素がそのラベルに等しい値を持つ入力画像のサイズのマトリックスです。

Statsは、関数が計算する統計のマトリックスです。ラベルの数に等しい長さと統計の数に等しい幅があります。 OpenCVのドキュメントで使用できます。

背景ラベルを含む各ラベルの統計出力。使用可能な統計については、以下を参照してください。統計情報はstats [label、COLUMN]でアクセスできます。利用可能な列は以下で定義されています。

  • cv2.CC_STAT_LEFT水平方向の境界ボックスの包括的開始点である左端(x)座標。
  • cv2.CC_STAT_TOP垂直方向の境界ボックスの包括的開始点である最上位(y)座標。
  • cv2.CC_STAT_WIDTH境界ボックスの水平サイズ
  • cv2.CC_STAT_HEIGHT境界ボックスの垂直サイズ
  • cv2.CC_STAT_AREA接続されたコンポーネントの総面積(ピクセル単位)

Centroidsは、各図心のxおよびy位置を含む行列です。このマトリックスの行は、ラベル番号に対応しています。

73
Zack Knopp

Zack Knopp回答に追加します。グレースケール画像を使用している場合は、次を使用できます。

import cv2
import numpy as np

src = cv2.imread("path\\to\\image.png", 0)
binary_map = (src > 0).astype(np.uint8)
connectivity = 4 # or whatever you prefer

output = cv2.connectedComponentsWithStats(binary_map, connectivity, cv2.CV_32S)

グレースケール画像でZack Knopp answerを使用しようとしてもうまくいきませんでした。これが私の解決策でした。

5
Barel Levy

私はここに何回か来て、それがどのように機能するかを思い出し、毎回上記のコードを次のように減らす必要があります:

_, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
connectivity = 4  # You need to choose 4 or 8 for connectivity type
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh , connectivity , cv2.CV_32S)

うまくいけば、誰にとっても便利です:)

2
Dan Erez