【问题标题】:Detecting binary blobs in OpenCV在 OpenCV 中检测二进制 blob
【发布时间】:2018-05-30 15:08:39
【问题描述】:

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

现在我想将大斑点检测为一个点。我用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

谢谢。

【问题讨论】:

    标签: python opencv


    【解决方案1】:

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

    我只是对现有代码做了一些更改:

    1. 将蒙版读取为灰度图像而非彩色图像:

    mask = cv2.imread('mask.png', 0)

    1. mask 转换为二值图像,矩形以深色突出显示:

    ret, mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY_INV)

    使用您的代码从这里开始,得到了您所期望的以下结果。

    结果:

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多