特征点匹配——ORB算法介绍

《ORB: an efficient alternative to SIFT or SURF》是Rublee等人在2011年的ICCV上发表的一篇有关于特征点提取和匹配的论文,这篇论文介绍的方法跳出了SIFT和SURF算法的专利框架,同时以极快的运行速度赢得了众多青睐。下面我简单介绍一下ORB算法的流程。

ORB算法的主要贡献如下:

(1)为FAST算法提取的特征点加上了一个特征点方向;

(2)使用带方向的BRIEF算法高效的对特征点描述符进行计算;

(3)分析了BRIEF算法得到的特征点描述符的方差和关联性;

(4)介绍了一种基于学习的去特征点关联性的BRIEF算法,优化了特征点求得的最近邻点。

下面我按照论文的结构对ORB算法进行介绍。

1、oFAST: FAST Keypoint Orientation

1.1 FAST Detector

ORB算法使用的是FAST算法提取的特征点(FAST算法的详细介绍会在以后的博文中提出),在作者的实验中使用的FAST-9的算法,得到了很好的结果。

由于边缘位置对FAST算法得到的特征点有很大的影响,因此作者使用了Harris 角点检测方法对于得到的特征点进行排序,取前N个较好的角点作为特征点。

FAST算法是一种非常快的提取特征点的方法,但是对于这里来说,有两点不足:

(1)提取到的特征点没有方向;

(2)提取到的特征点不满足尺度变化。

针对特征点不满足尺度变化,作者像SIFT算法中那样,建立尺度图像金字塔,通过在不同尺度下的图像中提取特征点以达到满足尺度变化的效果。

针对提取到的特征点没有方向的问题,作者采用了Rosin提出的一种称为“intensity centroid”的方法确定了特征点的方向。

那么,就来看一下确定特征点方向的方法。

1.2 Orientation by Intensity Centroid

这种方法的主要思想就是,首先把特征点的邻域范围看成一个patch,然后求取这个patch的质心,最后把该质心与特征点进行连线,求出该直线与横坐标轴的夹角,即为该特征点的方向。

那么,怎么求取这个邻域的质心呢?

论文中提到Rosin定义了如下公式: mpq=∑x,yxpyqI(x,y) 然后质心定义为: C=(m10m00,m01m00) 然后求取向量 OC 的方向,同时如果把 x,y 的范围保持在 [?r,r] 之间( r 为该特征点邻域的半径),以特征点为坐标原点,则得到的方向角为 θ=atan2(m01,m10)

作者在论文中提到,这种算法比BIN和MAX这两种求取特征点方向的方法都要好。

2、rBRIEF: Rotation-Aware Brief

2.1 Efficient Rotation of the BRIEF Operator Brief overview of BRIEF

下面我们队BRIEF算法进行一个简单的回顾:

BRIEF算法提取得到的特征点描述符是一个二进制的字符串,建设当前的一个特征点的邻域空间patch,设为 p ,那么对该面片 p 定义的一个二进制测试 τ(p;x,y):={1:p(x)<p(y)2:p(x)≥p(y)}< nobr="">其中 p(x) 表示的是在点 x 处的图像灰度值,那么这样我们就可以得到一个 n 位的二进制串 fn(p):=∑1≤i≤n2i?1τ(p;xi,yi) 对于 x和y 的坐标分布在本文中使用的是以特征点为中心的高斯分布,这种分布情况在Brief的论文原文中被证明是最好的。同样,本文中选择的 n=256 。

考虑到图像中有噪声的干扰,在实际的求取特征点描述符的过程中,需要对图像进行平滑操作。论文中使用的方法是,在对比操作 τ 进行的时候,不是对比的一个点,而是对比的在 31?31 的patch中的若干个 5?5 的子窗口。

上面就是BRIEF算法的一个简单回顾,BRIEF算法形成的描述符对于旋转操作非常敏感,当旋转的角度增大时,利用BRIEF算法的描述符进行匹配的结果极大的降低。如下图所示:不同的算法随着旋转的程度的增大匹配结果趋势

图中x轴表示的是旋转的角度,y轴表示匹配结果中正确匹配所占的百分比。可以看出,随着旋转角度的增大,BRIEF算法的匹配效果迅速的降低,旋转角度在45度以上时,正确率几乎为0。那么这就引出了我们接下来要介绍的Steered BRIEF算法。

Steered BRIEF算法介绍

想要让BRIEF算法具有旋转不变性,那么我们需要使特征点的邻域旋转一个角度,该角度就是我们上面求得的特征点的方向角 θ 。但是这样整体旋转一个邻域的开销是比较大的,一个更加高效的做法就是旋转我们前面得到的那些邻域中的匹配点 xi、yi 。

设生成特征点描述符的 n 个测试点对为 (xi,yi) ,定义一个 2×n 的矩阵 S=(x1,y1,......,xn,yn) 利用角度 θ 形成的旋转矩阵为 Rθ ,那么旋转后匹配点的坐标为 Sθ=RθS 这样,在求取特征点描述符的时候,就使用 Sθ 中的像素点即可。

2.2 Variance and Correlation

作者提到,BRIEF的一个比较好的特性是,对于所有的特征点上的每一位(bit)上的值的平均值都非常接近0.5(这里的平均值比较难理解,举个例子,比如说 n 个特征点中的所有的第 i 位的平均值),同时平均值的分布的方差较大。这样很显然有一个好处,就是方差越大说明数据的差异性越大,也就是说更能很好的区分不同的点。下图为作者取100k个特征点中的256位中各位的平均值分布,其中横坐标为平均值与0.5的差值,纵坐标是位的个数:

