直线段检测算法(LSD:a Line Segment Detector)

时间:2024-03-30 09:46:56

1 简介

LSD是一种线段检测算法直线段检测算法(LSD:a Line Segment Detector),该方法能在较短的时间内获得较高精度的直线段检测结果。

LSD直线检测算法首先计算图像中所有点的梯度大小和方向,然后将梯度方向变化小且相邻的点作为一个连通域,接着根据每一个域的矩形度判断是否需要按照规则将其断开以形成多个矩形度较大的域,最后对生成的所有的域做改善和筛选,保留其中满足条件的域,即为最后的直线检测结果。该算法的优点在于检测速度快,而且无需参数调节,利用错误控制的方法,提高直线检测的准确度。

2 算法介绍

LSD直线检测方法首先计算每个像素点的水平线(Level-Line)角度,从而形成了一个水平线场(Level-Line Field),即单位矢量场。这里像素点的水平线角度就是该点梯度方向的垂直角度,如图2-1所示,而水平线场就是一个与图像中的点一一对应的矩阵,矩阵中元素的值即为对应到图像中点的水平线角度,如图2-2中间图所示。

直线段检测算法(LSD:a Line Segment Detector)

获得水平线场后,依据水平线角度用区域生长的方法将其切割成若干个连通域,每个连通域中所有像素点的水平线角度变化不能超过容忍值直线段检测算法(LSD:a Line Segment Detector),这样的连通域称为线支持区域(Line Support Regions),每个线支持区域都是线段检测的候选对象。如图2所示,绿色区域、橙色区域和蓝色区域各是一个线支持区域。

直线段检测算法(LSD:a Line Segment Detector)

 获得线支持区域后,把线支持区域的主惯性轴方向作为矩形方向,构造一个包含区域中所有点的矩形,如图2-3所示构造方式在3.6节中详细说明。然后将矩形中所有水平线方向角度与矩形方向角度偏差小于直线段检测算法(LSD:a Line Segment Detector)的点叫做对齐点(Aligned Point)如图2-4所示,设一个矩形内总的点数为直线段检测算法(LSD:a Line Segment Detector),其中对齐点点数为直线段检测算法(LSD:a Line Segment Detector),这将用于之后验证矩形是否能作为线段检测结果。

直线段检测算法(LSD:a Line Segment Detector)

直线段检测算法(LSD:a Line Segment Detector)

 矩形的验证方法是基于Desolneux, Moisan, and Morel提出的contrario方法和Helmholtz法则直线段检测算法(LSD:a Line Segment Detector),所谓的亥姆霍兹原理指出,不应在噪声图像上产生感知(或检测),因此,相反的方法提出定义噪声或相反的模型直线段检测算法(LSD:a Line Segment Detector),其中不存在期望的结构。在含有线段的情况下,我们对对齐点的数量感兴趣,因此考虑噪声模型中的虚警线段具有与所观测的真实线段一样多或更多对齐点的事件。给定图像直线段检测算法(LSD:a Line Segment Detector)和矩形直线段检测算法(LSD:a Line Segment Detector),定义直线段检测算法(LSD:a Line Segment Detector)表示矩形直线段检测算法(LSD:a Line Segment Detector)中对齐点的数量,直线段检测算法(LSD:a Line Segment Detector)表示矩形直线段检测算法(LSD:a Line Segment Detector)中像素点的总数,这样上述事件发生的次数即为

                                                    直线段检测算法(LSD:a Line Segment Detector)

也就是说这种事件发生即表示产生一个直线段检测的虚警。其中直线段检测算法(LSD:a Line Segment Detector)表示被考虑到的矩形总数,直线段检测算法(LSD:a Line Segment Detector)表示一个矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率。直线段检测算法(LSD:a Line Segment Detector)是模型直线段检测算法(LSD:a Line Segment Detector)对应的噪声图像,即为一个各个元素独立同分布的的矩阵,其尺寸与真实图像直线段检测算法(LSD:a Line Segment Detector)一致,每一个元素是在直线段检测算法(LSD:a Line Segment Detector)上服从均匀分布的独立随机变量。

任意一个像素点属于对齐点的概率直线段检测算法(LSD:a Line Segment Detector)

                                                                       直线段检测算法(LSD:a Line Segment Detector)

于是矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率为

                                        直线段检测算法(LSD:a Line Segment Detector)

                                                直线段检测算法(LSD:a Line Segment Detector)

