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

时间:2012-02-21 09:07:26

标签: image-processing opencv computer-vision

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

Original picture

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

Canny edge detection

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

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

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

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

我不能偏向于对我有利的图片(即黑掉土壤等),因为可能需要处理数以千计的植物

总结我的问题:

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

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

更新(基于Jeff7评论):

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

mean shift color segmentation

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

Contours

4 个答案:

答案 0 :(得分:3)

由于您可以很好地控制拍摄图像的条件,因此偏见对您有利。当您想捕捉图像时,用黑卡制作一个面具以放置在植物根部周围。您的问题减少为在黑色背景下发现绿色像素之一。由于您还可以控制相机在工厂位置的位置,因此您应该能够安排像素/毫米比率在您的一系列图像中保持不变的事项。叶面积是计算像素的简单问题。

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

评论后编辑......

嗯,你的问题包括声明'对于这个项目我正在种植一个特定的植物',现在你想要处理成千上万的该死的东西。我仍然追求偏向于你的形象的可能性。例如,如果您发布的图像背景中没有绿色塑料,那么您可能通过图像的绿色通道上的简单阈值处理可以将图像分离,具有良好的准确度。 。因此,摆脱绿色背景,并在成像前浇水土壤,以增加它的黑度。

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

进一步编辑

好的,所以你不能偏袒场景对你有利。你有没有想过在相机上使用滤镜只允许绿灯?还是照明使绿色物体比非绿色物体更亮?我对这一个没有想法......

最终编辑

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

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

答案 1 :(得分:3)

看看均值漂移颜色分割(样本目录中包含OpenCV的示例)。您可以使用它将图像分成2个类别(植物和土壤),并使用它来进一步处理数据。

对于测量,您可能希望最初忽略遮挡效果和相机校准,只需查看图像中作为植物类的区域部分。

如果您想要测量单个叶子,可以采用“跟踪”方法,使用时间信息以及图像中的空间信息。时间信息可以是先前图像中叶子的位置和大小。可能有很多技巧你可以应用,但如果我是你,我会开始简单,看看你能走多远。

答案 2 :(得分:0)

PlantCV指出,您对设置的控制越多,您在软件中的工作就越少 如果您控制播种位置(而不是仅仅将它们散布在托盘上),您可以掩盖幼苗周围并消除背景杂乱。这对于处理单个植物以及在不同图像中找到相同植物也是一个重要的帮助。重叠植物将导致一种不可能的情况,无论是将种子和发芽分散在彼此之间,还是当它们超过间距的大小时。您必须决定是否种植最佳观察或最佳生长。两者不相互兼容。 根据我的经验,使用color(cv2.inRange)作为主要步骤是正确的,然后继续进行Canny边缘检测。从那里,你可以得到轮廓。 我猜你正在使用Arabadopsis,所以你可能会寻找一个圆形图案来计算叶子(不适用于生菜)。一旦分离了植物并具有(外部)轮廓,就可以使用cv2.contourArea和cv2.minAreaRectangle来获得一些基本指标。 这是我正在工作的路线。

答案 3 :(得分:0)

这是一个活跃的研究领域。我推荐以下文件:

PlantCV有一些用于分割距离变换和流域的叶子的设施,我想补充更多。请参阅我们的preprint,其修订版将很快在PeerJ上发布。