这里写图片描述

可以看出BRIEF的所有特征点各个位上的平均值分布为以0.5为均值,方差很大的一个高斯分布。

同样看上面这个图,我们发现steered BRIEF算法的结果中,所有特征点在各个位上的平均的分布则比较平均,这是因为进行旋转角度 θ 以后,均值就漂移到更加均衡的模式。

作者同时对BRIEF、Steered BRIEF和rBRIEF(后面会讲到)提取的100k个特征点的描述符进行PCA提取主成份,根据得到的特征值进行分析,如下图所示:

这里写图片描述

可以看出BRIEF和Steered BRIEF中前几个特征值比较大,那么基本上所有的信息都集中在这这面的若干维中,而Steered BRIEF算法得到的特征值比BRIEF的特征值小很多,因此Steered BRIEF得到的描述符的方差分布小,也就意味的区分能力比较差。

我们从另一个角度也可以证实这一点,如下图所示,实线表示的是匹配成功的点的距离的分布,虚线表示的是匹配失败的点的距离的分布,横坐标是距离,纵坐标是频率:

这里写图片描述

可以看出相比BRIEF和rBRIEF,steered BRIEF得到的匹配结果中,匹配失败的点的距离分布的平均值推左(论文中的push left,其实就是平均值偏小)了,这也就造成了成功和失败的点的距离中有更多的交集。同时也就意味着匹配结果的不理想。

2.3 Learning Good Binary Features

为了弥补Steered BRIEF算法造成的方差变小的缺陷,同时降低各个特征点的邻域内的匹配点对的相关性,作者使用了一种学习的方法来从邻域的所有可能的匹配点对中选出一个表现较好的子集用来生成特征点描述符。

作者首先从PASCAL 2006的图像库中提取了300k个特征点作为训练集,然后从每个特征点的 31×31 大小的邻域中穷举出所有可能的 5×5 的匹配子窗口。假设 wp 为总邻域的边长, wt 作为子窗口的边长,那么再这个邻域中一共有 N=(wp?wt)2 个子窗口存在,从其中任意挑选2个子窗口,则有 (N2) 种可能的选择,然后去掉其中重叠的子窗口的匹配可能,对于作者的实验中,总共有205590种可能的匹配子窗口。

然后算法运行如下:

(1)对于每个特征点的邻域中所有可能的子窗口进行匹配,则得到205590个匹配结果,这作为一行,由于一共有300k个特征点,因此能够形成一个 300000×205590 的矩阵;

(2)对于这个矩阵,求各列的平均值,并按照离0.5的大小从小到大进行排序,并记录每列是由哪一对位置 x和y 的比较构成的,每队看做一个元素,构成向量 T ;

(3)贪婪搜索:

*(a)取出距离0.5最近的两个位置放到 R ,并在 T 中删除;

(b)在去除 T 中距离0.5最近的两个位置,判断该位置与 R 中已经存在的关联性是否达到阈值,如果达到则抛弃当前的位置,如果没有达到则把它加入到 R 中;

(c)反复执行(a)、(b)中的操作,直到 R 中有256对,如果执行一遍没有达到256,那么提高(b)中的阈值,再次进行此操作,直到选出256对为止。*

利用这样搜索出来的256对位置生成特征点描述符的方法就是我们前面提到的rBRIEF。

至此我们讲的oFAST + rBRIEF即为ORB算法。

 

FAST算法简单介绍

FAST算法是ECCV 2006上发表的Machine learning for high-speed corner detection上提出的,从论文名字中就可以看出,这是一种检测特征点的方法。

具体内容如下:

判别特征点 p 是否是一个特征点,可以通过判断以该点为中心画圆,该圆过16个像素点。设在圆周上的16个像素点中是否最少有 n 个连续的像素点满足都比 Ip+t 大,或者都比 Ip?t 小。(这里 Ip 指的点 p 的灰度值, t 是一个阈值)如果满足这样的要求,则判断 p 是一个特征点,否则 p 不是。在原论文中 n 的值一般设为12。

如下图所示:

这里写图片描述

由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然会浪费许多时间,因此论文中采用了一种进行非特征点判别的方法。如上图中,对于每个点都检测第1、5、9、13号像素点,如果这4个点中至少有3个满足都比 Ip+t 大或者都比 Ip?t 小,则继续对该点进行16个邻域像素点都检测的方法,否则则判定该点是非特征点,直接剔除即可。

另外,对每个特征点设一个 bool 变量 Kp ,用来表示是否为角点, Kp=true 为角点。

阶段2对上面得到的特征点集进行训练,使用 ID3 算法建立一棵决策树,假设通过使用第 x 个像素点进行决策树的划分,那么对集合 P 得到的熵 K 是 H(P)=(c+cˉ)log2(c+cˉ)?clog2c?cˉlog2cˉ 其中 c 为角点的数目, cˉ 为非角点的数目。

由此得到的信息增益为 H(P)?H(Pd)?H(Ps)?H(Pb) 然后选择使信息增益最大位置进行分割,最终得到这棵决策树。以后再有类似的场景进行特征点检测时,则使用该决策树进行检测。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值