上一节介绍了一些资源和实验结果,这节主要是介绍LSD算法理论。
直线段检测算法---LSD:a Line Segment Detector
LSD的核心是像素合并于误差控制。利用合并像素来检测直线段并不是什么新鲜的方法,但是合并像素的方法通常运算量较大。LSD号称是能在线性时间(linear-time)内得到亚像素级准确度的直线段检测算法。LSD虽然号称不需人工设置任何参数,但是实际使用时,可以设置采样率和判断俩像素是否合并的方向差。我们知道,检测图像中的直线其实就是寻找图像中梯度变化较大的像素。LSD的目标在于检测图像中局部的直的轮廓,这也是我们称之为直线分割的原因。轮廓是图像中的某些特殊区域,在这些区域,图像的灰度从黑到白或者从白到黑的剧烈变化。因此,梯度和level-line是两个重要的概念,如下图所示:
算法首先计算每个像素的level-line angle(此文章下面的[2])以构成一个level-line 场。该场被分割为连通的若干个部分,它们方向近似相同并且在容忍度τ内,这样可以得到一系列regions,这些 regions被称为 line support regions(支持域)。如下图所示:
每一个line support region其实就是一组像素,它也是直线段(line segment)的候选。同时,对于这个line support region,我们可以观察它的最小外接矩形。直观上来讲,当一组像素构成的区域,特别细长时,那么这组像素更加可能是直线段。line support region的一个主惯性轴作为矩形的主方向,矩形的大小选择为覆盖整个区域。
矩形中的像素的level-line angle与最小外接矩形的主方向的角度差在容忍(tolerance)τ内的话,那么这个点被称作"aligned point"(同性点)。通过统计最小外接矩形内的所有像素数n和其内的alinedg points个数k,用来判定这个line support region是否是一个直线段。判定的准则使用的是a contrario approach and the Helmholtz principle。
LSD算法的具体解释:
输入:灰度图
输出:一系列的直线分割结果。
1.以 s=0.8的尺度对输入图像进行高斯核采样。
2.计算每一个点的梯度值以及梯度方向(level-line orientation),其中gx和gy分别为水平和垂直方向梯度。
3.根据梯度值对所有点进行伪排序(pseudo-ordered),建立状态列表,所有点设置为UNUSED。