我有这张图片:
这里我在绿色背景上有一个图像,并且在其中标有红线的区域。我想计算相对于图像标记部分的面积。
我正在裁剪图像以移除绿色背景并计算裁剪图像的区域。从这里我不知道如何继续。
我注意到Contour可用于此,但问题是如何在这种情况下绘制轮廓。
我想如果我可以创建轮廓并用一些颜色填充标记区域,我可以从整个(裁剪)图像中减去它并获得两个区域。
答案 0 :(得分:1)
在您的链接中,他们使用方法threshold
并在参数中添加颜色。基本上它将您的源图像设置为白色,所有像素都大于此值,否则设置为黑色(这意味着您的源图像需要是灰度图像)。此阈值使您能够“填充标记区域”以便进行轮廓检测。
但是,我认为您应该尝试在裁剪的图片上使用inRange
方法。它与threshold
几乎相同,但不是有一个阈值,而是有最小和最大边界。如果您的像素位于边界给定的颜色范围内,则它将设置为白色。如果不是,那么它将被设置为黑色。我不知道这是否有效,但是如果你试图隔离你范围内的“最绿”颜色,那么你可能会在右上方看到你的大白区。
然后在二值化图像上应用方法findContours
。它将为您提供所有轮廓,因此如果图像中其他位置有小白点,则无关紧要,您只需选择该方法找到的最大轮廓。
请注意,如果inRange
的范围不合适,您应该在右上方找到的大白区可能包含一些噪音,并且可能会弄乱轮廓的检测。为了避免这种情况,你可以模糊你的图像并做一些像侵蚀/扩张的东西。通过这种方式,您可以获得更好的检测效果。
修改强>
我会在这里添加一些代码,但不能按原样使用。正如我所说的,我对Python一无所知,所以我所能做的就是为你提供OpenCV方法以及要提供的参数。
让我们回顾一下这些步骤:
inRange
对图像进行二值化。您需要找到最小和最大边界的适当值。你想要做的是隔离绿色,因为它主要是构成轮廓内部区域的颜色。我找不到比试错更好的东西来找到最好的门槛。让我们从那些最小值和最大值开始:(0,125,0)和(255,250,255) inRange(source_image, Scalar(0, 125, 0), Scalar(255, 250, 255), binarized_image)
imshow
imshow("bin", binarized_image)
如果二进制化正常(您可以检测到您想要的区域),请应用findContours
。对不起,我不理解教程和文档中使用的语法,但这里有参数:
binarized_mat
:您的二值化图片contours
:Point
数组的数组,其中包含检测到的所有轮廓。每个轮廓都存储为一个点阵列。mode
:你可以选择你想要的任何东西,但我建议你使用RETR_EXTERNAL。获取最大尺寸的数组,因为它可能是点数最多的轮廓(当时最大的点)。
计算
希望这有帮助!