【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法

一、LSD算法

LSD算法主要是用来提取直线的算法,算法主要是利用每个像素的梯度作为基础来进行处理。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第1张图片
对于每个像素,计算level-line和level-line angle,之后level-line会将整个图转换为level-line field,根据level-line的角度,在一定容忍度内的会被划分到同一个line-support regions中,这些支持域会被作为直线段的候选。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第2张图片
接下来对这些直线段的候选做筛选,将支持域的一个主惯性轴作为矩形的主方向,从而构建出一个最小外接矩形。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第3张图片
之后检查矩形中像素的level-line angle,如果与最小外接矩形的主方向的角度差在容忍度范围内,这个像素就被称作同性点。统计最小外接矩形内所有的像素数量和同性点的数量,之后利用a contrario approach and the Helmholtz principle这两个原则进行检测。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第4张图片
这两个原则是说在完美噪声图像图像中不应该检测到目标和一个不会检测到目标的噪声图像,具体做法就是引入一个新的模型a contrario model,这个模型可以理解为一个完美噪声图像,每个像素值相互独立,并且服从[0,2π]的均匀分布。然后分别对目标图像以及引入的噪声图像的矩形框区域内的像素以及aligned points进行统计,计算图像aligned points个数小于噪声图像aligned points个数的概率,再乘一个比例系数,就作为NFA的值,根据这个值判断是不是一条线。

二、LBD描述子

提取到的直线如果需要后续的匹配等操作,必不可少的就是描述方法,LBD就是一种用来描述直线的描述子。

为了减小运算量,对输入的原始图像进行下采样,从而构成一个N层的尺度空间金字塔,使用Edline算法对每层的尺度空间进行搜索,从而每层找到一组线,每条直线都有一个方向,将其分配ID并且存放在一个向量中。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第5张图片
这段操作是说去检测同一条直线在每一层中的不同表现,从而筛选出同一条直线在N层中直线构成的集合存放在一个向量中,对于上面这张图来说,就是找红蓝黄绿四条颜色的线在金字塔四层中的不同表现,将其放入同一个向量中。
用这样一个向量去描述一条线,为了描述这样一条线,我们使用一种条带描述方法,需要在每条线所在的层上进行描述。在线所在的一层中,对线的支持域做如图所示的划分,条带的数目和宽度都可以变化,条带的长度设置为线段的长度,每个条带都是平行的。条带的宽度可以根据需要设置,代码中使用的是七个条带,每个条带宽度为9个像素,也就是竖向上会有63个像素。论文中为了画图的简便,使用了五个条带,每个条带宽度是5个像素。条带的长度就是线段的像素数,与线段长度保持一致。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第6张图片
一个LBD描述子是由每个条带的描述子组合而成的,每个条带的描述子论文中用BDm来表示:
在这里插入图片描述
在计算每个条带的描述子时,首先需要计算当前这个像素的梯度,在此基础上构建局部二维坐标系,根据这个二维坐标系的方向,将每个像素上的梯度投影到这个坐标系上。对于条带j的第k行,根据梯度在坐标系上的投影,对这一行上所有的像素值进行统计,从而得到四个方向上的投影和:
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第7张图片
其中像素在叠加时补充了一个参数λ,这个参数是来自一个高斯分布,目的应该是让条带中间和描述子中间的部分更加突出:
在这里插入图片描述
现在每一行都可以用投影求和的方法,计算出来四个值,那么将一个条带内部所有行放在一起,就得到了这个条带的描述子:
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第8张图片
这里需要注意的是,描述一个条带,并不只有条带内的行要纳入计算,这里是用n在进行约束,w是条带的宽度,根据这个公式的描述,当描述的是第一个或者最后一个条带,对应的就是上面条带示意图里面最上面和最下面的那两个,如果是这两个条带,那么需要对2w个行进行一次计算,其余情况需要对3w个行进行计算,一个条带的宽度是w,也就是说,如果是边缘的两个条带,那么就取相邻的内部的那个条带一起计算,如果是中间部分的条带,那么取相邻的两个条带进行计算。计算出来的条带,也就是BDMj,对其中的值取均值M和方差S,形成一个八自由度的描述子,最后把所有条带的描述子放在一起,就得到了LBD描述子:
在这里插入图片描述

三、普朗克坐标

一种描述线的方法,在三维空间中,取直线上的两个点p1p2,则原点与两个点的连线可以构成两个向量,这里也记为p1p2,令d=p2-p1,m=p1×p2,普朗克坐标就是利用这两个向量去描述这条直线。d没有进行单位化,所以有长度也有方向,而且它的方向刚好就是直线的方向,大小是构成三角形的低。而m是两个向量的叉乘,从向量的角度来看,叉乘的结果依然是一个向量,向量的方向指向两个相乘的向量的垂线方向,大小为向量围成平行四边形的面积,所以m方向指向垂直方向,模的大小为围成三角形面积的两倍。有了这些可以计算出来的量,我们可以利用三角形的面积去搞事情,确定了底边的长度和三角形的面积,实际上就确定了高的长度,也就是线距离中心点的距离,或者说原点到描述的直线的距离,之后再利用两个向量的方向,就可以唯一确定一条直线。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第9张图片

