ORB的全称是Oriented FAST and Rotated Brief,通过图像特征能够快速识别图像。ORB算法在关键特征提取、算法成本、匹配性能方面,是SIFT、SURF算法的有效替代方案。
ORB了融合FAST和Brief算法,FAST从提供的图像中检测特征;Brief快速找到的图像关键点,并将其转换为二进制特征向量。
ORB与SIFT、SURF
SIFT解决了匹配特征中的图像旋转、仿射变换、强度和视点变化等问题。
SIFT算法有4个基本步骤。
首先是使用高斯差(DoG)估计尺度空间极值。
其次,关键点定位,通过消除低对比度点来定位和细化候选关键点。
第三,基于局部图像梯度的关键点方向分配
第四,最后是描述符生成器,用于根据图像梯度大小和方向计算每个关键点的局部图像描述符。
SURF使用基于Hessian矩阵的BLOB检测器来查找关键点。对于方向分配,它通过应用适当的高斯权重在水平和垂直方向上使用小波响应。
对于特征描述,SURF也使用小波响应。选择关键点周围的邻域并将其划分为子区域,然后为每个子区域取小波响应并表示以获得SURF特征描述符。
基于原始图像和旋转图像的实验检测(同一图像)
我们发现,尽管图像内容一样,但SIFT算法和SURF算法在图像旋转时会获取到不同的关键点,匹配度较低。而ORB算法,在原始图像和旋转图像中获得相同的关键点数量,并且匹配100%。另外,ORB的执行速度比SIFT和SURF更快。
Python实现ORB算法思路
1、获取查询图像并将其转换为灰度。
2、现在初始化ORB检测器并检测查询图像和场景中的关键点。
3、计算属于两个图像的描述符。
4、使用蛮力匹配器匹配关键点。
5、显示匹配的图像。
Python代码实现ORB算法流程
import numpy as np
import cv2
query_img=cv2.imread('query.jpg')
train_img=cv2.imread('train.jpg')
query_img_bw=cv2.cvtColor(query_img,cv2.COLOR_BGR2GRAY)
train_img_bw=cv2.cvtColor(train_img,cv2.COLOR_BGR2GRAY)
orb=cv2.ORB_create()
queryKeypoints,queryDescriptors=orb.detectAndCompute(query_img_bw,None)
trainKeypoints,trainDescriptors=orb.detectAndCompute(train_img_bw,None)
matcher=cv2.BFMatcher()
matches=matcher.match(queryDescriptors,trainDescriptors)
final_img=cv2.drawMatches(query_img,queryKeypoints,
train_img,trainKeypoints,matches[:20],None)
final_img=cv2.resize(final_img,(1000,650))
cv2.imshow("Matches",final_img)
cv2.waitKey(3000)