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

Posted Matlab咨询QQ1575304183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像检测基于LSD直线检测matlab源码相关的知识,希望对你有一定的参考价值。

1 简介

LSD是一种线段检测算法^{[1]},该方法能在较短的时间内获得较高精度的直线段检测结果。

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

2 算法介绍

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

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

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

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

                                                    N{_{test}}\\cdot P_{H_{0}}[k(r,I)\\geq k(r,i)]

也就是说这种事件发生即表示产生一个直线段检测的虚警。其中N{_{test}}表示被考虑到的矩形总数,P_{H_{0}}表示一个矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率。I是模型H_{0}对应的噪声图像,即为一个各个元素独立同分布的的矩阵,其尺寸与真实图像i一致,每一个元素是在\\left [ 0,2\\pi \\right ]上服从均匀分布的独立随机变量。

任意一个像素点属于对齐点的概率p

                                                                       p=\\frac{\\tau}{\\pi}

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

                                        P_{H_{0}}[k(r,I)\\geq k(r,i)]=B(n(r),k(r,i),p)

                                                B(n,k,p)=\\sum\\limits_{j=k}^{n}{\\left( \\begin{matrix} n \\\\ j \\\\ \\end{matrix} \\right)}{​{p}^{j}}{​{(1-p)}^{n-j}}

设图像的尺寸为M\\times N,矩形的宽度最大为\\sqrt{MN},因此所有可能的矩形个数为(NM)^{\\frac{5}{2}},考虑到后续对于p值还有其他的测试值而不仅仅是\\tau /\\pi,设为\\gamma个,因此测试矩形总数N{_{test}}

                                                              N{_{test}}=\\gamma (NM)^ {\\frac{5}{2}}

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

                                    NFA(r)={​{(NM)}^{5/2}}\\gamma \\sum\\limits_{j=k}^{n}{\\left( \\begin{matrix} n \\\\ j \\\\ \\end{matrix} \\right)}{​{p}^{j}}{​{(1-p)}^{n-j}}

                                            \\begin{pmatrix} n\\\\ j \\end{pmatrix}=\\frac{\\Gamma (n+1)}{\\Gamma (k+1)\\cdot \\Gamma (n-k+1)}

设置一个NFA的阈值\\varepsilon,如果一个矩形满足NFA(r,i)\\leqslant \\varepsilon,那么就可以将其保留为一个直线段检测结果。


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

3 详细论述

3.1 图像缩放

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

 论文给出的缩放比例是原图像的80%,即缩放后是尺寸是N\\times M,则缩放前是1.25N\\times 1.25M,缩放的方法用的是高斯降采样,而高斯核的标准差\\sigma=\\Sigma /S,这里\\Sigma取值0.6,而S取值0.8,可以在避免混叠和避免图像模糊之间获得良好的平衡。

3.2 梯度计算

图像梯度是按照2\\times 2的掩膜计算的,给出图像的局部灰度值如图3-3所示。

那么梯度计算如下

                              g_{x}=\\frac{i(x+1,y)+i(x+1,y+1)-i(x,y)-i(x,y+1)}{2}

                              g_{y}=\\frac{i(x,y+1)+i(x+1,y+1)-i(x,y)-i(x+1,y)}{2}

于是水平线角度为

                                                             \\arctan (\\frac{g_{x}(x,y)}{-g_{y}(x,y)})

那么梯度幅值为

                                                 G(x,y)=\\sqrt{g_{x}^{2}(x,y)+g_{y}^{2}(x,y)}

3.3 梯度伪排序(Pseudo-Ordering)

一般的排序算法需要n\\cdot \\log n次操作,而伪排序只要线性的时间即可完成,即与排序的点数n呈线性关系。

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

3.4 梯度阈值

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

假设量化噪声为n,一个图像为i,那么就有观测值

                                                          \\tilde{i}=i+n     \\triangledown \\tilde{i}=\\triangledown i+\\triangledown n

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

                                                        \\left | angle\\, error \\right |\\leqslant \\arcsin (\\frac{q}{\\left | \\triangledown i \\right |})

要使\\left | angle\\, error \\right |\\leqslant \\tau,所以应有

                                                                       \\rho=\\frac{q}{\\sin \\tau}

