1 简介

LSD是一种线段检测算法【图像检测】基于LSD直线检测matlab源码_matlab,该方法能在较短的时间内获得较高精度的直线段检测结果。

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

2 算法介绍

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

【图像检测】基于LSD直线检测matlab源码_图像处理_02

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

【图像检测】基于LSD直线检测matlab源码_matlab_04

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

【图像检测】基于LSD直线检测matlab源码_matlab_08

【图像检测】基于LSD直线检测matlab源码_图像处理_09

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

                                                    【图像检测】基于LSD直线检测matlab源码_matlab_18

也就是说这种事件发生即表示产生一个直线段检测的虚警。其中【图像检测】基于LSD直线检测matlab源码_matlab_19表示被考虑到的矩形总数,【图像检测】基于LSD直线检测matlab源码_matlab_20表示一个矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率。【图像检测】基于LSD直线检测matlab源码_matlab_21是模型【图像检测】基于LSD直线检测matlab源码_图像处理_11对应的噪声图像,即为一个各个元素独立同分布的的矩阵,其尺寸与真实图像【图像检测】基于LSD直线检测matlab源码_图像处理_12一致,每一个元素是在【图像检测】基于LSD直线检测matlab源码_图像处理_24上服从均匀分布的独立随机变量。

任意一个像素点属于对齐点的概率【图像检测】基于LSD直线检测matlab源码_matlab_25

                                                                       【图像检测】基于LSD直线检测matlab源码_图像处理_26

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

                                        【图像检测】基于LSD直线检测matlab源码_图像处理_27

                                                【图像检测】基于LSD直线检测matlab源码_图像处理_28

设图像的尺寸为【图像检测】基于LSD直线检测matlab源码_图像处理_29,矩形的宽度最大为【图像检测】基于LSD直线检测matlab源码_matlab_30,因此所有可能的矩形个数为【图像检测】基于LSD直线检测matlab源码_图像处理_31,考虑到后续对于【图像检测】基于LSD直线检测matlab源码_matlab_25值还有其他的测试值而不仅仅是【图像检测】基于LSD直线检测matlab源码_图像处理_33,设为【图像检测】基于LSD直线检测matlab源码_matlab_34个,因此测试矩形总数【图像检测】基于LSD直线检测matlab源码_matlab_19

                                                              【图像检测】基于LSD直线检测matlab源码_图像处理_36

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

                                    【图像检测】基于LSD直线检测matlab源码_图像处理_37

                                            【图像检测】基于LSD直线检测matlab源码_matlab_38

设置一个NFA的阈值【图像检测】基于LSD直线检测matlab源码_matlab_39,如果一个矩形满足【图像检测】基于LSD直线检测matlab源码_matlab_40,那么就可以将其保留为一个直线段检测结果。


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

【图像检测】基于LSD直线检测matlab源码_matlab_41

3 详细论述

3.1 图像缩放

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

【图像检测】基于LSD直线检测matlab源码_图像处理_42

【图像检测】基于LSD直线检测matlab源码_matlab_43

 论文给出的缩放比例是原图像的80%,即缩放后是尺寸是【图像检测】基于LSD直线检测matlab源码_图像处理_44,则缩放前是【图像检测】基于LSD直线检测matlab源码_matlab_45,缩放的方法用的是高斯降采样,而高斯核的标准差【图像检测】基于LSD直线检测matlab源码_图像处理_46,这里【图像检测】基于LSD直线检测matlab源码_matlab_47取值0.6,而S取值0.8,可以在避免混叠和避免图像模糊之间获得良好的平衡。

3.2 梯度计算

图像梯度是按照【图像检测】基于LSD直线检测matlab源码_matlab_48的掩膜计算的,给出图像的局部灰度值如图3-3所示。

【图像检测】基于LSD直线检测matlab源码_图像处理_49

那么梯度计算如下

                              【图像检测】基于LSD直线检测matlab源码_matlab_50

                              【图像检测】基于LSD直线检测matlab源码_matlab_51

于是水平线角度为

                                                             【图像检测】基于LSD直线检测matlab源码_图像处理_52

那么梯度幅值为

                                                 【图像检测】基于LSD直线检测matlab源码_图像处理_53

3.3 梯度伪排序(Pseudo-Ordering)

一般的排序算法需要【图像检测】基于LSD直线检测matlab源码_matlab_54次操作,而伪排序只要线性的时间即可完成,即与排序的点数n呈线性关系。

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

