特征提取算法--ORB

本文主要参考了一下博客:
http://blog.csdn.net/hujingshuang/article/details/46984411
http://blog.csdn.net/stellar0/article/details/8741676
http://blog.sina.com.cn/s/blog_567a58300101iarh.html

ORB算法的论文来自”ORB: an efficient alternative to SIFT or SURF”,作者是OpenCV维护和开发的公司willowgarage的,论文名字起的很牛气,摘要里说,ORB算法比sift算法效率高两个数量级。江湖上流传的说法是ORB算法综合性能在各种测评里是最好的。

ORB就是BRIEF的改进,BRIEF太简单了,就不介绍了,有兴趣的朋友自己看paper吧。ORB的paper我读下来,感觉改进主要有以下几点:用FAST作为特征点提取的算法,更快了,添加了特征点的主方向,这样就具有了旋转不变性。最后一点其实我也想到了,当时看BRIEF的时候就想应该可以优化,就是ORB采用贪婪穷举的方法得到了相关性较低的随机点对,还有一个改进就是对于随机点对,受噪声的影响很大BRIEF的办法就是对原图像滤波,降低噪声的影响,ORB不在使用像素点的直接比较,而是选择该像素为中心的一个小patch作为比较对象,提高了抗噪能力。

实际上,ORB算法是将FAST角点检测与BRIEF特征描述结合并进行了改进。ORB特征,就是oFAST和rBRIEF的组合。oFast就是带方向的Fast特征点,rBRIEF就是旋转不变性的BRIEF。
1) Fast特征检测算法
FAST只是一种特征点检测算法,并不涉及特征点的特征描述。 FAST的提出者Rosten等将FAST角点定义为:若某像素与其周围邻域内足够多的像素点相差较大,则该像素可能是角点。
特征提取算法--ORB_第1张图片

1、上图所示,一个以像素p为中心,半径为3的圆上,有16个像素点(p1、p2、…、p16)。
2、定义一个阈值。计算p1、p9与中心p的像素差,若它们绝对值都小于阈值,则p点不可能是特征点,直接pass掉;否则,当做候选点,有待进一步考察;
3、若p是候选点,则计算p1、p9、p5、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选点,再进行下一步考察;否则,直接pass掉;
4、若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少9个超过阈值,则是特征点;否则,直接pass掉。
5、对图像进行非极大值抑制:计算特征点出的FAST得分值(即score值,也即s值),判断以特征点p为中心的一个邻域(如3x3或5x5)内,计算若有多个特征点,则判断每个特征点的s值(16个点与中心差值的绝对值总和),若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。得分计算公式如下(公式中用N表示得分,这里写图片描述):
这里写图片描述
上面是FAST-9,当然FAST-10、FAST-11、FAST-12也是一样的,只是步骤4中,超过阈值的个数不一样。FAST算法实现起来简单,尤其是以速度快著称。
以上便是FAST特征检测的过程,清晰明了,而对于角点的定义也是做到了返璞归真,大师就是大师,还原本质的能力很强,估计以前这种简单想法被很多人忽略了。

在ORB中Fast算法得到改进,
1、假设在图像中要提取N个特征点,则降低FAST的阈值,使FAST算法检测到的特征点大于N;找此keypoint不是为了直接用这个点的坐标去求特征,而是根据此点的位置计算这个patch的方向,再用这个方向去steer原始的BRIEF。
2、在特征点位置处,计算特征点的Harris响应值R,取前N个响应值大的点作为FAST特征点(Harris角点响应计算:Harris角点检测中的数学推导);
3、由于要解决BRIEF算法的旋转不变性,则需要计算特征点的主方向。
ORB中利用重心来计算,如下(其中(x,y)是特征邻域内的点):
这里写图片描述
这里写图片描述
这里写图片描述
atan2表示反正切,得到的θ值就是FAST特征点的主方向。
FAST算法不能处理多尺度图像,如果需要处理多尺度的话,就对原来的图像作金字塔,然后对每个图都进行步骤2和3的处理。解决尺度不变性的问题。

