OpenCV 斑點或圓形檢測

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 類的引數的更多詳細資訊。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
作者: 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