【问题标题】:OpenCV - SimpleBlobDetector - Issues with area thresholdingOpenCV - SimpleBlobDetector - 面积阈值问题
【发布时间】:2020-01-24 02:08:56
【问题描述】:

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

但是,当 minArea 增加到 > 200 时。该算法将非 blob 区域返回为 blob。请查看下图,观察蓝色圈出的区域。

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

【问题讨论】:

  • 您能否添加您的原始输入图像和预期的输出结果?
  • @nathancy 上面的图片是原始的,但是有斑点。
  • 你的图片上有蓝色的图画和红色的圆圈,它们不是原始的
  • 不,它会从多个黑色区域生成一个斑点。在斑点检测之前对图像进行腐蚀。它会移除那些黑色的小像素。

标签: opencv image-processing blob


【解决方案1】:

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

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

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

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

  2. 那么我们就可以对第一步得到的二值图像使用cv2.findContours()方法了。

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

  4. 从第 3 步开始,我们将获得面积大于定义阈值的轮廓列表。现在您可以围绕该轮廓画圆,或者使用cv2.drawContours 方法简单地绘制轮廓。

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多