本文转自:http://blog.csdn.net/GH_HOME/article/details/51511471
1. 定义
ORB (Oriented FAST and Rotated BRIEF),是一种特征检测算子,其特征点的性能介于SIFT和SURF之间,但是其速度是SURF算法速度的10倍。
2. 特性
速度快:基本上在特征检测算子方面借鉴了FAST特征检测算子,在特征描绘子方面借鉴了brief特征描绘算子,这两个方法都比较快。
具备旋转不变性,对噪声不敏感。
3. 算法流程
1. 特征检测部分
在特征检测部分,ORB采用了FAST的特征检测算法,同时对其进行改进,使其具有尺度不变性和旋转不变性。
如何计算一个特征点的方向呢?首先我们在计算FAST特征点的时候要在一个邻域内,这个领域的中心点设为C,同时我们找出这个图像邻域内的重心位置P,那么C与P的连线方向便是该特征点的方向。那么如何计算一个patch内的像素重心呢?方法是Image moment。
1.1 图像重心计算
首先,从概率上来讲,一个一阶随机变量X在c点的k阶矩定义如下:
特别的,有以下两种情况:
1.c=0,此时 成为的k阶中心矩
2.c= ,此时 成为的k阶中心矩
对于2维pq阶矩的计算可见下式。
一般而言,零阶矩是物体的质量,一阶矩和零阶矩可以算出物体的中心,而二阶矩是用来计算物体的方向的。拿图像出来来说,图像可以看成是一个平板的物体,其一阶矩和零阶矩就可以拿来计算某个形状的重心,而二阶矩就可以拿来计算形状的方向。
首先对图像而言, 代表了图像像素在x方向上的偏重,这就是重心的x坐标。(x加权的总量与总重量相比显示出来了x在哪里(图像的哪一列)的时候像素值较大)。同样的,代表了图像像素在y方向上的偏重,这就是重心的y坐标。
因此,重心坐标为
1.2 带有方向特征的FAST特征点
在计算出特征点所在patch的重心之后,可以定义特征点的方向,即为patch中心与重心连线的向量,其角度为
此外,为了更好的描述旋转不变性,我们还可以把patch设计为圆形,这样对于各个方向更加公平。
在表征点的方向的时候,除了上述的基于重心和中心连线的方向的方法,还有两种方法:1.MAX法:利用patch内最大的梯度方向作为特征点的方向。
2.BIN法: 在patch内做一个梯度直方图,直方图之间的方向取样间距为10度,类似于sift提取方向的方法,选取梯度直方图中最大值对应的方向为特征点的方向。 然而这两种方法都不如重心和中心连线的方向的方法,具体的性能对比如下图所示
在图像噪声不断加大的情况下,基于重心和中心连线的方向的方法性能最优。
1.3 更多ORB特征检测的细节
- 尺度不变性: FAST特征点不是多尺度的特征点,我们在图像上建立尺度金字塔,在每一层金字塔上都做一次FAST特征检测,之后再利用Harris算法去除部分不合理的特征点
- 在ORB的原文中,采用的FAST特征点是FAST-9,也就是以9为半径的patch
2.特征描述部分
ORB的特征描述是基于BRIEF特征点的改进算法。我们首先介绍BRIEF算法,再介绍ORB改进的带有方向的BRIEF算子。
2.1 BRIEF特征描述子
首先对图像进行平滑滤波(这一点很重要),之后再特征点周围设计一个patch,brief描述子就是基于这个patch中特征点之间像素比较的01二进制串,其取0还是取1满足以下方程
这是生成BRIEF描述子的一次binary test。其中 代表在x处像素的值。
一个BRIEF特征点可以定义为一个包含n次binary test的向量。
这样就在数学上形成了一串二进制码,而 是此二进制码在每一位的值。
下面是一些技术细节
1. 我们的binary test怎么选择点对?对哪些点做test?
虽然有很多binary test选择的点的分布方法,设我们处理的是的patch大小,我们的对做binary test的x和y点的选择有以下几种
- x和y都服从均匀分布,均匀的分布在patch中
- x与y服从高斯分布,, 这样代表着patch中距离中心点近的点对容易被选中做binary test
把p固定为(0,0),q在周围随机采样
我们选择第二种
- 我们的n选多少个?做多少次test
在ORB的原文中选择做256次,所以生成的brief的vector有256维。我们可以设置为128,256或512,这三种参数在OpenCV中都有提供,默认256. - BRIEF特征点的匹配
直接对两个二进制串采用汉明距离来匹配,就是查看二进制串对应位上有多少不一样。
- 我们的n选多少个?做多少次test
BRIEF性能评价
1:不具备旋转不变性
2:对噪声敏感
3:不具备尺度不变性
4:在速度上是surf的10倍。
2.1 ORB特征描述子
下面介绍ORB如何改进BRIEF使之具备旋转不变性。
对于做过n次binary test的点对定义一个大小的矩阵
通过patch的方向来计算一个旋转矩阵,之后我们更改S矩阵为
那么此时由 中点的顺序得来的新的binary test,我们定义此时的BRIEF descriptor为
在这个位置,ORB的作者说是将360度离散为30份,建立一个查找表来预计算BRIEF patterns,一旦特征点的方向与全局的view一致,那么就采用此时的来计算BRIEF descriptor。这一点有点不清楚,希望有读者知道的话能指导我一下,谢谢!
附上原文链接: ORB: an efficient alternative to SIFT or SURF
附上OpenCV3.1.0在ORB上的讲解 :http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_orb/py_orb.html