检测图像中线条的好方法?

Cas*_*hew 27 opencv image-processing edge-detection feature-detection hough-transform

我写了一些代码,使用OpenCV库来检测草地上画的白线.我需要某人对我使用的方法的看法(因为我确信有比我更好的方法).此外,我得到的结果不如我预期的好,因为图像中的微小变化需要调整参数(我需要对固定参数进行操作).

到目前为止我的方法:

  1. 从网络摄像头抓取图像(显然变成灰度)
  2. 通过阈值过滤器运行它(使用THRESH_TO_ZERO模式,它将任何像素都归零阈值以下).
  3. 模糊图像
  4. 通过侵蚀过滤器运行它
  5. 通过Canny边缘探测器运行它
  6. 最后,拍摄此处理后的图像并使用概率Hough变换HoughLinesP查找线条

我应该更改过滤器的顺序吗?

PS我不太关心处理能力; 我正在GPU B上运行HoughLinesP-)

另外,这是一个示例图像: 原始图像

我得到的结果:与canny 与canny 没有canny(略微调整参数) 这次没精算

任何帮助或指导将不胜感激!我只是不知道如何改进它!

更新 根据所选答案使用非常快速的骨架实现(使用TONS of blur)后,我得到了: 有用!

Jon*_*rin 17

我会尝试使用图像的骨架表示.你的canny的问题在于,由于线条的宽度,它基本上会产生两条线.

然后我会对它应用Hough变换.

  • 天哪,这正是我需要的!太棒了!事实证明,当我需要一些额外的步骤来获得骨架时,我只是应用了侵蚀过滤器!现在,我得到了完美的线段。我需要做的就是弄清楚如何将它们连接成一行......非常感谢!:D (2认同)

Zap*_*hod 5

一种可能的解决方案是获取从canny边缘检测获得的所有边缘点,并在这些点上使用线性最小平方(可能是迭代)拟合线.这样,您总能得到一条"最适合"边缘点的线.这种方法几乎没有涉及参数化.


Elo*_*lod 5

我将 Canny 用于室内图像,但对于室外,我发现拉普拉斯滤波器和 Sobel 滤波器比应用概率霍夫线变换 (PHT) 更合适。

如果你想加粗你的线条,你应该在拉普拉斯之后尝试Sobel 算子,最后是 PHT。如果你的形象太八卦,它可能会变得更糟。