OpenCV进阶操作:SIFT特征提取



一、SIFT特征提取

1、什么是特征提取

特征提取是指从原始数据中提取出具有辨识性和代表性的特征,用于描述和表示数据的关键信息。在计算机视觉、模式识别和机器学习等领域,特征提取是一项关键的任务,因为原始数据通常含有大量冗余和噪声,通过提取特征可以减少数据的维度、去除冗余信息,从而更好地捕捉数据的潜在模式和结构。

特征可以是数据的某种可测量的属性,比如颜色、纹理、形状、梯度等。特征提取的目标是选择和计算这些特征,使其能够表达出不同类别或实例之间的差异和相似性。

SIFI尺度不变特征转换是一种机器视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变数。
在这里插入图片描述

2、步骤

1)数据预处理

对原始数据进行预处理,如去噪、归一化、平滑等。

2)特征选择

从原始数据中选择合适的特征子集,以避免冗余和噪声。

3)特征提取

根据领域知识或数学算法,计算和提取数据中的特征。

4)特征表示

将提取到的特征表示成一组数值、向量或其他形式,便于计算机处理和分析。

特征提取的好坏对于后续的数据分析、模型训练和模式识别任务至关重要。一个好的特征应该能够具有辨别性、区分不同类别或实例,并且具有鲁棒性,对于数据的变形和噪声有一定的容忍度。

二、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、绘制关键点

phone_sift = cv2.drawKeypoints(man,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('phone_sift',phone_sift)
cv2.waitKey(0)

drawKeypoints(image, keypoints, outImage, color=None, flags=None)
image:原始图片
keypoints:从原图中获得的关键点,这也是画图时所用到的数据
outputimage:输出图像,可以是原始图片,也可以是None
color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
flags:绘图功能的标识设置

在这里插入图片描述

4、计算关键点描述符

kp,des = sift.compute(man,kp) 
print(np.array(kp).shape,des.shape)        #输出关键点的形状和描述符的形状。

输出关键点的形状和描述符的形状。 np.array(kp).shape 表示关键点的数量和属性。 des.shape 表示描述符的数量和属性。
在这里插入图片描述


总结

SIFT 是特征提取领域的标杆算法,其核心优势在于尺度和旋转不变性,适用于复杂场景的图像匹配和识别。尽管存在计算速度和专利问题,但其在学术研究和工业级应用中仍被广泛使用。通过合理调整cv2.SIFT_create()的参数,可在特征数量和质量之间取得平衡,满足不同场景的需求。实际应用中,若需实时性,可考虑 ORB 等轻量算法;若追求精度,SIFT 仍是首选之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值