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()
輸出:
在 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
以過濾影象中的斑點或圓圈
我們還可以使用凸度過濾 blob。首先,我們必須將 filterByConvexity
引數設定為 true,然後我們可以使用 minConvexity
和 maxConvexity
來設定凸度的最小值和最大值。
一個橢圓也是一個圓,也會和一個正圓一起被檢測到。我們可以使用 filterInertia
引數來使用形狀的慣性過濾 blob。
對於正圓,慣性為 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
來設定我們想要檢測的顏色的這些最小和最大閾值。
它不會檢測顏色值小於或大於指定閾值的 blob。我們還可以通過更改 SimpleBlobDetector
類的引數來檢測其他形狀。
例如,我們在上面的示例中檢測到圓形斑點,但我們也可以檢測其他形狀的斑點,例如矩形斑點。
單擊此連結瞭解有關 SimpleBlobDetector
類的引數的更多詳細資訊。
相關文章 - Python OpenCV
- OpenCV sobel() 函式
- Python 中 OpenCV 的 GUI 特性
- 在 Python 中使用 OpenCV 的 HSV 顏色空間
- 在 Python 中使用 OpenCV 建立二維碼掃描器
- OpenCV 中的模糊濾鏡
- 使用 OpenCV 進行物件跟蹤