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

标签 image-processing opencv computer-vision

我开始为我正在从事的项目使用 OpenCV。
对于这个项目,我在花盆里种植植物。上图为不同发育阶段的静态图片(见下图)。

Original picture

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

Canny edge detection

我认为更好的方法是先按颜色对图像进行分割,然后使用某种边缘检测算法来检测树叶。
有更好的方法吗?

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

我也没有想过如何测量叶子的大小?是否有任何用于测量大小和其他描述符的通用模式? (图片中可能有已知大小的引用对象?)。

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

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

总结一下我的问题:

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

如果能提供一些建议或想法,我将不胜感激。

更新(基于 Jeff7 评论):

我首先运行了均值偏移颜​​色分割和 floodfill 算法,最后得到了这张图片:

mean shift color segmentation

当我现在对该图片运行 canny 边缘检测 + findcontours 时,结果要好得多:

Contours

最佳答案

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

这还没有解决遮挡问题。您可能可以通过拍摄 2 张​​进一步的图像、植物在 2 个正交平面中的立面图(同样使用黑色背景)来了解植物的形状。

评论后编辑...

好吧,你的问题包括“对于这个项目,我在花盆里种了一种特定的植物”这样的陈述,现在你想处理成千上万的该死的东西。我仍然会寻求使图像偏向对您有利的可能性。例如,如果您发布的图像背景中没有绿色塑料,那么您可能会通过对图像的绿色 channel 进行简单的阈值处理来准确地分离出一张图片.因此,去除绿色背景,并在成像前给土壤浇水以增加其黑色度。

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

进一步编辑

好吧,所以你不能偏向对你有利的场景。你有没有想过在相机上使用滤镜来只接受绿光?或者使绿色物体比非绿色物体更亮的照明?我对这个没有想法......

最终编辑

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

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

关于image-processing - 在opencv中检测叶状形状的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9374747/

相关文章:

visual-c++ - MS Visual Studio 10上的OpenCV:cv::cvtColor导致找不到入口点错误消息

opencv - calcOpticalFlowPyrLK 水平和垂直流 u,v

python - 使用 Python OpenCV cv2.VideoCapture() 直接读取灰度视频帧

python - 在 Python 中将 3 个单独的 numpy 数组组合为 RGB 图像

python - 调整存储在数组中的所有图像的大小

matlab - MATLAB 中的霍夫变换

opencv - 使用 opencv 从眼睛玩具网络摄像头流式传输视频时出现 HIGHGUI 错误

c++ - OpenCV:为 HIT-MISS 创建方形结构元素

matlab - libSVM 输出 "Line search fails in two-class probability estimates"

delphi - 图像裁剪组件