在您的链接中,他们使用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。
获取最大尺寸的数组,因为它可能是点数最多的轮廓(当时最大)。
计算里面的面积
希望这会有所帮助!