ORB特征提取,python orb特征匹配
网上有很多方法来说明ORB特征的提取和描述,但并不详细。为了了解发生了什么,我们只能结合别人的博客和原著来研究和学习ORB的详细原理。如果有什么不对的,请照顾我。
1、算法介绍
orb(orientedfastandrotedbrief)是一种加速特征点提取和描述的算法。该算法分为特征点提取和特征点描述两部分,分别是Ethan Rublee、Vincent Rabaud、前舞蹈家Konolige和charming panda R.Bradski在2011年提出的“ORB:an affiliate nationalization”ORB算法。特征提取是由FAST(featuresfroaccelerated Segment Test)算法发展而来,特征描述是BRIEF(binarybrobustindependent elementary features)特征描述算法ORB feature结合快速特征点检测方法和Brief feature descriptor,在它们的基础上进行改进和优化。据说ORB算法比sift算法快100倍,比surf算法快10倍。1.1快速特征提取ORB算法特征提取由快速算法改进,其中ofast(fastkeypointorientation)。也就是说,使用FAST提取特征点后,通过定义特征点的方向,使得特征点的旋转不失真。快速算法是公认的最快的特征点提取方法。快速算法提取的特征点是非常接近的角点类型。AST的算法如下。
图1快速特征点判断图
步骤一:粗抽。这一步可以提取很多特征点,但是有相当一部分特征点质量很低。介绍提取方法。如上图1所示,从图像中选择了点P。判断该点是否为特征点的方法是以p为圆心,画一个半径为3像素的圆,在圆周上连续n个像素点的灰度值大于或小于p点灰度值的情况下,以p为特征点。n通常设置为12。为了加快特征点的提取,快速去除非特征点,首先检测位置1、9、5、13的灰度值。如果P是特征点,则检测是否有三个以上的像素值大于或小于这四个位置的P点的灰度值。如果不满意,直接排出这一点。
步骤二:通过机器学习筛选最佳特征点。简单来说,就是用ID3算法训练一棵决策树,将特征点圆周上的16个像素输入决策树,选出最好的快速特征点。
步骤三:抑制并移除除最大值以外的局部密集特征点。非极大值抑制算法用于消除邻域内特征点多的问题。计算每个特征点的响应大小。计算方法是特征点P与其周围16个特征点偏差的绝对和。在接近的特征点中,保留响应值较大的特征点,删除剩余的特征点。
步骤四:特征点比例不变形。构建金字塔,实现特征点的多尺度不变性。设置比例因子(pencv的默认值为1.2)和金字塔级数nlevels(pencv的默认值为8)。根据比例因子将原始图像缩小为nlevels图像。缩放后的图像为I=I/ScaleFactork (k=1,2,nlevels)。从不同比例的n级图像中提取特征点之和,作为图像的最大特征点。
步骤五:特征点的旋转不变性。提出了用矩量法确定快速特征点方向的ORB算法。即根据力矩,计算半径范围内以R为重心的特征点,形成特征点坐标到重心的向量。扭矩的定义如下。
这里,I(x,y)是图像的灰度表示。力矩的重心如下
如果角坐标为O,则向量的角度就是其特征点的方向。计算公式如下。
1.2 rBRIEF特征描述
通过在简短特征描述中加入旋转因子,改进了径向基函数特征描述。本文首先介绍了BRIEF的特征提取方法,然后说明了如何对其进行修改。
BRIEF算法描述
BRIEF算法计算二进制字符串的特征描述符。它选择特征点附近的n对像素点pi,qi (I=1,2,…,n)。然后比较每个点对的灰度值。I(pi) I) qi),则生成二进制列中的1,否则为0。比较所有的点对会生成一个长度为n的二进制字符串,一般n是128,256或者512,opencv默认是256。另外,值得注意的是,为了提高特征描述子的抗干扰能力,算法首先需要对图像进行友好的笔刷平滑处理。在ORB算法中,这一点得到了改进。用柔刷功能平滑后,再用其他操作使其抗噪。具体方法后面再讲。
关于在特征点SxS的域中选择点对的方法,简要论文[附录2]测试了五种方法:
1)图像块中的平均采样;
2) p和Q都是
符合(0,S2/25)的柔和刷分布;
3)p符合(0,S2/25)的温和刷分布,而Q符合(0,S2/100)的温和刷分布;
4)空间量化极坐标中离散位置的随机采样;
5) P固定为(0,0),Q左右均匀采样。
五种采样方法的示意图如下:
指出第二种方法可以取得更好的匹配结果。在低旋转的图像中,BRIEF生成的描述子的匹配质量非常高,大多数情况下,作者都是在SURF之外进行测试的。但是旋转大于30后,BRIEF的匹配率迅速下降到0左右。简短需要很短的时间。在相同情况下计算512个特征点的描述子时,SURF需要335 ms,而Brief只需要8.18ms;匹配SURF描述符需要28.3ms,匹配BRIEF描述符需要2.19ms。当要求不太高时,简短描述符更容易实现实时性。
改进BRIEF算法—rBRIEF(Rotation-AwareBrief)
(1)转向简要(旋转不变性改进)
特征点的方向角包含在oFast算法计算的特征点中。假设原BRIEF算法在特征点SxS的邻域内选择N对点集(一般S取31)。
旋转旋转角度以获得新点对。
比较新的点集位置处的点对的大小,以形成二进制串的描述符。这里需要注意的是,使用oFast算法时,特征点是在不同尺度上提取的。因此,在使用简要特征描述时,应将图像转换为相应的尺度图像,然后在尺度图像上的特征点处取SxS邻域,再选择点对并旋转,得到二进制串描述符。
(2)RBF-改进特征点描述符的相关性
steeredBRIEF方法得到的特征描述子具有旋转不变性,但在另一个性质上不如原来的BRIEF算法。本质是什么?它是描述符的可区分性或相关性。这个性质对特征匹配的质量有很大的影响。描述符是对特征点属性的描述。子描述表达了特征点与其他特征点的区别。我们计算的描述符要尽量表达特征点的唯一性。如果不同特征点的描述子可分辨性差,匹配时不容易找到对应的匹配点,造成误匹配。在ORB论文中,作者用不同的方法计算了100k个特征点的二进制描述符,并对这些描述符进行了统计,如下表所示:
图2特征描述符的均值分布是.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论文没有使用五种方法中的任何一种,而是使用统计学习方法重新选择点对集合。
首先,建立30万个特征点的测试集。对于测试集中的每个点,考虑它的31x31邻域。这里与原来的BRIEF算法不同的是,在对图像进行温和的笔刷平滑后,用邻域内某一点的55邻域灰度平均值代替某一点对的值,然后比较点对的大小。这样,特征值更抗噪声。此外,积分图像可用于加速55邻域灰度平均值的计算。
从上面可以看出,在3131的邻域内有(31-5 ^ 1)x(31-5 ^ 1)=729个这样的子窗口,所以选择点对的方法有m=265,356种。我们要在这m个方法中选择256个方法,选择的原则是这256个方法之间的相关性最小。如何选择?
1)在300k个特征点的每个3131邻域中,用m种方法选择点对,比较点对的大小,形成300kxM的二元矩阵Q.矩阵的每一列代表通过某种方法获得的300k点的二进制数。
2)计算Q矩阵每列的平均值,根据平均值与0.5之间的距离对Q矩阵的列向量重新排序,形成矩阵t。
3)将T的第一列向量放入r。
4)取T的下一列向量和R中的所有列向量计算相关性。如果相关系数小于设置的阈值,则将T中的列向量移动到r。
5)继续以4)的方式操作,直到R中的向量数为256。
通过这种方法,选择了256种选择点对的方法。这是rBRIEF算法。
2、ORB特征提取实验
实验代码在opencv里。
2.1 orb特征提取和匹配实验
(1)
(2)
(3)
(4)
2-1 ORB特征匹配
从上图(1)、(2)、(3)可以看出,ORB算法的特征匹配效果比较理想,具有相对稳定的旋转不变性。但是通过(4)可以看出,ORB算法在规模上的效果很差,即使加大算法的规模变换,仍然没有取得很好的效果。
ORB是一种快速的特征提取和匹配算法。它的速度很快,但相应的算法质量较差。与sift相比,ORB使用二进制字符串作为特征描述,导致误匹配率较高。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。