介绍
ORB 是 Oriented Fast and Rotated Brief 的简称,可以用来对图像中的关键点快速创建特征向量,这些特征向量可以用来识别图像中的对象。
其中,Fast 和 Brief 分别是特征检测算法和向量创建算法。ORB 首先会从图像中查找特殊区域,称为关键点。关键点即图像中突出的小区域,比如角点,比如它们具有像素值急剧的从浅色变为深色的特征。然后 ORB 会为每个关键点计算相应的特征向量。ORB 算法创建的特征向量只包含 1 和 0,称为二元特征向量。1 和 0 的顺序会根据特定关键点和其周围的像素区域而变化。该向量表示关键点周围的强度模式,因此多个特征向量可以用来识别更大的区域,甚至图像中的特定对象。
ORB 的特点是速度超快,而且在一定程度上不受噪点和图像变换的影响,例如旋转和缩放变换等。
原理
step1 建立图像金字塔,FAST算法寻找特征点
给定一个图像 ORB 算法首先开始构建图像金字塔。
图像金字塔是单个图像的多尺度表示法,由一系列原始图像的不同分辨率版本组成。金字塔的每个级别都由上个级别的图像下采样版本组成。下采样是指图像分辨率被降低,比如图像按照 1/2 比例下采样。因此一开始的 4x4 正方形区域现在变成 2x2 正方形。图像的下采样包含更少的像素,并且以 1/2 的比例降低大小。如下图所示。
ORB 创建好图像金字塔后,它会使用 FAST 算法从每个级别不同大小的图像中快速找到关键点。
通过确定每个级别的关键点 ORB 能够有效发现不同尺寸的对象的关键点,这样的话 ORB 实现了部分缩放不变性。
step2 给关键点分配方向
为ORB 获得了与这个图像金字塔每个级别相关的关键点。在发现金字塔所有级别中的关键点后,ORB 现在为每个关键点分配一个方向,例如朝左或朝右,取决于该关键点周围的强度是如何变化的。
方法是首先计算以该关键点为中心的方框中的强度形心。强度形心可以看做给定 patch 中的平均像素强度的位置。计算强度形心后,通过画一条从关键点到强度形心的向量,获得该关键点的方向,如上图所示。这个关键点的方向是向下并朝左,因为这个区域的亮度朝着这个方向增强。
step3 BRIEF创建描述子
通过BRIEF 算法创建特征向量,得到特征描述符。
参考博客:https://www.cnblogs.com/alexme/p/11345701.html
代码实战
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread("G://data1//image01.jpg")
"""
ORB角点检测
实例化ORB对象
"""
orb = cv.ORB_create(nfeatures=500)
"""检测关键点,计算特征描述符"""
kp, des = orb.detectAndCompute(img,None)
print (des.shape)
# 将关键点绘制在图像上
img2 = cv.drawKeypoints(img,kp,None,color=(0,0,255),flags=0)
# 画图
plt.figure(figsize=(10,8),dpi = 100)
plt.imshow(img2[:,:,::-1])
plt.xticks([]),plt.yticks([])
plt.show()