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

时间:2013-05-21 08:48:37

标签: opencv image-processing feature-detection edge-detection hough-transform

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

到目前为止我的方法:

  1. 从网络摄像头抓取图像(显然会变成灰度)
  2. 通过阈值过滤器运行它(使用THRESH_TO_ZERO模式,将零值低于阈值的任何像素)。
  3. 模糊图片
  4. 穿过侵蚀过滤器
  5. 通过Canny边缘检测器
  6. 运行它
  7. 最后,拍摄此处理过的图像并使用概率Hough变换HoughLinesP找到线条
  8. 我应该更改过滤器的顺序吗?

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

    此外,这是一个示例图像: original image

    我得到的结果: 与canny with canny 没有canny(略微调整参数) no canny this time

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

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

5 个答案:

答案 0 :(得分:14)

我会尝试使用图片的skeleton representation。你的canny的问题在于,由于线条的宽度,它基本上会产生两条线。

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

如果你想要粗线,你应该在拉普拉斯之后尝试Sobel operator,最后是PHT。如果你的形象过于多管闲事,可能会变得更糟。

答案 3 :(得分:0)

RANSAC算法可能是一个很好的方法。此方法类似于regressioninterpolation方法。您应该在使用edge detection之后提取积分(我认为这个目标的最佳方法是canny)。那你应该找到最好的路线。为了找到通过几个点的线,有不同的方法,如线性回归或RANSAC。您可以在this link中找到有关RANSAC算法的实施和说明。

请注意,RANSAC和此目标的另一个有用算法是already implemented OpenCV(正如我在3.2版中所知)和Accord NET(用于图像处理的免费库) )。

答案 4 :(得分:0)

根据您的上一个结果(在骨架过滤器之后),您会获得许多小段。我认为你在这一点上处于非常好的位置,以实现本文所做的工作:

http://www.cs.ubc.ca/~lowe/papers/aij87.pdf

基本上,它们提供的工具可以根据图像属于同一对象的可能性重新组合图像中的不同要素。因此,您所要做的就是将结果提供给他们的算法,结果您可能会得到一行。