LSD(Line Segment Detector)直线提取算法

来源:互联网 发布:游戏界面编程 编辑:程序博客网 时间:2024/06/06 15:53

LSD是2010年发表在ipol上的一篇论文提出的直线提取算法,在较短的时间内可以提取一张灰度图上所有的线段特征。
(文中提到了a contrario model 和 Helmoholtz principle,在这篇文章中并没有进行讲解)
总体流程图

LSD算法是基于梯度的,但是为了减少梯度的依赖性,LSD算法也做了一些必要的优化措施,所以它的流程如下。
这里写图片描述

1. 首先,对图片进行一次高斯降采样,缩小图片

1.1. 降采样要解决的问题

通过降采样可以减缓或解决图像中出现的混叠与量化伪像问题(特别是阶梯效应)
混叠问题是使不同的信号成为不可区分的效果(或别名彼此的)时采样。它也指失真或伪影,其导致当从样品中重建的信号是从原始连续信号不同。

而另一个问题,阶梯效应实际上就是锯齿问题,图像在边缘处常常显示成锯齿状,所以需要通过降采样解决这个问题。

可以看到在降采样前,这两种边缘处提取的线段,第一张提取的是分段的线段,而本应是完整的一条线,而第二张则是连线段都没有提取出来。

而在降采样之后,两种线段均提取的较为正常了

1.2. LSD降采样的方法

该LSD算法中默认的降采样比例是0.8,那意味着,X轴Y轴各降采样0.8,而总像素降采样0.64。所以如果我们在计算NFA值的时候,使用的是N*M的图像的话,那么输入图像的分辨率应该是1.25N*1.25M。并且在LSD算法的降采样中,使用的是高斯降采样,通过使用高斯内核过滤图像以避免混叠然后进行次采样。公式求得的是高斯内核标准偏差,S是缩放因子。

2. 计算梯度

LSD梯度的计算利用每像素点的右边下方的四个像素进行计算。这样做,主要是尽可能少的使用其他像素,可以减少对梯度的依赖性,这样对有噪声的图像更具有鲁棒性。计算梯度是为了记录明暗变化,从而找到可能有线段边缘的地方。

图像中由明转暗和由暗转明处的线段方向是不同的,呈180度差距,那就意味着如果一张图片倒置其明暗,使用LSD算出的线段依旧是那些线段,但是头与尾是颠倒过来的。
并且因为梯度计算只用到了右下方的像素,所以计算出来的梯度并不是(x,y)点的梯度,而是(x+0.5,y+0.5)的梯度。

3. 梯度伪排序

排序算法一般最快的也是O(nlogn)时间复杂度的,但是如果我们使用伪排序就可以将时间缩短到O(n)线性时间内,而伪排序并不是真正的进行了梯度的排序,只是对梯度值按照他们的分布进行一定程度的排序。

LSD算法的排序算法基于贪心算法,先从0到最大梯度之间分成1024个等份,再从这1024个分段中每个分段取一个种子像素,以用来进行排序,因为1024已经可以将0~255分成很细的段了,所以伪排序虽然不是真正的排序,但是效率很高。

4.梯度的阈值

计算完梯度之后,会发现,如果一张图像中有些小梯度区域表现非常均匀,由于值的量化,那里的像素就会表现出更高的误差,那么设定如果梯度小于某一个阈值ρ就被抛弃并将不再用于线段区域的构建。
假设存在理想图像i和量化噪声n

我们可以观察到,当角度误差小于容忍值的时候,我们就接受这个像素,,等式的右边是容忍度,q是 |▽n| 的边界,容忍度我们用τ来表示,所以可以得到。一般来说,我们设定q = 2。

5. 区域更新 RegionGrow

我们当前像素计算完梯度之后,会得到一个像素的方向,而由像素构成的line区域也会有一个方向,我们便可以通过这两个方向之间的差距,判断该像素是否可以被纳入到直线区域中。

从排序列表中选择一个NOT USED像素作为种子点,检查在当前像素周围的领域像素内那些未使用的像素点中,LLA(Level-line-angle)和区域角度之间的差值在容忍值τ 内话,将会被加入到该line support region区域中。而区域初始角度就是种子点的LLA,每次加入一个新像素到区域中的时候,区域角度就通过下面的公式对整个直线区域更新一次(其中j是遍历时的像素下标):

误差容忍值默认被设为22.5,那就意味着对于整个区域矩形来说,误差容忍度是45度,22.5这个值是通过实验得出的经验值。

区域更新的流程:

6. 矩形近似计算

上面在规划区域后,我们要将该区域进行矩形近似计算,以求得一个较为规整的直线区域。
一个直线段对应一个矩形,在评估line support region之前,直线对应的矩形应该被找出来,并可以用公式计算矩形的中心:

G(j)是像素j的梯度值,j代表区域内的每一个像素点
矩形的角度,被设为特征向量的角度,而这个特征向量与下面M矩阵的最小特征值有关

7. NFA值计算

字面上解释,Number of False Alarms指的是误报数,也就是原本并不是直线但是被当做直线的地方。
因为矩形是有方向的,所以他们的起始点和终止点的排序实际上是有很多种可能的,这样看的话,从A点到B点,和从B点到A点实际上是不同的两个线段。所以我们要考虑到所有起始点终止点的可能性,在一张降采样后,N*M的图像上,我们的点有NM个所以就有可能有NM x NM种搭配的矩形,并且矩形线的线宽有√(NM)种。

所以我们的矩形线段就会有种可能性。

我们用二项分布来表示测试数据。
我们将p的初值设为τ/π,并用γ来表示p的不同值的可能数量。那么最终的测试数量是

我们用一个阈值ε来对NFA值进行过滤,并且如果一个矩形满足 NFA(r,i)<=ε 那么这个矩形被称作ε-meaningful 矩形。

在这里存在一个定理:

在上式中,E是期望函数,1是指示函数,R是矩形集,I是随机图像。“ε有意义”的矩形的平均数小于ε。
因此,噪声检测的数量由ε控制,并且可以根据需要进行较小的控制。

参考文献:
https://en.wikipedia.org/wiki/Aliasing
http://blog.csdn.net/ivandark/article/details/29562201

原创粉丝点击