参考:
- https://zhuanlan.zhihu.com/p/91479558
- https://zhuanlan.zhihu.com/p/36382429
- https://zhuanlan.zhihu.com/p/61738607
- https://blog.csdn.net/frozenspring/article/details/78146076
为什么要引入ORB
在ORB之前,有SIFT、SURF,虽然具有良好的旋转不变性、光照不变性等,但这两个检测方法需要的时间实在是有些长,尤其是SIFT。下图是ORB文献里提到的每种方法检测一帧图像(640*480)所用的时间:
可以看出来,ORB在速度上的确是快很多。
什么是ORB
ORB全称是Oriented FAST and Rotated BRIEF,是目前最快速稳定的特征点检测和提取算法,许多图像拼接和目标追踪技术都是利用ORB特征进行实现。
ORB=Oriented FAST + Rotated BRIEF
FAST
全称:Features From Accelerated Segment Test
主要特点就是速度快。
Rosten等人将FAST角点定义为:若某像素点与其周围邻域内足够多的像素点处于不同的区域,则该像素点可能为角点。
Step1 确定候选角点
- 选择要判断的像素 p p p,其像素值为 I p I_p Ip。以 p p p 为圆心,半径为3,能得到离散化的Bresenham圆,这个圆的边界上有16个像素,分别记为 p 1 , p 2 . . . p 16 p_1,p_2...p_{16} p1,p2...p16。
- 设定一个阈值 t t t,例如 I p I_p Ip的20%。
- 让圆上的像素点的像素值与中心点
p
p
p做差,如果有连续 n个点的像素值都大于
I
p
+
t
I_p+t
Ip+t或小于
I
p
−
t
I_p-t
Ip−t,那就把这个中心点作为一个候选角点。根据经验,一般取n=12,即为FAST-12,有时候也会取9或11,分别被称为FAST-9、FAST-11。
(看文献的时候好像是取的FAST-9???)
补充:
在特征检测过程中,一幅图像中绝大多数点都不是特征点,在确定候选角点的过程中,如果每个点都要进行周围16个像素点的计算比较,未免太浪费时间了。于是提出了一种高效的测试来快速排除一大部分非角点的像素:该方法仅检查第1、5、9、13号(即上下左右四个点)的像素值,首先检测1和9,如果满足条件,再检测5和13。这样做的原因是如果p是一个角点,超过四分之三圆的部分应该满足判断条件,所以当1、5、9、13中至少有三个点都大于 I p + t I_p+t Ip+t或小于 I p − t I_p-t Ip−t才有可能是一个角点,然后才继续对其他像素点进行判断,否则直接剔除。
上面的算法效率实际上是很高的,但是有点一些缺点:
- 当我们设置n<12时就不能使用快速算法来过滤非角点的点;
- 检测出来的角点不是最优的,这是因为它的效率取决于问题的排序与角点的分布;
- 对于角点分析的结果被丢弃了;
- 多个特征点容易挤在一起。
Step2 非极大值抑制
经过第一步的检测,得到了很多候选特征点,但有个问题是:这些特征点很可能是“挤”在一起的,所以需要对这些点再次进行筛选。可以采用非极大值抑制的方法解决这个问题。
- 为每一个检测到的特征点计算它的响应值 V V V,即为点 p p p 和它周围16个像素点的绝对偏差的和;
- 比较相邻特征点(例如设定一个阈值半径,比较两点的距离)的响应值;
- 剔除响应值较小的特征点,即把非最大的角点抑制掉。
到这FAST特征点检测的步骤介绍完了…
FAST缺点:
缺少尺度不变性和旋转不变性
Oriented FAST
FAST角点本身不具有方向,但是在特征点匹配的时候是需要的,所以在ORB中,对FAST做了改进,改进后的称为Oriented FAST,具有尺度和旋转的描述。
旋转不变性 ----- 灰度质心法
灰度质心法假设角点的灰度和质心存在偏移,这个向量能够计算出一个方向。
- 以像素
p
p
p 为中心,设定一个图像块,计算图像块的矩
- 通过矩可以计算得到图像块的质心C
- 连接图像块的几何中心
p
p
p 和质心C,得到一个方向向量 OC(假设OC上有个箭头,表示向量),这就是特征点p的方向。
θ=atan2( m 01 , m 10 m_{01},m_{10} m01,m10)
从上图可以看出来,灰度质心法(IC)在人工旋转噪声影响下,与直方图算法和MAX算法相比,具有最好的恢复主方向的性能。
尺度不变性 ----- 构造图像金字塔
- 对图像做不同尺度的高斯滤波;
- 对图像做降采样(隔点采样)
- 对金字塔的每一层都提取FAST特征点
- n幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。
BRIEF描述子
全称:Binary Robust Independent Elementary Features
2010年提出的,是对已有特征点进行描述的一种二进制描述子,摒弃了利用区域灰度直方图描述特征点的传统方法,采用二进制、位异或运算,大大加快了特征描述符建立的速度,同时也降低了特征匹配的时间。
- 为减少噪声影响,需要先对图像进行滤波;
- 以特征点为中心,在特征点周围选择一个Patch;
- 在这个Patch内通过一种选定的方法来挑选出来
n
d
n_d
nd(一般为256)个点对。 对于每一个点对
(
p
,
q
)
(p,q)
(p,q),我们来比较这两个点的亮度值,如果
I
(
p
)
>
I
(
q
)
I(p)>I(q)
I(p)>I(q)则这个点对生成了二值串中一个的值为1,如果
I
(
p
)
<
I
(
q
)
I(p)<I(q)
I(p)<I(q),则对应在二值串中的值为-1,否则为0。
- 所有 n d n_d nd个点对,都进行比较之间,我们就生成了一个 n d n_d nd 长的二进制串。
这个特征可以由
n
d
n_d
nd位二进制测试向量表示,BRIEF描述子:
这里面,最关键的就是随机特征点对的选取:
设我们在特征点的邻域块大小为 S × S S×S S×S内选择 n d n_d nd个点对 ( p , q ) (p,q) (p,q),Calonder的实验中测试了5种采样方法:
1)在图像块内平均采样, ( − S 2 , S 2 ) (-\frac{S}{2},\frac{S}{2}) (−2S,2S);
2) p p p 和 q q q 都符合 ( 0 , 1 25 S 2 ) (0,\frac{1}{25}S^2) (0,251S2)的高斯分布,准则采样服从各向同性的同一高斯分布;
3) p p p 符合( ( 0 , 1 25 S 2 ) (0,\frac{1}{25}S^2) (0,251S2)的高斯分布,而 q q q 符合 ( x i , 1 100 S 2 ) (x_i,\frac{1}{100}S^2) (xi,1001S2)的高斯分布,采样分两步进行:首先在原点处为 p p p 进行高斯采样,然后在中心为 p p p 处为 q q q 进行高斯采样;
4) p , q p,q p,q 在空间量化极坐标下的离散位置处进行随机采样;
5)把 p p p 固定为 ( 0 , 0 ) (0,0) (0,0), q q q 空间量化极坐标下的离散位置处进行随机采样;
这5种方法生成的256对(OpenCV中用32个字节存储这256对)随机点如下(一条线段的两个端点是一对):
经过上面的步骤,我们就可以为每个特征点表示为一个256bit的二进制编码。
Hamming距离
描述子主要就是为了进行特征匹配,那BRIEF描述子是怎么实现匹配的呢-----Hamming 距离
汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
- 两个特征编码对应bit位上相同元素的个数小于128的,一定不是配对的。
- 一幅图上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对。
其实就是按位求异或的过程。(相同为0,不同为1)
BRIEF的耗时非常短,在相同情形下计算512个特征点的描述子时,SURF耗时335ms,BRIEF仅8.18ms;匹配SURF描述子需28.3ms,BRIEF仅需2.19ms。在要求不太高的情形下,BRIEF描述子更容易做到实时。
但是对于BRIEF来说,描述子里不包含旋转属性,所以一旦匹配图片有稍微大点的旋转角度,按照Hamming算法,匹配度将会大幅下降。
改进的BRIEF
Steered BRIEF — 旋转不变性改进
在使用oFast算法计算出的特征点中包括了特征点的方向角度。假设原始的BRIEF算法在特征点SxS(一般S取31)邻域内选取n对点集。经过旋转角度θ旋转,得到新的点对,在新的点集位置上比较点对的大小形成二进制串的描述符。这里需要注意的是,在使用oFast算法是在不同的尺度上提取的特征点。因此,在使用BRIEF特征描述时,要将图像转换到相应的尺度图像上,然后在尺度图像上的特征点处取SxS邻域,然后选择点对并旋转,得到二进制串描述符。
- ORB算法进一步增强描述子的抗噪能力,采用积分图像来进行平滑;
- 在特征点的31x31邻域内,产生随机点对,并以随机点为中心,取5x5的子窗口。
- 比较两个随机点的子窗口内25个像素的大小进行编码(而不仅仅是两个随机点了)
ORB算法采用关键点的主方向来旋转BEIEF描述子
最后,rBRIEF-改进特征点描述子的相关性
使用steeredBRIEF方法得到的特征描述子具有旋转不变性,但是却在另外一个性质上不如原始的BRIEF算法。是什么性质呢,是描述符的可区分性,或者说是相关性。这个性质对特征匹配的好坏影响非常大。描述子是特征点性质的描述。描述子表达了特征点不同于其他特征点的区别。我们计算的描述子要尽量的表达特征点的独特性。如果不同特征点的描述子的可区分性比较差,匹配时不容易找到对应的匹配点,引起误匹配。
ORB论文中,作者用不同的方法对100k个特征点计算二进制描述符,对这些描述符进行统计,如下表所示:
特征描述子的均值分布。X轴代表距离均值0.5的距离;y轴是相应均值下的特征点数量统计
我们先不看rBRIEF的分布。对BRIEF和steeredBRIEF两种算法的比较可知,BRIEF算法落在0上的特征点数较多,因此BRIEF算法计算的描述符的均值在0.5左右,每个描述符的方差较大,可区分性较强。而steeredBRIEF失去了这个特性。
至于为什么均值在0.5左右,方差较大,可区分性较强的原因,这里大概分析一下。这里的描述子是二进制串,里面的数值不是0就是1,如果二进制串的均值在0.5左右的话,那么这个串有大约相同数目的0和1,那么方差就较大了。用统计的观点来分析二进制串的区分性,如果两个二进制串的均值都比0.5大很多,那么说明这两个二进制串中都有较多的1时,在这两个串的相同位置同时出现1的概率就会很高。那么这两个特征点的描述子就有很大的相似性。这就增大了描述符之间的相关性,减小之案件的可区分性。
下面我们介绍解决上面这个问题的方法:rBRIEF。
原始的BRIEF算法有5种去点对的方法,原文作者使用了方法2。为了解决描述子的可区分性和相关性的问题,ORB论文中没有使用5种方法中的任意一种,而是使用统计学习的方法来重新选择点对集合。
首先,建立300k个特征点测试集。
备注:
对于测试集中的每个点,预处理参考第一个步骤。考虑其31x31邻域。这里不同于原始BRIEF算法的地方是,这里在对图像进行高斯平滑之后,使用邻域中的某个点的5x5邻域灰度平均值来代替某个点对的值,进而比较点对的大小。这样特征值更加具备抗噪性。另外可以使用积分图像加快求取5x5邻域灰度平均值的速度。
其次,特征点选取
从上面可知,在31 x 31的邻域内共有(31-5+1)x(31-5+1)=729个这样的子窗口,那么取点对的方法共有M=205590种,我们就要在这M种方法中选取256种取法,选择的原则是这256种取法之间的相关性最小。怎么选取呢?
- 在300k特征点的每个31x31邻域内按M种方法取点对,比较点对大小,形成一个300k x M的二进制矩阵Q。矩阵的每一列代表300k个点按某种取法得到的二进制数。
- 对Q矩阵的每一列求取平均值,按照平均值到0.5的距离大小重新对Q矩阵的列向量排序,形成矩阵T。
- 将T的第一列向量放到R中
- 取T的下一列向量和R中的所有列向量计算相关性,如果相关系数小于设定的阈值,则将T中的该列向量移至R中。
- 按照第四步的方式不断进行操作,直到R中的向量数量为256。
通过这种方法就选取了这256种取点对的方法。这个算法是对均值靠近0.5的不相关测试进行贪婪搜索,结果称为rBRIEF。rBRIEF在方差和相关性上与旋转BRIEF相比有明显进步(如图4)。PCA的特征值较高,它们的下降速度要快得多。
图解:三个特征向量超过100k个关键点的PCA分解的特征值分布:BRIEF,旋转BRIEF,和rBRIEF。
BRIEF描述子的点对是随机生成的,一个自然的疑问是不同的随机序列带来的效果是否一致?显然答案是否定的。
现在看不懂,回头再看:
为了找出更优的描述量,我们从大数据集中提取了300k个特征点,对每个特征点使用M个不同的随机点对序列组成不同的向量,并合成一个300k×M300k×M的矩阵,矩阵每一列代表使用点对ppippi取得的二进制数。将这些列向量按照他们的variance从大到小排列。然后使用贪心算法去掉相关度过高的列向量,取得最优的256个向量对应的点对位置。通过这些位置得到的描述量称为rBRIEF描述量。这是所谓的全局最优点对序列。ORB特征即采用了这个描述子。
至此,ORB的优化就结束了。我们尝试总结一下:
- FAST是用来寻找特征点的。ORB在FAST基础上通过金字塔、质心标定解决了尺度不变和旋转不变。即oFAST。
- BRIEF是用来构造描述子的。ORB在BRIEF基础上通过引入oFAST的旋转角度和机器学习(???)解决了旋转特性和特征点难以区分的问题。即rBRIEF.