设图像的尺寸为直线段检测算法(LSD:a Line Segment Detector),矩形的宽度最大为直线段检测算法(LSD:a Line Segment Detector),因此所有可能的矩形个数为直线段检测算法(LSD:a Line Segment Detector),考虑到后续对于直线段检测算法(LSD:a Line Segment Detector)值还有其他的测试值而不仅仅是直线段检测算法(LSD:a Line Segment Detector),设为直线段检测算法(LSD:a Line Segment Detector)个,因此测试矩形总数直线段检测算法(LSD:a Line Segment Detector)

                                                              直线段检测算法(LSD:a Line Segment Detector)

最后定义虚警的个数(the Number of False Alarms)为

                                    直线段检测算法(LSD:a Line Segment Detector)

                                            直线段检测算法(LSD:a Line Segment Detector)

设置一个NFA的阈值直线段检测算法(LSD:a Line Segment Detector),如果一个矩形满足直线段检测算法(LSD:a Line Segment Detector),那么就可以将其保留为一个直线段检测结果。


 整体算法的过程图如图2-5所示。

直线段检测算法(LSD:a Line Segment Detector)

3 详细论述

3.1 图像缩放

为了解决数字离散图像的阶梯效应,如图3-1所示,两种情况的直线段检测结果是合情合理的,但是并非我们所希望看到的结果。图3-2给出了缩小至原图的80%后再进行直线段检测的结果,两个边缘都被检测出来。

直线段检测算法(LSD:a Line Segment Detector)

直线段检测算法(LSD:a Line Segment Detector)

 论文给出的缩放比例是原图像的80%,即缩放后是尺寸是直线段检测算法(LSD:a Line Segment Detector),则缩放前是直线段检测算法(LSD:a Line Segment Detector),缩放的方法用的是高斯降采样,而高斯核的标准差直线段检测算法(LSD:a Line Segment Detector),这里直线段检测算法(LSD:a Line Segment Detector)取值0.6,而S取值0.8,可以在避免混叠和避免图像模糊之间获得良好的平衡。

3.2 梯度计算

图像梯度是按照直线段检测算法(LSD:a Line Segment Detector)的掩膜计算的,给出图像的局部灰度值如图3-3所示。

直线段检测算法(LSD:a Line Segment Detector)

那么梯度计算如下

                              直线段检测算法(LSD:a Line Segment Detector)

                              直线段检测算法(LSD:a Line Segment Detector)

于是水平线角度为

                                                             直线段检测算法(LSD:a Line Segment Detector)

那么梯度幅值为

                                                 直线段检测算法(LSD:a Line Segment Detector)

3.3 梯度伪排序(Pseudo-Ordering)

一般的排序算法需要直线段检测算法(LSD:a Line Segment Detector)次操作,而伪排序只要线性的时间即可完成,即与排序的点数n呈线性关系。

首先构建1024个bins,然后把图像中所有点根据梯度值分到这些bins中,然后从大到小逐个生长,也就是获得了线支持区域,这里需要说明的是,从不同的点开始生长,得到的线支持区域结果也不一样。

3.4 梯度阈值

梯度值小的像素对应于图像中平滑或者变化较缓的区域,而它们在量化时将会引起更大的梯度计算误差。在LSD算法中,通过设置梯度阈值直线段检测算法(LSD:a Line Segment Detector),梯度值小于直线段检测算法(LSD:a Line Segment Detector)的点不会在线支持区域和矩形中使用。

假设量化噪声为直线段检测算法(LSD:a Line Segment Detector),一个图像为直线段检测算法(LSD:a Line Segment Detector),那么就有观测值

                                                          直线段检测算法(LSD:a Line Segment Detector)     直线段检测算法(LSD:a Line Segment Detector)

于是误差角度,如图3-4

                                                        直线段检测算法(LSD:a Line Segment Detector)

要使直线段检测算法(LSD:a Line Segment Detector),所以应有

                                                                       直线段检测算法(LSD:a Line Segment Detector)

这里直线段检测算法(LSD:a Line Segment Detector)取经验值2。

直线段检测算法(LSD:a Line Segment Detector)

3.5 区域生长

LSD算法的区域生长跟我们以往所了解的区域生长算法原理大致相同,它利用伪排序得到的排序列表中梯度幅值大的点作为种子点,以该点的水平线角度作为区域的初始角度直线段检测算法(LSD:a Line Segment Detector),然后在八邻域中寻找与直线段检测算法(LSD:a Line Segment Detector)的偏差小于容忍值直线段检测算法(LSD:a Line Segment Detector)的点,然后将该点加入到区域中并更新直线段检测算法(LSD:a Line Segment Detector),更新方式为

                               直线段检测算法(LSD:a Line Segment Detector)

上式中直线段检测算法(LSD:a Line Segment Detector)遍历区域中的所有点。当区域中所有点的八邻域中都不满足与直线段检测算法(LSD:a Line Segment Detector)的偏差小于容忍值直线段检测算法(LSD:a Line Segment Detector)时,此时停止生长,算法的处理过程如图3-5所示。

