【问题标题】:How to calculate a marked area within boundary in SimpleCV or opencv如何在 SimpleCV 或 opencv 中计算边界内的标记区域
【发布时间】:2016-12-08 09:40:57
【问题描述】:

我有这张图片:

这里有一个绿色背景的图像和一个用红线标记的区域。我想计算标记部分相对于图像的面积。

我正在裁剪图像以移除绿色背景并计算裁剪图像的面积。从这里我不知道如何继续。

我注意到Contour 可以用于此,但问题是在这种情况下如何绘制轮廓。

我想如果我可以创建轮廓并用一些颜色填充标记区域,我可以从整个(裁剪)图像中减去它并获得两个区域。

【问题讨论】:

    标签: python opencv image-processing simplecv opencv-contour


    【解决方案1】:

    在您的链接中,他们使用threshold 方法和参数中的颜色。基本上,它采用您的源图像并将所有大于该值的像素设置为白色,否则为黑色(这意味着您的源图像需要是灰度图像)。该阈值使您能够“填充标记区域”以进行轮廓检测。

    但是,我认为您应该尝试在裁剪后的图片上使用inRange 方法。它与threshold 几乎相同,但不是有一个阈值,而是有一个最小和一个最大边界。如果您的像素在边界给定的颜色范围内,那么它将被设置为白色。如果不是,则将其设置为黑色。我不知道这是否可行,但如果您尝试在您的范围内隔离“最绿色”的颜色,那么您可能会在右上角看到大的白色区域。

    然后您将方法findContours 应用于您的二值化图像。它会给你它找到的所有轮廓,所以如果你在图像的其他地方有小白点也没关系,你只需要选择该方法找到的最大轮廓。

    请注意,如果inRange 的范围不合适,您应该在右上角找到的大白色区域可能包含一些噪音,并且可能会干扰轮廓检测。为避免这种情况,您可以模糊您的图像并执行一些操作,例如腐蚀/膨胀。这样您可能会得到更好的检测。


    编辑

    我将在此处添加一些代码,但不能按原样使用。正如我所说,我对 Python 一无所知,所以我能做的就是为您提供 OpenCV 方法和要提供的参数。

    让我们也回顾一下步骤:

    1. 使用inRange 对图像进行二值化。您需要为最小和最大边界找到合适的值。您在这里要做的是隔离绿色,因为它主要构成轮廓内的区域。我真的不能向您建议比反复试验更好的方法来找到最佳阈值。让我们从最小值和最大值开始:(0, 125, 0) 和 (255, 250, 255)

    inRange(source_image, Scalar(0, 125, 0), Scalar(255, 250, 255), binarized_image)

    1. imshow检查你的结果

    imshow("bin", binarized_image)

    1. 如果你的二值化没问题(你可以很好地检测到你想要的区域),请申请findContours。很抱歉,我不理解您的教程和文档中使用的语法,但这里是参数:

      • binarized_mat: 你的二值化图片
      • contoursPoint 的数组数组,将包含检测到的所有轮廓。每个轮廓都存储为一个点数组。
      • mode:你可以选择任何你想要的,但我建议你使用 RETR_EXTERNAL。
    2. 获取最大尺寸的数组,因为它可能是点数最多的轮廓(当时最大)。

    3. 计算里面的面积

    希望这会有所帮助!

    【讨论】:

    • 感谢您的帮助。非常欣赏它。我刚刚开始,所以一些代码会很棒。
    • 我完全没有 Python 方面的经验,所以我无法帮助你:/。我能做的就是在计算机视觉/OpenCV 部分为您提供帮助。
    • @neon 我用一些代码编辑了我的答案,但很抱歉我无法为您提供更多信息
    • @neon 有很多关于 opencv 的教程和书籍。大部分都可以在互联网上免费获得。
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2016-07-12
    • 2014-07-17
    • 2019-08-06
    • 2016-10-08
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多