最近笔者学习霍夫线变换和LSD直线检测算法,有一些学习建议,希望可以给予大家一些帮助。
学习霍夫变换的感想
每个人理解的霍夫变换或许略有差异,但是最主要的是笛卡尔坐标系跟极坐标系的相互转换。
霍夫变换分为标准霍夫变换(SHT),多尺度霍夫变换(MSHT),累积概率霍夫变换(PPHT)。
标准霍夫变换(SHT),多尺度霍夫变换(MSHT)都由函数HoughLines调用,累积概率霍夫变换(PPHT)由HoughLinesP调用。
笛卡尔坐标和极坐标
笛卡尔坐标的点 <=> 极坐标的曲线
在笛卡尔坐标系:直线可由参数斜率和截距(m,b),表示。
在极坐标系:可由参数极径和极角(ρ,θ)表示。
(ρ,θ)就是一对霍夫空间的变量表示。直角坐标系中一个点(x0,
y0)可以代表360°的直线的其中一个点,我们把这个点旋转360°的直线都用极坐标(ρ,θ)表达出来,就是一个在霍夫空间(ρ,θ)的正弦曲线(大家想象一下,一个点的360°的直线的(ρ,θ)都不一样,不一样的(ρ,θ)组成了正弦曲线上的点)。同样,直线上的其他点(Xn,Yn)也会构成一组关于ρ,θ的正弦曲线,这样势必存在一个关于ρ,θ相交(即垂直点(r,θ))。
于是乎,
一条直线能够通过在极坐标下寻找交于一点的曲线数量来检测,如果越多曲线交于一点,就意味着这个交点表示的直线由更多的点组成。我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。
标准霍夫线变换能检测直线,但是不能够检测直线两端,概率霍夫线变换可以检测到直线的两端。如今霍夫变换可以检测圆及其大部分的形状。
下图这是笔者的总结, 如有误,望请告知。
标准霍夫变换本质上是把图像映射到它的参数空间(即霍夫空间)上,它需要计算所有的M个边缘点,这样它的运算量和所需内存空间都会很大。如果在输入图像中只是处理m(m<M)个边缘点,则这m个边缘点的选取是具有一定概率性的,因此该方法被称为概率霍夫变换(Probabilistic
Hough Transform)。该方法还有一个重要的特点就是能够检测出线端,即能够检测出图像中直线的两个端点,确切地定位图像中的直线。
接下来大家学习理解霍夫变换检测线的源代码。
这是霍夫线变换的源代码(有中文注释,利于快速理解):
https://download.csdn.net/download/qq_38265674/10438074
<https://download.csdn.net/download/qq_38265674/10438074>
学习思考:1.检测直线过程中一条比较粗的直线会被检测成两条分割的直线?
2.霍夫线变换有什么缺点?如何优化?
答案自行百度思考。
学习LSD直线检测的感想
LSD是一种局部提取的算法,运行速度比霍夫线变换Hough要快。
但是有局部算法的缺点:
1.对于直线相交情况,因为设置了每个点是否USED,因此每个点只能属于一条直线,若有相交必有至少一条直线被割裂为两条。又因为其基于梯度,直线交点梯度值往往又较小(不被检测为边缘点),因此很有可能相交的两条直线在交点处被割裂为四条线段。
2.由于局部检测算法自增长的特点,对于长线段被遮挡、局部模糊等原因经常割裂为多条直线。这些缺点在Hough变换中不存在。
详细跳转至:https://blog.csdn.net/tianwaifeimao/article/details/17678669
<https://blog.csdn.net/tianwaifeimao/article/details/17678669>
不懂LSD算法原理的话,跳转至:https://blog.csdn.net/carson2005/article/details/9326847
<https://blog.csdn.net/carson2005/article/details/9326847>
学习LSD直线检测源代码:https://download.csdn.net/download/qq_38265674/10438356
<https://download.csdn.net/download/qq_38265674/10438356>
以上是笔者的学习建议。
侵删。
热门工具 换一换