3.4 梯度阈值

梯度值小的像素对应于图像中平滑或者变化较缓的区域,而它们在量化时将会引起更大的梯度计算误差。在LSD算法中,通过设置梯度阈值【图像检测】基于LSD直线检测matlab源码_图像处理_55,梯度值小于【图像检测】基于LSD直线检测matlab源码_图像处理_55的点不会在线支持区域和矩形中使用。

假设量化噪声为【图像检测】基于LSD直线检测matlab源码_matlab_06,一个图像为【图像检测】基于LSD直线检测matlab源码_图像处理_12,那么就有观测值

                                                          【图像检测】基于LSD直线检测matlab源码_图像处理_59     【图像检测】基于LSD直线检测matlab源码_图像处理_60

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

                                                        【图像检测】基于LSD直线检测matlab源码_matlab_61

要使【图像检测】基于LSD直线检测matlab源码_matlab_62,所以应有

                                                                       【图像检测】基于LSD直线检测matlab源码_图像处理_63

这里【图像检测】基于LSD直线检测matlab源码_图像处理_64取经验值2。

【图像检测】基于LSD直线检测matlab源码_matlab_65

3.5 区域生长

LSD算法的区域生长跟我们以往所了解的区域生长算法原理大致相同,它利用伪排序得到的排序列表中梯度幅值大的点作为种子点,以该点的水平线角度作为区域的初始角度【图像检测】基于LSD直线检测matlab源码_图像处理_66,然后在八邻域中寻找与【图像检测】基于LSD直线检测matlab源码_图像处理_66的偏差小于容忍值【图像检测】基于LSD直线检测matlab源码_图像处理_03的点,然后将该点加入到区域中并更新【图像检测】基于LSD直线检测matlab源码_图像处理_66,更新方式为

                               【图像检测】基于LSD直线检测matlab源码_图像处理_70

上式中【图像检测】基于LSD直线检测matlab源码_matlab_71遍历区域中的所有点。当区域中所有点的八邻域中都不满足与【图像检测】基于LSD直线检测matlab源码_图像处理_66的偏差小于容忍值【图像检测】基于LSD直线检测matlab源码_图像处理_03时,此时停止生长,算法的处理过程如图3-5所示。

【图像检测】基于LSD直线检测matlab源码_matlab_74

3.6 矩形逼近

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

首先把整个区域当做一个实体,而区域中每个像素点的梯度大小为点的质量,这样整个实体就有一个质心,将质心作为矩形的中心点。假设区域中点的坐标为【图像检测】基于LSD直线检测matlab源码_图像处理_75,对应的质量为【图像检测】基于LSD直线检测matlab源码_matlab_76,那么矩形的中心【图像检测】基于LSD直线检测matlab源码_图像处理_77

                              【图像检测】基于LSD直线检测matlab源码_图像处理_78【图像检测】基于LSD直线检测matlab源码_图像处理_79

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

                                                        【图像检测】基于LSD直线检测matlab源码_图像处理_80

其中【图像检测】基于LSD直线检测matlab源码_matlab_81【图像检测】基于LSD直线检测matlab源码_matlab_82【图像检测】基于LSD直线检测matlab源码_图像处理_83的值分别为

                                          【图像检测】基于LSD直线检测matlab源码_matlab_84

                                          【图像检测】基于LSD直线检测matlab源码_图像处理_85

                                     【图像检测】基于LSD直线检测matlab源码_图像处理_86

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

3.7 对齐点密度(Aligned Points Density)

对于一个线支持区域和对应的逼近矩形【图像检测】基于LSD直线检测matlab源码_matlab_13,区域中对齐点的数量为【图像检测】基于LSD直线检测matlab源码_matlab_07,那么该矩形的对齐点密度为

                                          【图像检测】基于LSD直线检测matlab源码_图像处理_89

如果矩形【图像检测】基于LSD直线检测matlab源码_matlab_13的对齐点密度【图像检测】基于LSD直线检测matlab源码_matlab_91,则可以接受该矩形检测结果,如果不满足要求,则对矩形做两种处理:减少角度容忍值【图像检测】基于LSD直线检测matlab源码_图像处理_03,根据设置半径对矩形裁剪。

3.8 矩形改善

