OpenCV-SimpleBlobDetector-区域阈值问题

问题描述 投票:0回答:1

我正在使用OpenCV-SimpleBlobDetector检测二进制图像中的斑点(黑色)。当minArea设置为较低的值(50到100)时,算法将返回大多数预期的Blob。如下图所示(观察以蓝色圈出的区域):

enter image description here

但是,当minArea增大到> 200时,该算法将非斑点区域作为斑点返回。请检查下图,观察蓝色圆圈区域。

我的问题:算法是否将白色区域作为斑点返回? (我不这么认为)。我已经将filterByColorfilterByConvexity都设置为false。您能否解释一下为什么返回蓝色圆圈内的那两个斑点。谢谢。

enter image description here

opencv image-processing blob
1个回答
0
投票

在这种情况下,您需要简单的轮廓检测而不是斑点检测。因为斑点检测还尝试将附近的较小轮廓进行分组以形成斑点。因此,我们在这里有两个选择:

  • 调整Blob检测参数以禁用较小的合并轮廓。
  • 使用简单的轮廓检测并使用cv2.contourArea

在这种情况下,我更喜欢第二种方法,因为在这种情况下使用Blob检测器只会增加复杂性(在引擎盖下还会发生多个阈值运算以及其他合并例程)。我们可以按照以下步骤过滤轮廓(斑点):

  1. 图像的反阈值,因为通常要检测的轮廓应该具有255灰度强度,但是在您的输入图像中,轮廓是黑色的(0灰度值)。

  2. 然后,我们可以对步骤1中获得的二进制图像使用cv2.findContours()方法。

  3. 从第2步中,您将获得轮廓列表。现在我们可以使用cv2.contourArea()迭代列表并过滤出较小的轮廓。

  4. 从第3步开始,我们将得到一个轮廓列表,这些轮廓的面积大于定义的阈值。现在,您可以围绕该轮廓绘制圆,或仅使用cv2.drawContours方法绘制轮廓。

© www.soinside.com 2019 - 2024. All rights reserved.