ORB特征点检测
date
Oct 21, 2021
Last edited time
Nov 20, 2021 02:15 PM
status
Published
slug
ORB特征点检测
tags
CV
summary
好久没整理笔记了, 把这个ORB特征点检测的笔记整理了一下
type
Post
Field
Plat
什么是 ORB怎么实现 ORBFAST 角点检测FAST 角点的检测过程FAST 检测角点的缺点Oriented FAST 角点检测BRIEF描述子怎么加?如何进行匹配?Rotated BRIEFORB 如何优化?rBRIEF
什么是 ORB
ORB(Oriented FAST and Rotated BRIEF)是 Oriented FAST + Rotated BRIEF 的缩写(感觉应该叫 OFRB)。是目前最快速稳定的特征点检测和提取算法,许多图像拼接和目标追踪技术利用 ORB 特征进行实现。
ORB 的优点
- 尺度不变性
- 旋转不变性
- 光变不变性
怎么实现 ORB
要了解 ORB,如果直接去看他们的论文,感觉多半会蒙圈。那是写给学术圈有一定基础的人看的。我等工程狗要了解 ORB 用简单的公式就可以:
ORB = Oriented FAST(特征点) + Rotated BRIEF(特征描述)
其中:
Oriented FAST 是一种改进的 FAST 角点检测方法
Rotate BRIEF 称为特征描述或者描述子
FAST 角点检测
FAST 角点检测方法只比较像素亮度的大小, 如果一个像素与其邻域的像素值差别过大, 则认为这个点可能是角点.
FAST 角点的检测过程
- Step1: 确定候选角点(Segment Test)
- 选择某个像素 , 其像素值为 。以 为圆心,半径为 3, 确立一个圆,圆上有 16 个像素,分别为
- 确定一个阈值 : (比如 的 )。
- 让圆上的像素的像素值分别与 的像素值做差,如果存在连续 个点满足 或 (其中 代表此圆上 个像素中的一个点),那么就把该点作为一个候选点。根据经验,一般令 (即为 FAST-12。其它常用的 取值为 9 和 11, 他们分别被称为 FAST-9,FAST-11).
由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然会浪费许多时间,因此 FAST 采用了一种进行非特征点判别的方法。如上图中,对于每个点都检测第 1、5、9、13 号(即上下左右)像素点,如果这 4 个点中至少有 3 个满足都比 大或者都比 小,则继续对该点进行 16 个邻域像素点都检测的方法,否则则判定该点是非特征点(也不可能是角点,如果是一个角点,那么上述四个像素点中至少有 3 个应该和点相同),直接剔除即可。
- Step2: 非极大值抑制
- 假设 P,Q 两个点相邻,分别计算两个点与其周围的 16 个像素点之间的差分和为 V。
- 去除 V 值较小的点,即把非最大的角点抑制掉。
经过 Step 1 的海选后,还是会有很多个特征点。好在他们有个缺点:很可能大部分检测出来的点彼此之间相邻,我们要去除一部分这样的点。为了解决这一问题,可以采用非最大值抑制的算法:
经过上述两步后 FAST 特征值筛选的结果就结束了。
FAST 检测角点的缺点
- FAST 不具有方向信息
- FAST 使用的固定的 邻域, 因此不具有尺度不变性
Oriented FAST 角点检测
那么,Oriented FAST 是怎么解决这个问题呢?
- 尺度不变性:可以用图像金字塔解决;
- 旋转不变性:可以用灰度质心标定方向解决;
尺度不变性:
- 对图像做不同尺度的高斯模糊
- 对图像做降采样 (隔点采样)
- 对每层金字塔做 FAST 特征点检测
- n 幅不同比例的图像提取特征点总和作为这幅图像的 oFAST 特征点。
旋转不变性:
- 在一个小的图像块 中,定义图像块的矩。
写成更通俗易懂的形式如下,也就是说m共有4中情况,这里写出三种情况如下。
- 通过矩可以找到图像块的质心
- 连接图像块的几何中心 与质心 ,得到一个方向向量 ,特征点方向可以定义为
BRIEF
BRIEF是一种二进制描述子,用来描述两个二进制串之间的距离,其描述向量由很多0、1组成。这里的0、1表示关键点附近两个像素(如p、q)的大小关系,若p比q大,取1,反之取0。如果以一定模式选取选取128对点比较,最后即可得到128维由0、1组成的特征向量。
描述子怎么加?
那下面就看一看它是如何给这些特征点加上描述子的:
- 为减少噪声干扰,先对图像进行高斯滤波(方差为 ,高斯窗口为 )
- 以特征点为中心,取 的邻域窗口。在窗口内选取一对(两个)点,比较二者像素的大小,进行如下二进制赋值。
其中,, 分别是随机点 的像素值。
- 在窗口中随机选取 对随机点,重复步骤 2 的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。(一般 N=256)
这个特征可以由 n 位二进制测试向量表示,BRIEF 描述子:
这里面,最关键的地方其实是随机特征对的选取,论文中就给出了 5 种方法(其中第二种比较好),分别为:
- 都呈均匀分布 ;
- 都呈高斯分布 ,准则采样服从各向同性的同一高斯分布;
- 服从高斯分布 , 服从高斯分布 , 采样分两步进行:首先在原点处为 进行高斯采样,然后在中心为 处为 进行高斯采样;
- 在空间量化极坐标下的离散位置处进行随机采样;
- , 在空间量化极坐标下的离散位置处进行随机采样;
这 5 种方法生成的 256 对(OpenCV 中用 32 个字节存储这 256 对)随机点如下(一条线段的两个端点是一对):

