ORB特征提取法
目录
- 介绍
- ORB的基本原理
- FAST关键点检测
- Harris角点测量
- 方向赋值
- BRIEF描述子
- 旋转不变性处理
- ORB的实现步骤
- 图像预处理
- 关键点检测
- 关键点筛选及非极大值抑制
- 描述子计算
- 特征匹配
- 应用实例
- ORB的优点与缺点
- 总结
1. 介绍
ORB(Oriented FAST and Rotated BRIEF)是由Ethan Rublee等人于2011年提出的一种快速且高效的特征提取方法。ORB结合了FAST关键点检测器和BRIEF描述子,不仅在计算速度上有显著提升,同时还具备旋转不变性,并能够在一定程度上处理尺度变化。
2. ORB的基本原理
2.1 FAST关键点检测
FAST(Features from Accelerated Segment Test)关键点检测是ORB的第一步。FAST通过用一圈像素点来评估中心像素是否为一个角点。具体过程如下:
- 对于每个像素,取其周围一圈的16个像素。
- 比较这16个像素与中心像素的亮度差异,如果连续的n个像素比中心像素亮度都高或都低,则该中心像素被认为是关键点。
ORB中通常设置n为9,确保快速检测特征点。
2.2 Harris角点测量
为了进一步删除强噪声边缘点并保留真正的角点,ORB使用Harris角点测量来对FAST检测到的关键点进行打分。根据打分结果,对关键点进行排序,并选取得分前N个关键点。
2.3 方向赋值
为了使ORB具有旋转不变性,每个关键点需要赋予一个方向。ORB使用一种基于x和y方向上的偏导数的方法来计算关键点的主方向。具体步骤如下:
- 在关键点周围定义一个窗口。
- 计算窗口内所有像素的x和y方向梯度。
- 根据梯度值来计算关键点的主方向。
2.4 BRIEF描述子
BRIEF(Binary Robust Independent Elementary Features)是一个通过简单的二值比较生成的描述子。BRIEF对于每个关键点生成一系列随机对的像素点,其主要步骤如下:
- 取一个包含关键点的固定大小的窗口。
- 在窗口内随机选择一对像素点。
- 如果第一个像素点的值大于第二个像素点,描述子中的相应比特位设为1,否则设为0。
- 重复以上过程直到生成具有固定长度的二进制描述子。
2.5 旋转不变性处理
为了使BRIEF描述子具备旋转不变性,ORB对BRIEF进行了改进。ORB根据关键点的主方向对BRIEF描述子进行旋转,使其具有旋转不变性。
3. ORB的实现步骤
3.1 图像预处理
图像预处理通常包括图像灰度化和去噪处理,使后续的关键点检测和描述子计算更加稳定。
import cv2
# 读取图像并转换为灰度图
image = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)
3.2 关键点检测
使用FAST算法检测图像中的关键点。
fast = cv2.FastFeatureDetector_create()
keypoints = fast.detect(image, None)
3.3 关键点筛选及非极大值抑制
通过Harris角点测量对关键点进行打分并筛选出前N个关键点。
orb = cv2.ORB_create()
keypoints = orb.detect(image, None)
3.4 描述子计算
根据已筛选的关键点,计算其BRIEF描述子。
keypoints, descriptors = orb.compute(image, keypoints)
3.5 特征匹配
使用Hamming距离对特征进行匹配。
# 创建匹配器
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 进行匹配
matches = bf.match(descriptors, descriptors)
# 按照距离排序
matches = sorted(matches, key=lambda x:x.distance)
4. 应用实例
以下是一个完整的示例,展示如何使用ORB进行图像特征提取和匹配。
import cv2
import numpy as np
# 读取两张图像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)
# 初始化ORB检测器
orb = cv2.ORB_create()
# 检测关键点和计算描述子
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 进行匹配
matches = bf.match(des1, des2)
# 按照距离排序
matches = sorted(matches, key=lambda x: x.distance)
# 绘制前10个匹配
img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
# 保存匹配结果
cv2.imwrite('orb_matches.jpg', img_matches)
5. ORB的优点与缺点
优点
- 计算速度快:适合实时应用,如视频分析、移动机器人视觉等。
- 开源*使用:没有专利限制。
- 存储效率高:描述子长度为256位的二进制字符串,占用存储空间小,匹配效率高。
缺点
- 对尺度变化的鲁棒性差:相比SIFT和SU{过滤}RF,ORB在处理尺度变化时表现稍逊。
- 精度较低:在某些场景下,ORB的特征匹配精度不如SIFT和SU{过滤}RF高。
6. 总结
ORB是一种高效的特征提取方法,适用于实时应用场景。虽然在处理尺度变化时稍显不足,但其快速的计算速度和开放的使用权限使其在许多实际应用中获得广泛使用。根据具体需求选择适合的特征提取方法,可以达到最佳的图像处理效果。