2.7 直线段检测
一般直线段检测首先采用Canny边缘检测算子来获得边缘图,然后应用Hough变换可以用来检测所有直线,这些线段可以通过边缘像素数目、长度和隔离情况来分成线段。但是其效率较低,并且容易受纹理和噪声的影响,具有以下两个缺陷:第一,这样的处理忽略了边缘点的方向性,前面圆形Hough变换中就利用曲率信息来提高效率;第二,阈值的选取非常困难。
因此,在2008年,Rafael Grompone von Gioi等人提出了一种线性时间的直线段检测算法,称为LSD(Linear-Time Segment Detector)。其基本原理是利用图像的梯度信息,若存在直线,则直线附近像素的梯度方向应该类似,进而对梯度图像采用区域增长算法获得直线段区域,并且可以检测直线段的宽度和长度等信息。
首先计算图像梯度方向值,然后根据梯度方向值计算像素值的方向场(Level-Line,与梯度方向场垂直,实际上表示这个方向上像素值没有太大变化,相当于边缘方向),通过迭代的方法将区域扩大,每次迭代过程中将区域内的点的像素值的方向进行平均,然后对其周围位置的方向进行比较,将限定阈值内的点增加到该区域中,其过程如图2.33所示。这样将图像划分成线支撑区域,每个区域中的联通像素具有类似的梯度角度。然后,按照直线段的特征来拟合每个线支撑区域,直线图特征可用图2.34表示。
图2.33 LSD直线段检测对齐点的增长过程
图2.34 采用矩形区域来刻画直线段
在LSD中,以梯度幅度作为像素质量,计算矩形区域的中心,第一个主轴作为矩形的长,长度和宽度覆盖直线的支撑区域。图2.35显示的是一个用矩形区域模拟直线段的实际例子。图2.35的左图为实际图像,中间图为支撑区域,右图为近似结果。
图2.35 用矩形区域模拟直线段
最后一步,验证满足上述要求的线是否为直线段。通过在输入图像梯度图的基础上,保持处于水平线方向场中,如图2.36所示。统计与拟合直线段矩形方向角度的误差在内的点数k,图中k=4,并对矩形的长度l进行统计,若数目k和长度l都大于给定的阈值,则说明这样的矩形区域确实是直线段;否则剔除。
图2.36 直线段检测示例
最终的直线段检测算法可以表示为如图2.37所示。该算法在计算机视觉领域中有着广泛的应用,例如,可以生成类似素描的图像,从而进行草图检索等。此外,也有其余基于改进的标准Hough变换的直线段检测方法,如D.Shi等提出的基于多层分数傅里叶变换的高级Hough变换。
图2.37 LSD直线段检测算法