【问题标题】:Simple blob detector does not detect blobs简单的 blob 检测器不检测 blob
【发布时间】:2018-10-30 12:41:23
【问题描述】:

我正在尝试使用here 中描述的简单 blob 检测器,但是我破解的一个最简单的可能代码似乎没有产生任何结果:

img = cv2.imread("detect.png")
detector = cv2.SimpleBlobDetector_create()
keypoints = detector.detect(img)

此代码产生空的keypoints 数组:

[]

我试图检测其中的斑点的图像是:

我预计至少会检测到 2 个斑点 - 根据文档 simpleblobdetector 检测到深色斑点并且图像确实包含其中 2 个。

我知道这可能是我在这里遗漏的令人尴尬的简单事情,但我似乎无法弄清楚它是什么。我的疯狂猜测是,它必须与 blob 的圆形度有关,但尝试各种过滤器参数我似乎无法找出正确的圆形度参数。

更新: 根据下面的评论,建议我应该反转我的图像,尽管文档建议(除非我误读它),我试图反转它并再次运行示例:

img = cv2.imread("detect.png")
img = cv2.bitwise_not(img)
detector = cv2.SimpleBlobDetector_create()
keypoints = detector.detect(img)

但是,我怀疑这会给出相同的结果 - 没有检测到:

[]

【问题讨论】:

  • 你需要黑色背景上的白色斑点,反转你的图像
  • 正如我所说,文档中说:Default values of parameters are tuned to extract dark circular blobs.我误读了这个吗?

标签: opencv


【解决方案1】:

问题在于参数 :) 并且底部 blob 太靠近边界...

你可以看看这个github link中的默认参数。 this link 末尾有一个有趣的图表,您可以在其中检查不同参数将如何影响结果。

基本上你可以看到默认情况下它是按惯性、面积和凸度过滤的。现在,如果您删除凸性和惯性过滤器,它将标记顶部的过滤器。如果您删除区域过滤器,它仍然只会显示顶部斑点......底部的主要问题是它太靠近边界......并且似乎不是检测器的“斑点”。 .. 但是如果给图像添加一个小边框,它就会出现。这是我使用的代码:

import cv2
import numpy as np
img = cv2.imread('blob.png');
# create the small border around the image, just bottom
img=cv2.copyMakeBorder(img, top=0, bottom=1, left=0, right=0, borderType= cv2.BORDER_CONSTANT, value=[255,255,255] ) 

# create the params and deactivate the 3 filters
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = False
params.filterByInertia = False
params.filterByConvexity = False

# detect the blobs
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(img)

# display them
img_with_keypoints = cv2.drawKeypoints(img, keypoints, outImage=np.array([]), color=(0, 0, 255),flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Frame", img_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

以及生成的图像:

是的,您可以在不停用过滤器的情况下获得类似的结果,而只需更改过滤器的参数。例如,这些参数的结果完全相同:

params = cv2.SimpleBlobDetector_Params()
params.maxArea = 100000
params.minInertiaRatio = 0.05
params.minConvexity = .60
detector = cv2.SimpleBlobDetector_create(params)

这在很大程度上取决于手头的任务以及您要检测的内容。然后使用每个过滤器的最小/最大值。

【讨论】:

  • 谢谢!我怀疑这些参数会“责备”:-)
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 2019-11-21
  • 1970-01-01
  • 2011-10-16
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多