直线段检测算法(LSD:a Line Segment Detector)

3.6 矩形逼近

对每一个线支持区域在验证之前,需要先进行一次矩形逼近,构造一个特定的包含区域中所有点的矩形。构造的原理如下。

首先把整个区域当做一个实体,而区域中每个像素点的梯度大小为点的质量,这样整个实体就有一个质心,将质心作为矩形的中心点。假设区域中点的坐标为直线段检测算法(LSD:a Line Segment Detector),对应的质量为直线段检测算法(LSD:a Line Segment Detector),那么矩形的中心直线段检测算法(LSD:a Line Segment Detector)

                              直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)

然后确定矩形的朝向角度,其角度设置为与矩阵M的最小特征值相关联的特征向量的角度。

                                                        直线段检测算法(LSD:a Line Segment Detector)

其中直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)的值分别为

                                          直线段检测算法(LSD:a Line Segment Detector)

                                          直线段检测算法(LSD:a Line Segment Detector)

                                     直线段检测算法(LSD:a Line Segment Detector)

确定了矩形的中心和矩形的朝向后,包含区域所有点的最小矩形即为逼近得到的矩形。

3.7 对齐点密度(Aligned Points Density)

对于一个线支持区域和对应的逼近矩形直线段检测算法(LSD:a Line Segment Detector),区域中对齐点的数量为直线段检测算法(LSD:a Line Segment Detector),那么该矩形的对齐点密度为

                                          直线段检测算法(LSD:a Line Segment Detector)

如果矩形直线段检测算法(LSD:a Line Segment Detector)的对齐点密度直线段检测算法(LSD:a Line Segment Detector),则可以接受该矩形检测结果,如果不满足要求,则对矩形做两种处理:减少角度容忍值直线段检测算法(LSD:a Line Segment Detector),根据设置半径对矩形裁剪。

3.8 矩形改善

为了获得更准确的矩形检测结果,需要改善所有的矩形,这也包括直线段检测算法(LSD:a Line Segment Detector)的矩形,改善分为以下五个步骤。

  • 尝试较小的直线段检测算法(LSD:a Line Segment Detector)值,设初始值为直线段检测算法(LSD:a Line Segment Detector),分别取直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)
  • 尝试同时减少矩形的两边,设初始值为直线段检测算法(LSD:a Line Segment Detector),分别取直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)
  • 尝试只减少矩形的长边,设初始值为直线段检测算法(LSD:a Line Segment Detector),分别取直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)
  • 尝试只减少矩形的短边,设初始值为直线段检测算法(LSD:a Line Segment Detector),分别取直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)
  • 尝试更小的直线段检测算法(LSD:a Line Segment Detector)值,包括直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector)直线段检测算法(LSD:a Line Segment Detector),其中直线段检测算法(LSD:a Line Segment Detector)为第一步中最小的NFA值对应的直线段检测算法(LSD:a Line Segment Detector)值。

以上五个步骤最后只保留最小的NFA所对应的变量值。

从上述可知,对直线段检测算法(LSD:a Line Segment Detector)的取值共有11个,因此第2节中计算NFA时,直线段检测算法(LSD:a Line Segment Detector)

4 示例

这节给出了一些图片以及相应的直线段检测结果。

直线段检测算法(LSD:a Line Segment Detector)

 

直线段检测算法(LSD:a Line Segment Detector)

直线段检测算法(LSD:a Line Segment Detector)

 

直线段检测算法(LSD:a Line Segment Detector)

5 参考文献 

[1] Rafael  Grompone  von  Gioi,  Jérémie  Jakubowicz,  Jean-Michel  Morel,  Gregory Randall. LSD: a Line Segment Detector[J]. Image Processing On Line, 2012(2): 35–55. 

[2]  Agn`es Desolneux, Lionel Moisan, Jean-Michel Morel, Meaningful Alignments, International Journal of Computer Vision, vol. 40, no. 1, pp. 7-23, 2000.

[3] Agn`es Desolneux, Lionel Moisan, Jean-Michel Morel, From Gestalt Theory to Image Analysis, a Probabilistic Approach, Springer 2008. ISBN: 0387726357


原创性声明:本文属于作者原创性文章,小弟码字辛苦,转载还请注明出处。谢谢~ 

代码下载请到https://download.csdn.net/download/weixin_42647783/10666674

小编初次写博文,可能有些地方表述的不够得体和清晰,有存在的任何问题,欢迎评论和指正,谢谢各路大佬。

有需要图像处理相关技术支持的可咨询QQ:297461921