0

我有这张图片:

图片

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

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

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

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

4

1 回答 1

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:您的二值化图像
    • contours:一个数组,Point其中包含所有检测到的轮廓。每个轮廓都存储为一个点数组。
    • mode:你可以选择任何你想要的,但我会建议 RETR_EXTERNAL 在你的情况下。
  2. 获取最大尺寸的数组,因为它可能是点数最多的轮廓(当时最大的)。

  3. 计算里面的面积

希望这可以帮助!

于 2016-12-08T11:28:21.337 回答