2) BRIEF特征描述
BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度直方图描述特征点的传统方法,大大的加快了特征描述符建立的速度,同时也极大的降低了特征匹配的时间,是一种非常快速,很有潜力的算法。
算法步骤如下:
1、为减少噪声干扰,先对图像进行高斯滤波(方差为2,高斯窗口为9x9)。
2、以特征点为中心,取SxS(31x31)的邻域窗口。在窗口内随机选取一对(两个)点,比较二者像素的大小,进行如下二进制赋值。
这里写图片描述
其中,p(x),p(y)分别是随机点x=(u1,v1),y=(u2,v2)的像素值。
3、在窗口中随机选取N对随机点,重复步骤2的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。(一般N=256)
以上便是BRIEF特征描述算法的步骤。
关于一对随机点的选择方法,原作者测试了以下5种方法,其中方法(2)比较好。
特征提取算法--ORB_第2张图片
优点:计算速度快
缺点:对噪声敏感(因为二进制编码是通过比较具体像素值来判定的),不具备旋转不变性,不具备尺度不变性。

ORB算法主要解决前两个缺点:噪声敏感、旋转不变性。
1、解决噪声敏感问题
BRIEF中,采用了9x9的高斯算子进行滤波,可以一定程度上解决噪声敏感问题,但一个滤波显然是不够的。ORB中提出,利用积分图像来解决:在31x31的窗口中,产生一对随机点后,以随机点为中心,取5x5的子窗口,比较两个子窗口内的像素和的大小进行二进制编码,而非仅仅由两个随机点决定二进制编码。(这一步可有积分图像完成)。
2、解决旋转不变性
为了把steered BRIEF方差增大,相关性降低,用了一种穷举方法挑选binary test。binary test应该包括
:1)怎么选抽样点,2)那个像素比较完后怎么组合各bit形成bit串,这个跟点对比较结果的排列的顺序有关的。
本文用了穷举的方法挑点对,而不是原始BRIEF中用高斯等分布抽样点对。具体理解大概如下:
1)取一个点对(两个对)一共有M种取法,针对所有训练用的patches,每一个patch都根据这M种binary
tests取点,做像素比较测试,得到0/1一个bit。因为一共有300k个关键点,所以这一步可以得到一个300k*M的矩阵,每个元素都是0或1。
2)对该矩阵的每个列向量,即每个binary test(包括选点对的两点位置及像素比较),计算其均值,然后它们重新排序,均值越接近0.5的,排越前面。排好后,组成一个向量(实际上是个矩阵),管它叫T。
3)贪婪搜索:从T中把排第一的那个binary test放到R中,T中就没有这个测试了;然后把T中排下一个的点对与R中所有测试求相关,如果相关值超过某一事先设定的阈值,就扔了它,否则就把这个点对像素比较放到R里面;重复上一步直到R中有256个测试为止。如果全找完了也不够256个,就把阈值升高一些,再重试一遍。
利用FAST中求出的特征点的主方向θ,对特征点邻域进行旋转,Calonder建议先将每个块旋转后,再进行BRIEF描述子的提取,但这种方法代价较大。ORB算法采用的是:每一个特征点处,对产生的256对随机点(以256为例),将其进行旋转,后进行判别,再二进制编码。如下:S表示随机点位置(2xn的矩阵),Sθ表示旋转后的随机点的位置(2xn的矩阵),x1=(u1,v1)是一个坐标向量,其余雷同。n=256。
这里写图片描述
这里写图片描述
这里写图片描述
得到新的随机点位置后,利用积分图像进行二进制编码,即可。

3)利用BRIEF特征进行配准
经过上面的特征提取算法,对于一幅图中的每一个特征点,都得到了一个256bit的二进制编码。接下来对有相似或重叠部分的两幅图像进行配准。
特征配对是利用的汉明距离进行判决:
1、两个特征编码对应bit位上相同元素的个数小于128的,一定不是配对的。
2、一幅图上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对。

你可能感兴趣的:(SLAM,OpenCV)