目录
SIFT特征提取
SIFT(Scale Invariant Feature Transform)尺度不变特征变换。SIFT特征具有对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征,广泛应用于图像匹配、目标识别、全景拼接等任务。
一、原理核心步骤
1. 尺度空间极值检测
通过高斯卷积构建图像的尺度空间(不同尺度的模糊图像),在相邻尺度和空间位置中寻找极值点(潜在关键点)。
目的:确保检测到的关键点具有尺度不变性。
2. 关键点定位
对极值点进行拟合,去除低对比度点和边缘响应强的点(通过 Hessian 矩阵排除边缘效应),保留稳定的关键点。
3. 方向分配
计算关键点邻域的梯度方向直方图,为每个关键点分配主方向(及辅方向),使描述子具有旋转不变性。
4. 描述子生成
在关键点邻域(如 16x16 像素)内,按主方向划分 4x4 子区域,计算每个子区域的梯度方向和幅值,生成 128 维的特征向量(描述子)。
二、SIFT算法具有的特点
1、图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
2、独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
3、多量性,即使是很少几个物体也可以产生大量的SIFT特征
4、高速性,经优化的SIFT匹配算法甚至可以达到实时性
5、扩招性,可以很方便的与其他的特征向量进行联合。
三、SIFT特征提取器的简单使用
1、特征检测器的创建
sift=cv2.SIFT_create(nfeatures=0,
contrastThreshold=0.04,
edgeThreshold=10,
sigma=1.6) #cv2.xfeatures2d.SIFT_create()#创建一个sift特征的提取对象
sift.detect(img)在图像中查找关键点,返回的结果就是关键点信息
核心参数解释:
(1)nfeatures
(int,默认 = 0)保留响应值最高的前nfeatures
个关键点(按响应值降序排列)。0 表示保留所有关键点,适用于需要完整特征的场景;实际应用中可限制数量以减少计算量(如设为 500).
(2)contrastThreshold
(float,默认 = 0.04)
关键点对比度阈值,用于过滤低对比度的点(通过非极大值抑制)。值越小,保留的关键点越多(包括低对比度点,可能引入噪声);通常设为 0.01~0.1。
(3)edgeThreshold
(float,默认 = 10)过滤边缘响应强的点(通过 Hessian 矩阵的迹与行列式比值)。值越小,对边缘越敏感,保留的非边缘关键点越少(建议设为 10~15)。
(4)sigma
(float,默认 = 1.6)高斯金字塔底层图像的初始标准差,控制尺度空间的初始模糊程度。较大值(如 2.0)会检测到更大尺度的关键点,适合模糊图像;较小值(如 1.0)适合细节丰富的图像。
2、 检测图像中的关键点
phone = cv2.imread('man.png')
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)#
sift = cv2.SIFT_create() #sift对象
kp = sift.detect(phone_gray)
关键点的特征值 kp.pt:关键点的(x, y)坐标。 kp.size:关键点的大小(尺度)。 kp.angle:关键点的方向。 kp.response:关键点的响应值。 kp.octave:关键点所在的金字塔层级。
3、绘制关键点
drawKeypoints(image, keypoints, outImage, color=None, flags=None) image:原始图片 keypoints:从原图中获得的关键点,这也是画图时所用到的数据 outputimage:输出图像,可以是原始图片,也可以是None color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。 flags:绘图功能的标识设置
phone_sift = cv2.drawKeypoints(man,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('phone_sift',phone_sift)
cv2.waitKey(0)
4、计算关键点描述符
kp,des = sift.compute(man,kp)
print(np.array(kp).shape,des.shape) #输出关键点的形状和描述符的形状。
输出关键点的形状和描述符的形状。 np.array(kp).shape 表示关键点的数量和属性。 des.shape 表示描述符的数量和属性。
四、SIFT 算法的优缺点
优点 | 缺点 |
---|---|
1. 尺度、旋转、亮度不变性 | 1. 计算复杂度高,实时性差 |
2. 特征区分度强,适合复杂场景匹配 | 2. 专利受限(OpenCV 3.4 + 需手动编译或使用非官方构建) |
3. 描述子维度固定(128 维),便于匹配 | 3. 对重复纹理和弱纹理区域效果差 |
六、注意事项
1、输入图像预处理
建议先进行灰度化(SIFT 仅处理单通道图像)和高斯降噪(减少噪声对关键点的影响)。
2、参数调优
(1)若检测到的关键点过少,可降低contrastThreshold
或增大nfeatures
。
(2)若关键点密集且包含边缘噪声,可增大edgeThreshold
(如设为 20)。
总结
SIFT 是特征提取领域的标杆算法,其核心优势在于尺度和旋转不变性,适用于复杂场景的图像匹配和识别。尽管存在计算速度和专利问题,但其在学术研究和工业级应用中仍被广泛使用。通过合理调整cv2.SIFT_create()
的参数,可在特征数量和质量之间取得平衡,满足不同场景的需求。实际应用中,若需实时性,可考虑 ORB 等轻量算法;若追求精度,SIFT 仍是首选之一。