四、EDLines

这里补充一下EDline算法,这个算法主要分为三步:提取像素点、连接像素点和优化。
提取像素点分为四步,首先利用一个滤波核遍历一遍图像,起到一个抑制噪声的作用,之后计算像素梯度,筛选梯度较大的为“锚anchor”,这些锚代表的就是极有可能为线段一部分的点,之后连接锚点从而生成一个初始线段。
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第10张图片
上图是提取过程的一个图示,a是经过高斯滤波之后的灰度图,对这个灰度图计算梯度,求出来b中的梯度图,白色的部分代表梯度高的位置,再从这些点中筛选锚,变成图c的样子,接下来根据梯度信息连接锚点,产生一个初始的线段,就是图d的样子。

体现在代码实现上,代码通过使用cv库中一些现成的函数,得到处理过后的梯度图,筛选锚点的过程是遍历整个梯度图,对于非图像边缘的点,比较上下两个像素的梯度值,其余情况比较左右两个像素的梯度,超过设置的阈值就认为是一个锚点,这样来看的话锚点就是比相邻元素梯度差别较大的点。

产生初始的线段是连接每个锚点所产生的,会存在不光滑的问题,所以需要进行筛选,去除其中不合条件的点,从而让线段更加平滑,这里使用最小二乘法去解决这个问题。

平滑处理之后就是筛选操作,需要中间参数进行合理估计和选择,才能得到适当数量和位置的拟合线段。主要的思路是使用NFA的概念,用NFA去将不合条件的边去掉,这个思想或者说这个算法主要是利用梯度和梯度角的概念,与一般的梯度计算稍微有所区别,论文中使用的公式为:
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第11张图片
这里的检验是在原图的基础上检验的,也就是将前面检测出来的线叠加在原图上,这时候,假设线段的长度为n,计算沿线段的每个像素的梯度角和与线段方向一致的像素点数量k,对于每条线段都计算一个NFA值,如果NFA值小于等于1则认为线段有效,否则舍弃,NFA的计算公式为:
【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法_第12张图片
其中N的四次方表示潜在线段的数量,图片的大小为N×N像素,所以一共有N2个点,每两个点可以连接出一条线段,所以一共有N4条线段。对于这个公式,还剩下一个p需要讨论:
在这里插入图片描述
从公式含义的角度来看,这个NFA值应该就是概率的延伸值,后面的部分实际上是个古典概型的概率,p代表了同方向的概率,将n看作线的长度,或者说是线上像素的个数,那么这个概率模型可以解释为是从长度为n像素的线段上筛选i个像素,这些像素梯度同方向的概率,因为i从k开始取,而k是已经检测出来的同方向的点数,那么这部分求和是不是就是在计算整条候选线真的是一条没问题的线的概率,也就是这个NFA值越大,越代表候选线可能是一条线。

更新一下最新的思路,关于这个NFA的计算公式,因为在LSD中也是用了,而这里使用的公式变成了:
在这里插入图片描述
这里可以看见,后面都会跟一个二项分布的概率值,这个值可以解释为线上同向点数目大于等于待检测线数目的概率,而前面这部分个人感觉用排列组合中的抽样来理解比较好解释。那EDLine的来说,前面的N4可以看作是从N4条线中随机选了一条结果刚好是当前这一条的概率,在这个事情发生的基础上,这条线上同向点多余待检测的点,这个概率值如果很大,说明因为巧合产生你待检测的结果这件事情的概率是比较大的。这就好比你从大街上随便拉了一个人,让他在答题卡上踩了一脚,结果刚好所有答案全踩到了而且还对了一半,不仅拉了一个人是这样,拉了很多人都能做到,这种情况下,你说你认真做得了零分的可信度就很低,很难怀疑你不是脑子有点病。这个例子的情况下,选一个人就对应了N4,而后面的踩一脚答题就是二项分布概率值。

根据这篇论文中进行的实验,这个EDLine算法可以在检测效果差不多的情况下,比LSD速度提升十倍,可以看出这个算法的强大,个人感觉主要的提升点在于锚的筛选,因为LSD是对全部像素进行的操作,找了一个外接矩形然后对内部的像素进行检验,之后再用NFA进行优化筛选,而引入了锚之后,通过连接锚点来代替计算外接矩形,减少了不少的计算量,从而实现了十倍的速度提升。

你可能感兴趣的:(特征匹配,算法,计算机视觉)