OpenCV与图像处理学习十四——SIFT特征(含代码)
- 一、SIFT算法
- 二、SIFT实现过程
- 三、代码实现
一、SIFT算法
SIFT, 即尺度不变特征变换算法(Scale-invariant feature transform,SIFT) , 是用于图像处理领域的一种算法。 SIFT具有尺度不变性, 可在图像中检测出关键点, 是一种局部特征描述子。
其应用范围包含物体辨识、 机器人地图感知与导航、 影像缝合、 3D模型建立、手势辨识、 影像追踪和动作比对,应用广泛。
二、SIFT实现过程
SIFT特性:
- 独特性, 也就是特征点可分辨性高, 类似指纹, 适合在海量数据中匹配。
- 多量性, 提供的特征多。
- 高速性, 就是速度快。
- 可扩展, 能与其他特征向量联合使用。
SIFT特点:
- 旋转、 缩放、 平移不变性
- 解决图像仿射变换, 投影变换的关键的匹配
- 光照影响小
- 目标遮挡影响小
- 噪声景物影响小
SIFT算法步骤:
- 尺度空间极值检测点检测
- 关键点定位: 去除一些不好的特征点, 保存下来的特征点能够满足稳定性等条件
- 关键点方向参数: 获取关键点所在尺度空间的邻域, 然后计算该区域的梯度和方向, 根据计算得到的结果创建方向直方图, 直方图的峰值为主方向的参数
- 关键点描述符: 每个关键点用一组向量(位置、 尺度、 方向) 将这个关键点描述出来, 使其不随着光照、 视角等等影响而改变
- 关键点匹配: 分别对模板图和实时图建立关键点描述符集合, 通过对比关键点描
述符来判断两个关键点是否相同
三、代码实现
import cv2
import numpy as npimg = cv2.imread('image/harris2.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None) # 找到关键点
img = cv2.drawKeypoints(gray, kp, img) # 绘制关键点
cv2.imshow('sp', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下所示: