【CV】ORB算法原理

2011年, Rublee, 在ICCV上,发表《ORB: an efficient alternative to SIFT or SURF》,用于实现快速的特征点提取和匹配,可作为SIFT、SURF的一种替代方案。

 

ORB = Oriented Fast + Rotated BRIEF

Oriented Fast : Orientation Features from  Accelerated Segment Test,用于检测特征点.

Rotated BRIEF : 旋转因子+Binary Robust IndependentElementary Features,用于提取特征描述符

性能:据说,ORB算法的速度是sift的100倍,是surf的10倍。

 

一、OFast特征提取:

原理:在使用FAST提取出特征点之后,给其定义一个特征点方向,以此来实现特征点的旋转不变形。

Fast提取特征点方法:

步骤一:粗提取。该步能够提取大量的特征点,但是有很大一部分的特征点的质量不高。下面介绍提取方法。从图像中选取一点P,如上图1。我们判断该点是不是特征点的方法是,以P为圆心画一个半径为3pixel的圆。圆周上如果有连续n个像素点的灰度值比P点的灰度值大或者小,则认为P为特征点。一般n设置为12。为了加快特征点的提取,快速排出非特征点,首先检测1、9、5、13位置上的灰度值,如果P是特征点,那么这四个位置上有3个或3个以上的的像素值都大于或者小于P点的灰度值。如果不满足,则直接排出此点。

备注:每个小方格代表一个像素,方格内的颜色只是为了便于区分,不代表该像素点的颜色。

 

 

步骤二:机器学习的方法筛选最优特征点。简单来说就是使用ID3算法训练一个决策树,将特征点圆周上的16个像素输入决策树中,以此来筛选出最优的FAST特征点。

 

步骤三:非极大值抑制 去除 局部较密集特征点。使用非极大值抑制算法去除临近位置多个特征点的问题。为每一个特征点计算出其响应大小。计算方式是特征点P和其周围16个特征点偏差的绝对值和。在比较临近的特征点中,保留响应值较大的特征点,删除其余的特征点。【响应阈值?】

 

Get Features with Harris Corner response value

步骤四:特征点的尺度不变形。构造金字塔,来实现特征点的多尺度不变性。即利用步骤1-3策略,在每层金字塔上采用Fast算法提取特征点/采用Harris角点响应函数,按角点响应值排序,选取前N个特征点。

具体首先设置一个比例因子scaleFactor(opencv默认为1.2)和金字塔的层数nlevels(pencv默认为8)。将原图像按比例因子缩小成nlevels幅图像。缩放后的图像为:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。

 

 

【Orientation by Intensity Centroid】

!!!步骤五:计算关键点的角点方向,描述特征点的旋转不变性。ORB算法提出使用灰度质心法/矩(moment)法来确定FAST特征点的方向。也就是说通过矩来计算特征点以r为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。矩定义如下:

 

其中,I(x,y)为图像灰度表达式。该矩的质心为:

 

假设角点坐标为O,则向量的角度即为该特征点的方向。计算公式如下:

 

【Compute Feature Descriptors,涉及到旋转】

二、 rBRIEF特征描述

原理:是在BRIEF特征描述的基础上加入旋转因子改进的,用一种贪婪学习算法筛选具有高variance和高不相关的steered brief结果。

BRIEF计算出来的结果是一个二进制串的特征描述符。计算方式:

在一个特征点的邻域内(SxS,一般取31),选择n对像素点pi、qi(i=1,2,…,n)。然后比较每个点对的灰度值的大小。如果I(pi)> I(qi),则生成二进制串中的1,否则为0。所有的点对都进行比较,则生成长度为n的二进制串。一般n取128、256或512,opencv默认为256。

注意:为了增加特征描述符的抗噪性,算法首先需要对图像进行高斯平滑处理。在ORB算法中,在这个地方进行了改进,在使用高斯函数进行平滑后,又用了其他操作,使其更加的具有抗噪性。

