OpenCV で Blob またはサークルの検出
このチュートリアルでは、Python で OpenCV の SimpleBlobDetector
クラスを使用して画像内のブロブまたは円を検出する方法について説明します。
Python で SimpleBlobDetector
クラスの OpenCV を使用して画像内のブロブまたは円を検出する
OpenCV の SimpleBlobDetector
クラスを使用して、画像内のブロブまたは円を検出できます。ブロブまたは円は、その面積、真円度、凸面、および慣性を使用して検出できます。
特定の領域内にあるブロブまたは円を検出する場合は、filterByArea
引数を true に設定する必要があります。次に、minArea
パラメーターを使用してブロブの最小面積を設定し、maxArea
パラメーターを使用してブロブの最大面積を設定できます。
指定された領域よりも小さいまたは大きいブロブは検出されません。SimpleBlobDetector
クラスの Params()
メソッドを使用して、検出する形状を変更できます。
OpenCV の drawKeypoints()
関数を使用して、関数によって検出されたブロブを強調表示できます。
たとえば、ブロブ領域に応じて、特定の画像内のいくつかのブロブを検出してみましょう。以下のコードを参照してください。
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
cv2.imshow("Blobs Using Area", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
出力:
Python で filterByCircularity
を画像内のブロブまたは円をフィルタリングするように設定する
また、その真円度を使用してブロブを検出することもできます。これにより、形状がどの程度円形であるかが確認されます。円形度は、円の場合は 1、ボックスの場合は 0.78 です。
円形のブロブのみを検出する場合は、filterByCircularity
引数を True に設定する必要があります。次に、minCircularity
と maxCircularity
を使用して、形状の最小および最大の真円度の値を設定できます。
指定された円形度よりも大きいまたは小さい円形度のブロブは検出されません。たとえば、上記の例で真円度を設定しましょう。以下のコードを参照してください。
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
params.filterByCircularity = True
params.minCircularity = 0.9
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
cv2.imshow("Using area,circularity", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
出力:
ご覧のとおり、上記の出力では円形のブロブのみが検出されています。
Python で filterByConvexity
を画像内のブロブまたは円をフィルタリングするように設定する
凸面を使用してブロブをフィルタリングすることもできます。まず、filterByConvexity
引数を true に設定する必要があります。次に、minConvexity
と maxConvexity
を使用して、凸性の最小値と最大値を設定できます。
楕円も円であり、完全な円とともに検出されます。filterInertia
引数を使用して、形状の慣性を使用してブロブをフィルタリングできます。
完全な円の場合、慣性は 1 であり、楕円の場合、慣性は 0 から 1 の間です。minInertiaRatio
と maxInertiaRatio
を使用して、慣性の最小値と最大値を設定できます。
OpenCV の putText()
関数を使用して、画像上のブロブの数を表示することもできます。
たとえば、凸面と慣性の値を設定し、特定の画像の上で検出されたブロブの数を表示しましょう。以下のコードを参照してください。
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
params.filterByCircularity = True
params.minCircularity = 0.9
params.filterByConvexity = True
params.minConvexity = 0.2
params.filterByInertia = True
params.minInertiaRatio = 0.01
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
number_of_blobs = len(keypoints)
text = "Circular Blobs: " + str(len(keypoints))
cv2.putText(blobs, text, (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
cv2.imshow("Original Image", image)
cv2.imshow("Circular Blobs Only", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
出力:
テキストの位置、フォントファミリ、フォントスケール、色、線の太さも設定できます。比較のため、左側に元の画像も示しています。
filterByColor
引数を true に設定することで、色に応じて blob をフィルタリングすることもできます。次に、minThreshold
と maxThreshold
を使用して、検出する色のこれらの最小しきい値と最大しきい値を設定できます。
指定されたしきい値よりも小さいまたは大きい色の値を持つブロブは検出されません。SimpleBlobDetector
クラスのパラメータを変更することで、他の形状を検出することもできます。
たとえば、上記の例では円形のブロブを検出しましたが、長方形のブロブのような他の形状のブロブも検出できます。
SimpleBlobDetector
クラスのパラメータの詳細については、このリンクをクリックしてください。
関連記事 - Python OpenCV
- OpenCV ArUco マーカー
- OpenCV しきい値
- OpenCV でのイメージ マスキング
- OpenCV パッケージ構成
- OpenCV を使用してイメージで Bitwise_AND を利用する
- Python で OpenCV を使用した SIFT