OpenCV 斑點或圓形檢測

Ammar Ali 2022年5月17日
OpenCV 斑點或圓形檢測

本教程將討論在 Python 中使用 OpenCV 的 SimpleBlobDetector 類檢測影象中的斑點或圓圈。

在 Python 中使用 OpenCV 的 SimpleBlobDetector 類檢測影象中的斑點或圓圈

我們可以使用 OpenCV 的 SimpleBlobDetector 類檢測影象中的斑點或圓圈。我們可以使用面積、圓度、凸度和慣性來檢測斑點或圓。

如果我們想檢測落在特定區域內的斑點或圓圈,我們必須將 filterByArea 引數設定為 true。然後我們可以使用 minArea 引數設定 blob 的最小面積,使用 maxArea 引數設定 blob 的最大面積。

它不會檢測小於或大於指定區域的斑點。我們可以使用 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()

輸出:

Blob 使用區域

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

輸出:

blob 使用面積和圓度

如你所見,在上述輸出中僅檢測到圓形斑點。

在 Python 中設定 filterByConvexity 以過濾影象中的斑點或圓圈

我們還可以使用凸度過濾 blob。首先,我們必須將 filterByConvexity 引數設定為 true,然後我們可以使用 minConvexitymaxConvexity 來設定凸度的最小值和最大值。

一個橢圓也是一個圓,也會和一個正圓一起被檢測到。我們可以使用 filterInertia 引數來使用形狀的慣性過濾 blob。

對於正圓,慣性為 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 來設定我們想要檢測的顏色的這些最小和最大閾值。

它不會檢測顏色值小於或大於指定閾值的 blob。我們還可以通過更改 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