论文中提到,在特征点SxS的区域内有5种选取点对的方法:

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左右。

BRIEF的耗时较SURF少的多。

 

steered BRIEF(旋转不变性改进)

假设原始的BRIEF算法在特征点Patch(SxS,一般S取31)邻域内选取n对点集。

ORB在使用oFast算法计算出的特征点中包括了特征点的方向角度θ。在选择点对集之前,经过旋转角度θ旋转,得到新的点对

 

在新的点集位置上比较点对的大小形成二进制串的描述符。

注意:在使用oFast算法是在不同的尺度上提取的特征点。因此,在使用BRIEF特征描述时,要将图像转换到相应的尺度图像上,然后在尺度图像上的特征点处取SxS邻域,然后选择点对并旋转,得到二进制串描述符。

 

rBRIEF-改进特征点描述子的相关性

使用steeredBRIEF方法得到的特征描述子具有旋转不变性,但是却在另外一个性质上不如原始的BRIEF算法。是什么性质呢,是描述符的可区分性,或者说是相关性。这个性质对特征匹配的好坏影响非常大。

描述子是特征点性质的描述。描述子表达了特征点不同于其他特征点的区别。我们计算的描述子要尽量的表达特征点的独特性。如果不同特征点的描述子的可区分性比较差,匹配时不容易找到对应的匹配点,引起误匹配。

 

图2 特征描述子的均值分布.X轴代表距离均值0.5的距离,y轴是相应均值下的特征点数量统计

 

由上图:

BRIEF算法落在0上的特征点数较多,因此BRIEF算法计算的描述符的均值在0.5左右,每个描述符的方差较大,可区分性较强。

steeredBRIEF算法失去了这个特性。

至于为什么均值在0.5左右,方差较大,可区分性较强的原因,这里大概分析一下。这里的描述子是二进制串,里面的数值不是0就是1,如果二进制串的均值在0.5左右的话,那么这个串有大约相同数目的0和1,那么方差就较大了。

用统计的观点来分析二进制串的区分性,如果两个二进制串的均值都比0.5大很多,那么说明这两个二进制串中都有较多的1时,在这两个串的相同位置同时出现1的概率就会很高。那么这两个特征点的描述子就有很大的相似性。这就增大了描述符之间的相关性,减小之案件的可区分性。

对于rBRIEF,在计算特征点第二个步骤选择点对时,使用统计学习的方法来重新选择点对集合,而非BRIEF中的5种之一。具体步骤如下:

建立300k个特征点测试集。对于测试集中的每个点,考虑其31x31邻域。

先对图像进行高斯平滑。

使用邻域中的某个点的5x5邻域灰度平均值来代替某个点对的值,进而比较点对的大小。使得特征值更具备抗噪性。

 

在31x31的特征点Patch邻域内,共有(31-5+1)x(31-5+1)=729个这样的子窗口,那么从这些窗口中,选取点对的方法共有M=265356种,我们就要在这M种方法中选取256种取法,选择的原则是这256种取法之间的相关性最小。

从N个窗口中随机选两个做比较即构成描述子的一个bit,论文中采用M=205590种可能的情况。

 

 

具体选取方法:

1)在300k特征点的每个31x31邻域内按M种方法取点对,比较点对大小,形成一个300kxM的二进制矩阵Q。矩阵的每一列代表300k个点按某种取法得到的二进制数。

2)对Q矩阵的每一列求取平均值,按照平均值到0.5的距离大小重新对Q矩阵的列向量排序,形成矩阵T。

3)将T的第一列向量放到R中。

4)取T的下一列向量和R中的所有列向量计算相关性,如果相关系数小于设定的阈值,则将T中的该列向量移至R中。

5)按照4)的方式不断进行操作,直到R中的向量数量为256。

