我的图像中有一些彩色矩形,我通过 HSV 阈值处理成功识别了这些矩形。结果如下:
现在我想将大 Blob 检测为一个点。我尝试使用 cv2.SimpleBlobDetector()
和自定义参数:
import cv2
import numpy as np
mask = cv2.imread('mask.png')
original = cv2.imread('original.png')
params = cv2.SimpleBlobDetector_Params()
# thresholds
params.minThreshold = 10
params.maxThreshold = 200
#params.thresholdStep = 20
# filter by area
params.filterByArea = True
params.minArea = 1
params.maxArea = 10000
# filter by circularity
params.filterByCircularity = False
# filter by convexity
params.filterByConvexity = False
# filter by inertia
params.filterByInertia = False
detector = cv2.SimpleBlobDetector(params)
keypoints = detector.detect(mask)
img_keypoints = cv2.drawKeypoints(original, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite('keypoints.png', img_keypoints)
我希望红点位于绿点的中心。
我该如何解决这个问题?非常感谢您的帮助。
编辑:我忘了提及:因为我已经有一个二进制图像作为输入,所以真的有必要在 cv2.SimpleBlobDetector()
中生成多个二进制图像吗?将值更改为以下内容是否可以:
params.minThreshold = 127
params.maxThreshold = 127
通过生成二进制图像来减少不必要的CPU使用?
EDIT2:请注意,我使用的是 OpenCV 2,而不是 3
谢谢。
最佳答案
当使用cv2.SimpleBlobDetector()
时,它会查找颜色较深的 Blob 。在您的情况下,mask
中的矩形为白色,而图像的其余部分为黑色。因此,它无法找到自定义参数集的任何 blob。
我刚刚对现有代码做了一些更改:
- 将蒙版读取为灰度图像而不是彩色图像:
mask = cv2.imread('mask.png', 0)
- 将
mask
转换为二进制图像,其中矩形以黑色突出显示:
ret, mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY_INV)
从这里开始使用您的代码给出了您预期的以下结果。
结果:
关于python - 在 OpenCV 中检测二进制 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50588175/