我有这张图片:
在这里,我有一个绿色背景的图像和一个用红线标记的区域。我想计算标记部分相对于图像的面积。
我正在裁剪图像以移除绿色背景并计算裁剪图像的面积。从这里我不知道如何进行。
我注意到Contour可以用于此,但问题是在这种情况下如何绘制轮廓。
我想如果我可以创建轮廓并用一些颜色填充标记区域,我可以从整个(裁剪)图像中减去它并获得两个区域。
我有这张图片:
在这里,我有一个绿色背景的图像和一个用红线标记的区域。我想计算标记部分相对于图像的面积。
我正在裁剪图像以移除绿色背景并计算裁剪图像的面积。从这里我不知道如何进行。
我注意到Contour可以用于此,但问题是在这种情况下如何绘制轮廓。
我想如果我可以创建轮廓并用一些颜色填充标记区域,我可以从整个(裁剪)图像中减去它并获得两个区域。
在您的链接中,他们使用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 在你的情况下。获取最大尺寸的数组,因为它可能是点数最多的轮廓(当时最大的)。
计算里面的面积
希望这可以帮助!