ORB算法

本文转自:http://blog.csdn.net/GH_HOME/article/details/51511471

1. 定义

ORB (Oriented FAST and Rotated BRIEF),是一种特征检测算子,其特征点的性能介于SIFT和SURF之间,但是其速度是SURF算法速度的10倍。

2. 特性

  1. 速度快:基本上在特征检测算子方面借鉴了FAST特征检测算子,在特征描绘子方面借鉴了brief特征描绘算子,这两个方法都比较快。

  2. 具备旋转不变性,对噪声不敏感。

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特征检测的细节
  1. 尺度不变性: FAST特征点不是多尺度的特征点,我们在图像上建立尺度金字塔,在每一层金字塔上都做一次FAST特征检测,之后再利用Harris算法去除部分不合理的特征点
  2. 在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在周围随机采样

    我们选择第二种

    1. 我们的n选多少个?做多少次test 
      在ORB的原文中选择做256次,所以生成的brief的vector有256维。我们可以设置为128,256或512,这三种参数在OpenCV中都有提供,默认256.
    2. BRIEF特征点的匹配 
      直接对两个二进制串采用汉明距离来匹配,就是查看二进制串对应位上有多少不一样。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值