如何在SimpleCV或opencv中计算边界内的标记区域

时间:2016-12-08 09:40:57

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

我有这张图片:

Image

这里我在绿色背景上有一个图像,并且在其中标有红线的区域。我想计算相对于图像标记部分的面积。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

然后在二值化图像上应用方法findContours。它将为您提供所有轮廓,因此如果图像中其他位置有小白点,则无关紧要,您只需选择该方法找到的最大轮廓。

请注意,如果inRange的范围不合适,您应该在右上方找到的大白区可能包含一些噪音,并且可能会弄乱轮廓的检测。为了避免这种情况,你可以模糊你的图像并做一些像侵蚀/扩张的东西。通过这种方式,您可以获得更好的检测效果。

修改

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

让我们回顾一下这些步骤:

  1. 使用inRange对图像进行二值化。您需要找到最小和最大边界的适当值。你想要做的是隔离绿色,因为它主要是构成轮廓内部区域的颜色。我找不到比试错更好的东西来找到最好的门槛。让我们从那些最小值和最大值开始:(0,125,0)和(255,250,255)
  2. inRange(source_image, Scalar(0, 125, 0), Scalar(255, 250, 255), binarized_image)

    1. 使用imshow
    2. 检查结果

      imshow("bin", binarized_image)

      1. 如果二进制化正常(您可以检测到您想要的区域),请应用findContours。对不起,我不理解教程和文档中使用的语法,但这里有参数:

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

      3. 计算

      4. 中的区域

        希望这有帮助!