这里q取经验值2。

3.5 区域生长

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

                               \\theta _{region}=\\arctan (\\frac{\\Sigma _{j}\\sin (levellineangle_{j})}{\\Sigma _{j}\\cos(levellineangle_{j})})

上式中j遍历区域中的所有点。当区域中所有点的八邻域中都不满足与\\theta _{region}的偏差小于容忍值\\tau时,此时停止生长,算法的处理过程如图3-5所示。

3.6 矩形逼近

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

首先把整个区域当做一个实体,而区域中每个像素点的梯度大小为点的质量,这样整个实体就有一个质心,将质心作为矩形的中心点。假设区域中点的坐标为(x(j),y(j)),对应的质量为G(j),那么矩形的中心(c_{x},c_{y})

                              c_{x}=\\frac{\\Sigma _{j\\in region}G(j)\\cdot x(j)}{\\Sigma _{j\\in region}G(j)}c_{y}=\\frac{\\Sigma _{j\\in region}G(j)\\cdot y(j)}{\\Sigma _{j\\in region}G(j)}

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

                                                        M=\\begin{bmatrix} m^{xx} &m^{xy} \\\\ m^{xy} & m^{yy} \\end{bmatrix}

其中m^{xx}m^{yy}m^{xy}的值分别为

                                          m^{xx}=\\frac{\\Sigma _{j\\in region}G(j)\\cdot (x(j)-c_{x})^{2}}{\\Sigma _{j\\in region}G(j)}

                                          m^{yy}=\\frac{\\Sigma _{j\\in region}G(j)\\cdot (y(j)-c_{y})^{2}}{\\Sigma _{j\\in region}G(j)}

                                     m^{xy}=\\frac{\\Sigma _{j\\in region}G(j)\\cdot (x(j)-c_{x})(y(j)-c_{y})}{\\Sigma _{j\\in region}G(j)}

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

3.7 对齐点密度(Aligned Points Density)

对于一个线支持区域和对应的逼近矩形r,区域中对齐点的数量为k,那么该矩形的对齐点密度为

                                          D(r)=\\frac{k}{length(r)\\cdot width(r)}

如果矩形r的对齐点密度D(r)\\geqslant D_{0},则可以接受该矩形检测结果,如果不满足要求,则对矩形做两种处理:减少角度容忍值\\tau,根据设置半径对矩形裁剪。

3.8 矩形改善

为了获得更准确的矩形检测结果,需要改善所有的矩形,这也包括NFA\\geqslant \\epsilon的矩形,改善分为以下五个步骤。

  • 尝试较小的precision值,设初始值为p,分别取p\\frac{p}{2}\\frac{p}{4}\\frac{p}{8}\\frac{p}{16}\\frac{p}{32}
  • 尝试同时减少矩形的两边,设初始值为W,分别取WW-0.5W-1W-1.5W-2W-2.5
  • 尝试只减少矩形的长边,设初始值为a,分别取aa-0.5a-1a-1.5a-2a-2.5
  • 尝试只减少矩形的短边,设初始值为b,分别取bb-0.5b-1b-1.5b-2b-2.5
  • 尝试更小的p值,包括\\widehat{p}\\frac{\\widehat{p}}{2}\\frac{\\widehat{p}}{4}\\frac{\\widehat{p}}{8}\\frac{\\widehat{p}}{16}\\frac{\\widehat{p}}{32},其中\\widehat{p}为第一步中最小的NFA值对应的p值。

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

从上述可知,对precision的取值共有11个,因此第2节中计算NFA时,\\gamma =11

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

完整代码或仿真咨询QQ1575304183

以上是关于图像检测基于LSD直线检测matlab源码的主要内容,如果未能解决你的问题,请参考以下文章

基于梯度方向极化变换和聚类算法的图像主特征直线检测

无人驾驶图像识别-车道线检测

车道线识别基于matlab hough变换道路检测直线检测含Matlab源码 2074期

车道线识别基于matlab hough变换道路检测直线检测含Matlab源码 2074期

角点检测 基于matlab GUI图像角点检测含Matlab源码 2082期

角点检测 基于matlab GUI图像角点检测含Matlab源码 2082期