通过这种方法就选取了这256种取点对的方法。这就是rBRIEF算法。

       ---------------------------------------------------------------------------------

        1.对所有样本点,做M种测试,构成M维的描述子,每个维度上非1即0;

        2.按均值对M个维度排序(以0.5为中心),组成向量T;

        3.贪婪搜索:把向量T中第一个元素移动到R中,然后继续取T的第二个元素,与R中的所有元素做相关性比较,如果相关性大于指定的阈值Threshold,           抛弃T的这个元素,否则加入到R中;

        4.重复第3个步骤,直到R中有256个元素,若检测完毕,少于256个元素,则降低阈值,重复上述步骤;

       ----------------------------------------------------------------------------------

 

三、特征点的匹配:

例如特征点A、B的描述子如下。

A:10101011

B:10101010

我们设定一个阈值,比如80%。当A和B的描述子的相似度大于80%时,我们判断A,B是相同的特征点,即这2个点匹配成功。在这个例子中A,B只有最后一位不同,相似度为87.5%,大于80%。则A和B是匹配的。

我们将A和B进行异或操作就可以轻松计算出A和B的相似度。而异或操作可以借组硬件完成,具有很高的效率,加快了匹配的速度。

 

 

四、OPencv中计算方法

1.首先构造尺度金字塔;

   金字塔共n层,与SIFT不同,每层仅有一副图像;

   第s层的尺度为,Fator初始尺度(默认为1.2),原图在第0层;

   第s层图像大小:

      

2.在不同尺度上采用Fast检测特征点;

    在每一层上按公式计算需要提取的特征点数n,在本层上按Fast角点响应值排序,提取前2n个特征点,然后根据Harris角点响应值排序,取前n个特征点,作为本层的特征点;

3.计算每个特征点的主方向(质心法):computeOrientation()

4.旋转每个特征点的Patch到主方向,采用上述步骤3的选取的最优的256对特征点做τ测试,构成256维描述子,占32个字节;n=256.

 

 

4.采用汉明距离做特征点匹配;

 

细节:

Opencv定义中,描述子占用的字节数,默认32字节;描述子类型,8位整形数  

nfeatures:需要的特征点总数;

scaleFactor:尺度因子;

nlevels:金字塔层数;

edgeThreshold:边界阈值;

firstLevel:起始层;

WTA_K:描述子形成方法,WTA_K=2表示,采用两两比较;

scoreType:角点响应函数,可以选择Harris或者Fast的方法;

patchSize:特征点邻域大小;

 

ORB::operator()

特征提取及形成描述子:通过这个函数对图像提取Fast特征点或者计算特征描述子。

_image:输入图像;

_mask:掩码图像;

_keypoints:输入角点;

_descriptors:如果为空,只寻找特征点,不计算特征描述子;

_useProvidedKeypoints:如果为true,函数只计算特征描述子;

 

(1)提取角点:computeKeyPoints(…)

输入参数imagePyramid:即构造好的金字塔,其它参数。

 

(2)为每个角点计算主方向,质心法:computeOrientation()

输入参数:图片,角点,patchsize等。

 

(3)计算特征点描述子:computeDescriptors()

 

 

总结:

关键点:

ORB算法的特征匹配实现较稳定的尺度不变性:通过构建不同高斯金字塔(即对图像进行缩放)分别进行特征检测。

ORB算法的特征匹配实现较稳定的旋转不变性:为每个特征点增加角度特征。

ORB算法在尺度方面效果较差,在增加算法的尺度变换的情况下仍然没有取得较好的结果。

ORB是一种快速的特征提取和匹配的算法。它的速度非常快,但是相应的算法的质量较差。和sift相比,ORB使用二进制串作为特征描述,这就造成了高的误匹配率。

 

 

参考文章:

 

