OpenCV で Blob またはサークルの検出

Ammar Ali 2022年4月12日
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 に設定する必要があります。次に、minCircularitymaxCircularity を使用して、形状の最小および最大の真円度の値を設定できます。

指定された円形度よりも大きいまたは小さい円形度のブロブは検出されません。たとえば、上記の例で真円度を設定しましょう。以下のコードを参照してください。

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 に設定する必要があります。次に、minConvexitymaxConvexity を使用して、凸性の最小値と最大値を設定できます。

楕円も円であり、完全な円とともに検出されます。filterInertia 引数を使用して、形状の慣性を使用してブロブをフィルタリングできます。

完全な円の場合、慣性は 1 であり、楕円の場合、慣性は 0 から 1 の間です。minInertiaRatiomaxInertiaRatio を使用して、慣性の最小値と最大値を設定できます。

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()

出力:

すべてのフィルターを使用する blob

テキストの位置、フォントファミリ、フォントスケール、色、線の太さも設定できます。比較のため、左側に元の画像も示しています。

filterByColor 引数を true に設定することで、色に応じて blob をフィルタリングすることもできます。次に、minThresholdmaxThreshold を使用して、検出する色のこれらの最小しきい値と最大しきい値を設定できます。

指定されたしきい値よりも小さいまたは大きい色の値を持つブロブは検出されません。SimpleBlobDetector クラスのパラメータを変更することで、他の形状を検出することもできます。

たとえば、上記の例では円形のブロブを検出しましたが、長方形のブロブのような他の形状のブロブも検出できます。

SimpleBlobDetector クラスのパラメータの詳細については、このリンクをクリックしてください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - Python OpenCV

関連記事 - OpenCV Image