在OpenCV中检测二进制blob

时间:2018-05-29 15:38:03

标签: python opencv

我的图像中有一些彩色矩形,我通过HSV阈值处理成功识别。结果如下: mask image

现在我想将大斑点视为一点。我尝试使用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)

这是结果和原始图片的样子: keypoints and original

我希望有一个红点位于绿点的中心。

我该如何解决这个问题?非常感谢帮助。

编辑:我忘了提到:是否真的有必要在cv2.SimpleBlobDetector()生成多个二进制图像,因为我已经有二进制图像作为输入?可以将值更改为以下内容:

params.minThreshold = 127
params.maxThreshold = 127

通过生成二进制图像来减少不必要的CPU使用?

EDIT2 :请注意我使用的是OpenCV 2,而不是3

谢谢。

1 个答案:

答案 0 :(得分:2)

使用cv2.SimpleBlobDetector()时,它会查找颜色较深的斑点。在您的情况下,mask中的矩形为白色,而图像的其余部分为暗。因此,它无法为自定义参数集找到任何blob。

我刚刚对现有代码进行了一些更改:

  1. 将遮罩读取为灰度图像而非彩色图像:
  2. mask = cv2.imread('mask.png', 0)

    1. mask转换为二进制图像,矩形以黑色突出显示:
    2. ret, mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY_INV)

      从这里开始使用您的代码给出了您期望的以下结果。

      结果:

      enter image description here