https://blog.csdn.net/zouzoupaopao229/article/details/52625678

 

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ORB是一种特征点检测和描述符生成算法,它在计算机视觉和图像处理中广泛使用。Python是一种高级编程语言,非常适合进行科学计算和算法实现。 ORB Python源码实现可以使用OpenCV库中的函数库,该库提供了ORB函数的实现。首先需要导入OpenCV库,然后使用ORB_create()函数创建一个ORB对象。可以设置ORB算法的参数,例如关键点数量、金字塔层数、尺度因子和边缘阈值等。 下一步是使用ORB算法检测图像中的关键点和生成描述符。使用detect()和compute()函数分别实现这些操作。detect()函数找到关键点,并将其存储在一个特定的数据结构中;compute()函数利用检测到的关键点计算特征描述符。ORB算法生成32位的描述符向量,在OpenCV中使用BytesIO格式进行存储。 最后,使用match()函数实现ORB算法的图像匹配。这个函数将两个图像的ORB特征描述符进行比较,并返回一个能量值。通过比较两个图像的ORB特征描述符,可以找到相似或匹配的图像。 综上所述,ORB Python源码实现可以通过调用OpenCV库中ORB函数实现。这个算法可以用于图像识别、目标跟踪、三维重建等应用领域。对于初学者来说,建议先了解ORB算法原理,再通过代码实现加深理解。 ### 回答2: ORB(Oriented FAST and Rotated BRIEF)是一种受欢迎的特征描述符,广泛应用于计算机视觉领域中的目标识别、跟踪、建图和图像检索等任务。在Python中,我们可以使用OpenCV库中的ORB函数来提取图像中的ORB特征。 ORB算法的实现通常包含以下步骤: 1. 第一步是对图像进行高斯滤波和尺度空间构建,以便在不同尺度下寻找图像的关键点。 2. 第二步是通过FAST(Features from Accelerated Segment Test)检测器来寻找图像中的角点,FAST检测器可以快速确定一组像素是否为关键点,并剔除非关键点。 3. 接下来进行BRIEF(Binary Robust Independent Elementary Features)描述符的计算,BRIEF描述符是一种基于二进制的局部特征描述符。BRIEF算法通过提取两个像素点之间的差异来描述特征,由于这些差异只有1和0两种情况,因此可以用二进制数表示。 4. 最后,通过对描述符进行方向矫正和尺度统一,得到旋转不变的ORB特征。 Python中OpenCV库提供了ORB()函数来实现ORB算法,实现代码如下: ```python import cv2 # 读取图像 img = cv2.imread('test.jpg') # 执行ORB特征提取 orb = cv2.ORB_create() keypoints, descriptors = orb.detectAndCompute(img, None) # 绘制关键点 img_kp = cv2.drawKeypoints(img, keypoints, None) cv2.imshow('ORB keypoints', img_kp) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们首先读取了一张图像,然后使用ORB_create()函数创建了ORB对象。接着使用detectAndCompute()函数来提取图像中的关键点和描述符,最后使用drawKeypoints()函数绘制关键点,并显示结果图像。 总之,Python中使用OpenCV库提供的ORB函数实现ORB特征描述符的提取非常简单,可以帮助我们快速完成图像处理任务。 ### 回答3: ORB是计算机视觉中一种经典的特征提取算法,它采用了旋转不变性和尺度不变性的思想,对于光照变化和旋转缩放等变化具有较好的适应性。在Python中,我们可以通过OpenCV提供的ORB函数来实现ORB特征提取。 具体地,我们可以通过以下步骤来实现ORB特征提取: 1. 导入OpenCV库,并读取待处理的图像。 2. 构建ORB对象,设置相关参数。其中,ORB对象的参数包括特征点数、金字塔层数、尺度因子等。可以根据具体应用场景进行自行设置。 3. 调用ORB对象的detect()和compute()方法,分别对图像进行关键点检测和特征描述。其中,detect()方法用于寻找图像中的关键点,而compute()方法用于计算关键点的ORB特征描述子。 4. 将ORB特征描述子保存至文件或内存中,用于后续的特征匹配和目标识别等任务。 需要注意的是,在实际应用中,ORB特征提取往往需要与其它特征提取和匹配算法结合使用,以提高检测和识别的准确性和鲁棒性。此外,由于ORB算法本身的局限性,我们还需要针对具体应用场景进行参数调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值