在opencv中检测叶状形状的最佳方法

Ümi*_*mit 12 opencv image-processing computer-vision

我开始使用OpenCV来处理我正在进行的项目.
对于这个项目,我正在种植盆栽植物.不同发育阶段的静态图片取自上方(见下图).

原始图片

目标是在不同的发育阶段检测并最终测量(即大小)生长植物的叶子.
我尝试了一种使用Canny边缘检测的天真方法,但它不能很好地工作(见下图),因为它还检测土壤中的小边缘(无论我使用何种阈值).

Canny边缘检测

我认为更好的方法是首先按颜色分割图像,然后使用一些边缘检测算法来检测叶子.
有没有更好的方法呢?

叶结构事先已知.我可以使用机器学习/分类算法来获得更好的结果吗?

我还没有想过如何测量叶子的大小?是否有测量尺寸和其他描述符的常见模式?(可能在图片中有一个已知大小的参考对象?).

最后,我还必须在某种程度上处理遮挡.这在图片中不可见,但在后期开发阶段,我可能不得不处理重叠的叶子.有没有办法解决这个问题?

我不能偏向于对我有利的图片(即弄脏土壤等),因为可能有数以千计的植物需要加工.

总结一下我的问题:

  • 检测土壤中叶子的最佳方法是什么(见图)?
  • 机器学习算法能改进检测吗?
  • 如何测量叶子的大小?
  • 如何处理遮挡/重叠叶片?

我会非常感谢一些指示或想法.

更新(基于Jeff7评论):

我首先使用泛光填充算法运行均值移位颜色分割,最后得到了这张图:

平均移位颜色分割

当我现在在该图片上运行canny边缘检测+ findcontours时,结果会更好:

等高线

Hig*_*ark 3

由于您对拍摄图像的条件有很大的控制权,因此偏见对您有利。当您想要捕捉图像时,用黑卡制作一个遮罩,将其放置在植物根部周围。您的问题简化为在黑色背景下发现绿色像素的问题之一。由于您还可以根据植物的位置控制相机的位置,因此您应该能够进行安排,使像素/毫米比在一系列图像中保持恒定。叶子面积就是计算像素的简单问题。

这还没有解决遮挡问题。您可能可以通过拍摄另外 2 张图像,即植物在 2 个正交平面中的立面图(再次使用黑色背景)来了解植物的形状。

评论后编辑...

好吧,你的问题包括这样一句话:“对于这个项目,我在花盆里种植一种特定的植物”,现在你想要处理数千种该死的东西。我仍然会寻求使图像偏向于你的可能性。例如,如果您发布的图像背景中没有绿色塑料,那么您可能会得到一张可以通过对图像的绿色通道进行简单阈值处理而高精度分离的图片。因此,去掉绿色背景,并在成像前给土壤浇水以增加其黑度。

至于遮挡问题,您将需要比我最初建议更聪明的东西来处理数千种植物。也许您可以在每个阶段牺牲一些植物,测量“从头顶直接观察到的叶子面积”,然后撕下叶子,将它们分别排列在一张黑卡上,并得出总面积和可观察面积之间的经验关系。

进一步编辑

好吧,所以你不能让场景对你有利。您是否想过在相机上使用滤光片只允许绿光进入?或者照明使绿色物体比非绿色物体更亮?我对这个没有想法......

最终编辑

我已经没有主意了。我认为你原来的方法,使用颜色来区分叶子和背景,是好的。由于您知道叶子的结构,因此您可以尝试模板匹配,但是您可以仅通过计算像素来估计面积和长度(或面积和长度的差异)。您可能想要研究形态学操作(例如骨架化)以从图像中导出形状度量。您可能会在有关树叶遥感(等)的文献中找到有帮助的材料。

我的印象是,您在精神上致力于实现计算机视觉系统的目标,您的目标实际上是监控植物的发育,并且您的一些想法(例如边缘检测、机器学习)无助于实现达到你正确的目标。