从canny边缘检测中提取线条

时间:2012-06-05 07:58:34

标签: opencv edge-detection

在应用canny边缘检测后的openCV中,我想进一步处理结果(仅显示水平线,删除短线等)。但是canny的结果只是另一个形象。我想获得一系列描述检测到的边缘的线

我知道着名的Hough Line Transform,但结果并不总是好的,这就是我想手动处理精简结果的原因。 输入:

enter image description here

仅输出canny:

enter image description here

输出canny然后Hough线变换

enter image description here

这是用于检测楼梯边缘的霍夫线变换结果(红线)。尽管canny边缘检测到边缘,但未正确检测到下面的第4行。

知道如何从精确图像中提取边缘吗?

2 个答案:

答案 0 :(得分:14)

您可以尝试改善结果的一些事项:

申请感兴趣区域

您的图片看起来有一些边界窗口效果。我用一个感兴趣的区域删除它们,得到一个看起来像这样的图像(我调整它直到看起来正确,但如果你使用某种内核操作符,它的窗口大小可能更好地定义了这个ROI):

enter image description here

使用标准Hough变换

你似乎也在使用概率Hough变换。因此,您只获得线段而不是插值线。考虑使用标准变换来获得完整的理论线(rho,theta)。这样做我得到的图像如下所示:

enter image description here

这是我用来生成行的代码片段(来自Python界面):

(mu, sigma) = cv2.meanStdDev(stairs8u)
edges = cv2.Canny(stairs8u, mu - sigma, mu + sigma)
lines = cv2.HoughLines(edges, 1, pi / 180, 70)

根据角度

过滤行

您可以通过拍摄最常出现的线角度并丢弃异常值来过滤掉不良线条。这应该缩小到最明显的步骤。

希望有所帮助!

答案 1 :(得分:7)

我建议使用LSWMS(使用加权平均移位的线段检测)方法。 它的结果优于HT和PPHT。

请参阅 http://marcosnietoblog.wordpress.com/2012/04/28/line-segment-detection-opencv-c-source-codehttp://www.youtube.com/watch?v=YYeX8IGOAxw