经过上面三个步骤,我们就可以为每个特征点表示为一个 256bit 的二进制编码。
如何进行匹配?
BRIEF 描述子使用 Hamming 距离来描述两个特征点之间的相似程度.
汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以 表示两个字 之间的汉明距离。对两个字符串进行异或运算,并统计结果为 1 的个数,那么这个数就是汉明距离。
- 两个特征编码对应 bit 位上相同元素的个数小于 的,一定不是配对的。
- 一幅图上特征点与另一幅图上特征编码对应 bit 位上相同元素的个数最多的特征点配成一对。
对于 BRIEF 来说,描述子里不包含旋转属性,所以一旦匹配图片有稍微大点的旋转角度,按照 Hamming 算法,匹配度将会大幅下降。
Rotated BRIEF
ORB 如何优化?
- ORB 算法进一步增强描述子的抗噪能力,采用积分图像来进行平滑;
- 在特征点的 邻域内,产生随机点对,并以随机点为中心,取 的子窗口。
- 比较两个随机点的子窗口内 25 个像素的大小进行编码(而不仅仅是两个随机点了)
其次,为 BRIEF 增加旋转不变性(Steered BRIEF):
ORB 算法采用关键点的主方向来旋转 BEIEF 描述子。
- 对于任意特征点,在 邻域内位置为 的 对点集,可以用 的矩阵来表示:
- 利用 FAST 求出的特征点的主方向 和对应的旋转矩阵 ,算出旋转的 来代表
- 计算旋转描述子(steered BRIEF):
其中 为 BRIEF 的描述子。
rBRIEF
最后,rBRIEF - 改进特征点描述子的相关性
使用 steeredBRIEF 方法得到的特征描述子具有旋转不变性,但是却在另外一个性质上不如原始的 BRIEF 算法。是什么性质呢,是描述符的可区分性,或者说是相关性。这个性质对特征匹配的好坏影响非常大。描述子是特征点性质的描述。描述子表达了特征点不同于其他特征点的区别。我们计算的描述子要尽量的表达特征点的独特性。如果不同特征点的描述子的可区分性比较差,匹配时不容易找到对应的匹配点,引起误匹配。ORB 论文中,作者用不同的方法对 100k 个特征点计算二进制描述符,对这些描述符进行统计,如下表所示:

我们先不看 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 个特征点测试集。
备注: 对于测试集中的每个点,预处理参考第一个步骤。考虑其 邻域。这里不同于原始 BRIEF 算法的地方是,这里在对图像进行高斯平滑之后,使用邻域中的某个点的 邻域灰度平均值来代替某个点对的值,进而比较点对的大小。这样特征值更加具备抗噪性。另外可以使用积分图像加快求取 邻域灰度平均值的速度。
- 特征点选取
- 在 300k 特征点的每个 邻域内按 M 种方法取点对,比较点对大小,形成一个 300k x M 的二进制矩阵 Q。矩阵的每一列代表 300k 个点按某种取法得到的二进制数。
- 对 Q 矩阵的每一列求取平均值,按照平均值到 0.5 的距离大小从小到大的顺序重新对 Q 矩阵的列向量排序,形成矩阵 T。
- 将 T 的第一列向量放到 R 中
- 取 T 的下一列向量和 R 中的所有列向量计算相关性,如果相关系数小于设定的阈值,则将 T 中的该列向量移至 R 中。
- 按照第四步的方式不断进行操作,直到 R 中的向量数量为 256。
从上面可知,在 的邻域内共有 个这样的子窗口,那么取点对的方法共有 种,我们就要在这M种方法中选取 256 种取法,选择的原则是这 256 种取法之间的相关性最小。怎么选取呢?
通过这种方法就选取了这 256 种取点对的方法。这个算法是对均值靠近 0.5 的不相关测试进行贪婪搜索,结果称为 rBRIEF。rBRIEF 在方差和相关性上与旋转 BRIEF 相比有明显进步(如图 4)。PCA 的特征值较高,它们的下降速度要快得多。
至此,ORB 的优化就结束了。我们尝试总结一下:
- FAST 是用来寻找特征点的。ORB 在 FAST 基础上通过金字塔、质心标定解决了尺度不变和旋转不变。即 oFAST。
- BRIEF 是用来构造描述子的。ORB 在 BRIEF 基础上通过引入 oFAST 的旋转角度和机器学习解决了旋转特性和特征点难以区分的问题。即 rBRIEF.
现在,有了特征点寻找和描述子,ORB 就成了!
跟以往一样,OpenCV 给我们提供了便捷的接口和使用方法。外部看上跟 SIFT 简直不要太一样。

