LBD算法 - Line Band Discriptor 描述符分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chishuideyu/article/details/78132093

LBD概述


LBD算法源自2013年文章《An efficient and robust line segment matching approach based on LBD descriptor and pairwise geometric consistency》

我们都知道要对两幅图片的特征进行匹配,要进行以下几步。
1. 特征提取
2. 特征描述
3. 特征匹配
文中描述了一种用于定义线段特征的描述符,并且基于该描述符可以对两幅图中的线段特征进行匹配操作。

其中特征提取部分,采用了EDLines算法。
而在特征描述阶段,类似于Sift统计梯度直方图作为描述子,LBD采用了对像素梯度进行统计并计算统计量的平均向量与标准方差作为描述子。

LBD算法基于三个策略
1. 在尺度空间里提取线段,这样可以使匹配算法对尺度变化更具有鲁棒性
2. 使用比MSLD更有效率的LBD描述符,描述线段的局部外观。
3. 在构建线段对关系图的时候,结合线段的局部外观和几何约束两种特征

总体流程


1. 在尺度空间内提取线段


1.1. 构建尺度空间

当拿到一张图片,我们先构建一个尺度金字塔,就和sift算法所实现的那样,通过一组尺度因子scale factors和高斯模糊Gaussian blurring,对一张图片进行N个下采样,就可以得到N层尺度金字塔,最下方是原图,每高一层就是一层高斯模糊后的图像。但是和Sift算法不同,连续两个层之间并没有内层。

1.2. 提取线特征

构建尺度空间后,我们对一个尺度金字塔中每一层的图片都进行一次EDLine算法的线特征提取,于是在每一层空间里都能够获得一组线段。然后我们将尺度空间里的线进行重组,以发现对应线段。对于每一个从尺度空间里取出的线段,如果他们在图像中是相同的线段,但是在不同的尺度空间里,我们都安排一个唯一ID并将其存入到同一个LineVec变量中。

最终提取的结果就是一组LineVec变量,就像上图所示。因为重新组织的尺度空间中的线段特征为LineVec,所以这减少了图匹配问题的维度。所以同一个LineVec中的不同的线段,指的是不同尺度空间下的同一个线段。所以在同一个LineVec下的线段都拥有相同的方向,并且对应于原图的同一个区域。

2. 构建线段描述符


2.1. 线段支持域的条带表示方法


上一步得到了尺度空间中的线段,接下来我们可以通过线段构成的LSR线段支持区域计算描述符。
我们将LSR支持区域分割为一组条带{B1,B2,B3……Bm},这些条带是LSR支持区域的子区域,并且他们与线段是平行的关系。我们将LSR区域分割为 m 个条带,每一个条带的像素宽度为 w 。比如上图就是 m = 5 , w = 3 的LSR区域图

在这里其采用了和MSLD类似的方法,定义了两种方向构成局部2D坐标系,来区分有相反梯度方向的平行线并使描述符旋转不变
直线方向 表示直线所朝的方向。
正交方向 表示方向的顺时针垂直方向。
这条线的中点被选为局部坐标系的原点。并且LSR内的每个像素的梯度投影到这个局部坐标系中,其中是图片坐标系中的像素梯度,是局部坐标系中的像素梯度。

受到Sift和MSLD的启发,在 方向上的每一行都应用两个高斯函数。
首先,在LSR内的第i行上安排一个全局权重系数weight ,其中表示LSR中第i行到中心行的距离,并且
其次,对于Bj条带和它的相邻条带Bj+1和Bj-1中的每一行,我们为第k行分配一个局部权重系数,其中是第k行到Bj条带中心行的距离,并且

以上两种高斯函数
全局高斯窗口的目的是为降低远离线段的梯度的重要性,以此缓和在线段垂直方向 上微小变化的敏感度。
局部高斯窗口的目的是为降低边缘效应,避免了像素从一个条带到下一个条带时,描述符突然改变。

此方法描述子区域的优点:

  • 首先,它对线段方向 上的细小位置变化更具有鲁棒性,因为在这个方法中,条带边界的微小变化时,条带内的大部分图像内容依然保持不变。这一特性非常重要,因为通常情况下,由于线段端点的不稳定性,一条线在 方向的位置精度比 方向要低。
  • 其次,由于 方向条带间没有重叠部分,所以其计算效率更高,并且高斯权重直接应用于每一行像素,而非每一个像素。

2.2. 构造LBD条带描述符

定义出了线段的条带之后,我们就可以构造条带描述符了。
简单的说,我们去计算一个条带描述符 BDjBDj 是通过 Bj 和它的两个相邻条带 Bj-1Bj+1 构成的。在计算条带中顶端条带 B1 和底端条带 Bm 时,在LSR区域以外的部分不考虑到算法中。在计算完 BDj 之后,我们可以用LBD条带描述符把他们简单的连接在一起

BDj 的计算
(对于条带中第K行,累计该行中四个方向上像素的梯度,分别是 方向, 反方向, 方向,反方向):

其中是高斯系数,所以一行像素我们总结出4个方向的梯度数据。

通过累计条带 Bj 相关联的所有行的梯度信息,我们可以构造一个条带描述符矩阵 BDMj 表示第j个条带的描述信息。

数字n是行数,由于存在边缘条带,所以n的定义如下:

然后我们计算 BDjBDjBDMj 的平均向量 Mj 和标准方差向量 Sj 构成

然后对LDB的均值部分和标准方差部分分别进行归一化,因为他们大小不同。并且为了减小非线性光照的影响,对每个LBD维度进行约束,小于经验值0.4。最后我们重新归一化约束向量得到一个单元LBD。

LBD的原版 source code 运行的时候,常常遇到很多问题,所以我基于github上mtamburrano/LBD_Descriptor的版本,又改写了一份代码可以进行LBD描述子的构成与匹配,需要依赖arpack和OpenCV
https://github.com/chishuideyu/LBD_and_LineMatching

参考文献:
http://www.cnblogs.com/Jessica-jie/p/7523364.html

猜你喜欢

转载自blog.csdn.net/chishuideyu/article/details/78132093