我正在使用OpenCV-SimpleBlobDetector检测二进制图像中的斑点(黑色)。当minArea设置为较低的值(50到100)时,算法将返回大多数预期的Blob。如下图所示(观察以蓝色圈出的区域):
但是,当minArea增大到> 200时,该算法将非斑点区域作为斑点返回。请检查下图,观察蓝色圆圈区域。
我的问题:算法是否将白色区域作为斑点返回? (我不这么认为)。我已经将filterByColor和filterByConvexity都设置为false。您能否解释一下为什么返回蓝色圆圈内的那两个斑点。谢谢。
在这种情况下,您需要简单的轮廓检测而不是斑点检测。因为斑点检测还尝试将附近的较小轮廓进行分组以形成斑点。因此,我们在这里有两个选择:
cv2.contourArea
。在这种情况下,我更喜欢第二种方法,因为在这种情况下使用Blob检测器只会增加复杂性(在引擎盖下还会发生多个阈值运算以及其他合并例程)。我们可以按照以下步骤过滤轮廓(斑点):
图像的反阈值,因为通常要检测的轮廓应该具有255
灰度强度,但是在您的输入图像中,轮廓是黑色的(0
灰度值)。
然后,我们可以对步骤1中获得的二进制图像使用cv2.findContours()
方法。
从第2步中,您将获得轮廓列表。现在我们可以使用cv2.contourArea()
迭代列表并过滤出较小的轮廓。
从第3步开始,我们将得到一个轮廓列表,这些轮廓的面积大于定义的阈值。现在,您可以围绕该轮廓绘制圆,或仅使用cv2.drawContours
方法绘制轮廓。