我有这张图片:
在这里,我有一张绿色背景上的图像,其中有一个用红线标记的区域。我想相对于图像计算标记部分的面积。
我正在裁剪图像以去除绿色背景并计算裁剪后的图像的面积。从这里我不知道如何进行。
我注意到Contour可以用于此,但是问题是在这种情况下如何绘制轮廓。
我想如果我可以创建轮廓并用某种颜色填充标记的区域,则可以从整个(裁剪的)图像中减去它,并获得两个区域。
最佳答案
在您的链接中,他们将threshold
方法与参数中的颜色一起使用。基本上,它将源图像获取,并将所有大于此值的像素设置为白色,否则将其设置为黑色(这意味着您的源图像需要是灰度图像)。此阈值使您可以“填充标记区域”,以便进行轮廓检测。
但是,我认为您应该尝试在裁剪后的图片上使用inRange
方法。它与threshold
几乎相同,但是没有一个阈值,而是有一个最小和最大边界。如果像素在边界给定的颜色范围内,则它将设置为白色。如果不是,则将其设置为黑色。我不知道这是否行得通,但是,如果您尝试隔离范围内的“最绿色”颜色,则可能会在右上方显示大的白色区域。
然后,在二值化图像上应用findContours
方法。它会为您提供找到的所有轮廓,因此,如果图像中其他位置上有小的白点也没关系,则只需选择该方法找到的最大轮廓。
请注意,如果inRange
的范围不合适,则您应该在右上角找到的白色大区域可能包含一些噪音,并且可能会干扰轮廓检测。为避免这种情况,您可以使图像模糊,并进行侵 eclipse /膨胀之类的处理。这样,您可能会得到更好的检测。
编辑
我将在此处添加一些代码,但不能按原样使用。就像我说的那样,我对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。 希望这可以帮助!
关于python - 如何在SimpleCV或opencv中计算边界内的标记区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036165/