ORB(Oriented FAST and Rotated BRIEF)特征是一种用于图像中的关键点检测和描述的算法,它是由Oriented FAST和Rotated BRIEF组合而成的,因此叫做ORB。目前来说是一个速度较快,稳定性较高的特征点检测和提取算法,许多关于图像拼接还有目标追踪技术都会使用ORB特征进行实现。
1 ORB快速了解
ORB特征具有以下特点:
- 它是一种二进制的特征向量,只包含0和1,可以节省内存空间和计算时间。
- 它是一种旋转不变和尺度不变的特征,可以处理图像的旋转和缩放变换。
- 它是一种快速和稳定的特征,可以在实时和动态的场景中运行。
ORB特征的生成过程可以分为以下几个步骤:
- 使用FAST算法在图像金字塔的每个层级上检测关键点,FAST算法是一种基于像素灰度差异的角点检测方法,可以快速筛选出候选的特征点。
- 使用灰度质心法为每个关键点分配一个方向,灰度质心法是一种根据关键点周围的灰度分布计算出一个方向向量的方法,可以使特征具有旋转不变性。
- 使用rBRIEF算法为每个关键点生成一个二进制的特征描述符,rBRIEF算法是一种根据关键点的方向旋转随机像素对,并比较它们的灰度值的方法,可以使特征具有尺度不变性。
2 FAST 快速寻找特征点
FAST,那么显而易见的是这个算法主要解决的是算法的速度问题。那么FAST解决方案的核心思想是:某像素值与周围领域内的像素值若存在较大差异,则该像素可能是特征点。
其具体做法如下:确定候选焦点、使用非极大值抑制算法
2.1 确定候选角点 (Segment Test)
(1)选择一个像素点P,其像素值为,以P为圆心,半径为3,确立一个圆,圆的边界可能会经过16个像素,记为 。
(2)确定一个阈值:t,例如:
(3)判断P 与 像素值之间的差值是否大于t,如果连续有m个像素的差满足条件,则该点被选为候选点。m的取值通常为:9, 11, 12
补充:
由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然会浪费许多时间,因此FAST采用了一种进行非特征点判别的方法。对于每个点都检测第1、5、9、13号(即上下左右)像素点,如果这4个点中至少有3个满足条件,则继续对该点进行16个邻域像素点都检测的方法,否则则判定该点是非特征点(也不可能是角点,如果是一个角点,那么上述四个像素点中至少有3个应该和点相同),直接剔除即可。
2.2 非极大值抑制
经过2.1的角点筛选,相邻的像素点是极有可能被认为是角点,所以需要将相邻的角点进行删除。这和机器视觉中的非极大值抑制是一样的。
- 假设有两个相邻的像素:P, Q。分别计算两个像素及其16个像素点之间的插值,计算所有像素值之差的和,记为sigma_v。
- 如果sigma_v小于阈值V,则说明两块像素之间极为相似。则将其中一个点去除。
2.3 Oriented FAST
Fast角点本不具有方向,由于特征点匹配需要,ORB对Fast角点进行了改进,改进后的 FAST 被称为 Oriented FAST,具有旋转和尺度的描述。
总体来说:
- 尺度不变性(缩放不变性):使用图像金字塔解决
- 旋转不变性:使用质心标定方向
(1)尺度不变性
如上图所示就是一个图像金字塔,每一层就是经过一次下采样的结果,将图像缩小。ORB 创建好图像金字塔后,会使用 FAST 算法从每个级别不同大小的图像中快速找到关键点。因为金字塔的每个级别由原始图像的更小版本组成,因此原始图像中的任何对象在金字塔的每个级别也会降低大小。
(2)旋转不变性
假设得到了一个关键点p,和一个半径为3的圆。如上图所示,O就是关键点,C就是质心。圆圈圈出来的区域就是一个图像块,于是在这个图像块中,我们可以计算图像块的矩:
其中x,y表示像素坐标, 表示此像素坐标的灰度值
最后图像块的方向就能够通过一个角度描述。
3 BRIEF 使用二进制对检测到的特征点描述
RIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度直方图描述特征点的传统方法,采用二级制、位异或运算,大大的加快了特征描述符建立的速度,同时也极大的降低了特征匹配的时间,是一种非常快速,很有潜力的算法。
ORB 现在使用修改后的 BRIEF 版本创建特征向量,这个修改后的 BRIEF 版本称为 rBRIEF,即 Rotation-Aware BRIEF。无论对象的方向如何,它都可以为关键点创建相同的向量,使得 ORB 算法具有旋转不变性,意味着它可以在朝着任何角度旋转的图像中检测到相同的关键点。
和 BRIEF 一样 rBRIEF 首先在给定关键点周围的已界定区域中随机选择 256 个像素对,以构建 256 维的位向量。然后根据关键点的方向角度旋转这些随机像素对,使随机点的方向与关键点的一致。最后, rBRIEF 对比随机像素对的亮度并相应地分配 1 和 0 创建对应的特征向量。
4 代码示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:lowkeyway time:11/13/2019
import sys
import cv2 as cv
import numpy as np
def main_func(argv):
imgCat = cv.imread("cat.png")
imgSmallCat = cv.imread("smallCat.png")
orb = cv.ORB_create()
kpCat, desCat = orb.detectAndCompute(imgCat,None)
kpSmallCat, desSmallCat = orb.detectAndCompute(imgSmallCat, None)
bf = cv.BFMatcher_create(cv.NORM_HAMMING, crossCheck=True)
matches = bf.match(desCat, desSmallCat)
matchImg = cv.drawMatches(imgCat, kpCat, imgSmallCat, kpSmallCat, matches, None)
cv.imshow("Cat", imgCat)
cv.imshow("SmallCat", imgSmallCat)
cv.imshow('match', matchImg)
cv.waitKey(0)
if __name__ == '__main__':
main_func(sys.argv)
由此可见ORB算法在相同的物体和相同的状态下的关键点选取和特征匹配是较好的,但是在光线和状态不同的情况下的匹配是较差的。
参考博客:
【1】https://zhuanlan.zhihu.com/p/91479558
【2】https://zhuanlan.zhihu.com/p/261966288
【3】https://zhuanlan.zhihu.com/p/481373935