为了获得更准确的矩形检测结果,需要改善所有的矩形,这也包括【图像检测】基于LSD直线检测matlab源码_matlab_93的矩形,改善分为以下五个步骤。

  • 尝试较小的【图像检测】基于LSD直线检测matlab源码_matlab_94值,设初始值为【图像检测】基于LSD直线检测matlab源码_matlab_25,分别取【图像检测】基于LSD直线检测matlab源码_matlab_25【图像检测】基于LSD直线检测matlab源码_matlab_97【图像检测】基于LSD直线检测matlab源码_matlab_98【图像检测】基于LSD直线检测matlab源码_图像处理_99【图像检测】基于LSD直线检测matlab源码_matlab_100【图像检测】基于LSD直线检测matlab源码_图像处理_101
  • 尝试同时减少矩形的两边,设初始值为【图像检测】基于LSD直线检测matlab源码_图像处理_102,分别取【图像检测】基于LSD直线检测matlab源码_图像处理_102【图像检测】基于LSD直线检测matlab源码_图像处理_104【图像检测】基于LSD直线检测matlab源码_图像处理_105【图像检测】基于LSD直线检测matlab源码_matlab_106【图像检测】基于LSD直线检测matlab源码_matlab_107【图像检测】基于LSD直线检测matlab源码_图像处理_108
  • 尝试只减少矩形的长边,设初始值为【图像检测】基于LSD直线检测matlab源码_图像处理_109,分别取【图像检测】基于LSD直线检测matlab源码_图像处理_109【图像检测】基于LSD直线检测matlab源码_图像处理_111【图像检测】基于LSD直线检测matlab源码_matlab_112【图像检测】基于LSD直线检测matlab源码_图像处理_113【图像检测】基于LSD直线检测matlab源码_matlab_114【图像检测】基于LSD直线检测matlab源码_matlab_115
  • 尝试只减少矩形的短边,设初始值为【图像检测】基于LSD直线检测matlab源码_图像处理_116,分别取【图像检测】基于LSD直线检测matlab源码_图像处理_116【图像检测】基于LSD直线检测matlab源码_图像处理_118【图像检测】基于LSD直线检测matlab源码_图像处理_119【图像检测】基于LSD直线检测matlab源码_图像处理_120【图像检测】基于LSD直线检测matlab源码_matlab_121【图像检测】基于LSD直线检测matlab源码_matlab_122
  • 尝试更小的【图像检测】基于LSD直线检测matlab源码_matlab_25值,包括【图像检测】基于LSD直线检测matlab源码_图像处理_124【图像检测】基于LSD直线检测matlab源码_matlab_125【图像检测】基于LSD直线检测matlab源码_图像处理_126【图像检测】基于LSD直线检测matlab源码_图像处理_127【图像检测】基于LSD直线检测matlab源码_图像处理_128【图像检测】基于LSD直线检测matlab源码_图像处理_129,其中【图像检测】基于LSD直线检测matlab源码_图像处理_124为第一步中最小的NFA值对应的【图像检测】基于LSD直线检测matlab源码_matlab_25值。

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

从上述可知,对【图像检测】基于LSD直线检测matlab源码_matlab_94的取值共有11个,因此第2节中计算NFA时,【图像检测】基于LSD直线检测matlab源码_图像处理_133

4 示例

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

% lsd store and draw

img_path = './undistortedImage/1.png';




a = detect(img_path);

lines_list = flsd(a);

lines_list = lines_list(:,1:4);

swap = lines_list(:,1);

lines_list(:,1) = lines_list(:,2);

lines_list(:,2) = swap;

swap = lines_list(:,3);

lines_list(:,3) = lines_list(:,4);

lines_list(:,4) = swap;

% lines_list = and;

fusion_lines = mergeLine(lines_list,5,5,10,180);

% minAngleDis = 5; minDis = 5; minLen = 20; minGap = 180;



img = imread(img_path);

line = fusion_lines;

figure,

hold on

imagesc(img);

colormap bone;

for i = 1: size(line,1)

plot([line(i,1),line(i,3)],[line(i,2),line(i,4)],'red');

end

axis ij

hold off


img = imread(img_path);

line = lines_list;

figure,

hold on

imagesc(img);

colormap bone;

for i = 1: size(line,1)

plot([line(i,1),line(i,3)],[line(i,2),line(i,4)],'red');

end

axis ij

hold off
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  1. 【图像检测】基于LSD直线检测matlab源码_图像处理_134