图像的SIFT特征点提取
SIFT特征点是一种用于图像处理和计算机视觉的局部特征描述器,具有旋转、尺度缩放和光照变化下的不变性,并且在海量数据库中快速匹配且具有高区分度。其提取过程包括尺度空间极值检测、关键点定位、方向确定和关键点描述等步骤,并可通过OpenCV库中的xfeatures2d模块中的SIFT_create()函数实现,在Python环境中使用安装好的opencv-contrib-python模块进行操作。
该段文字经过改写后如下:
在计算机视觉领域中,
图像是由多个独特的几何特性所构成,
其中每个图像都具有自己的独特标识。
为了实现这一系列关键点检测的过程,
需要解决以下几个关键问题:
第一,
无论目标处于何种姿态或方向,
其核心标志不应受到姿态变化的影响(即旋转不变性);
第二,
无论目标的整体尺寸发生怎样的缩放变化,
其核心标志不应受到尺寸变化的影响(即尺度不变性);
最后,
例如对光照条件的变化具有鲁棒性等。
目前针对图像特征点的提取与描述方式已非常丰富。常见的有以下几种典型的方法:基于 Scale-Invariant Feature Transform(SIFT)的特征求索器、基于 Speeded-Up Robust Features (SURF) 的快速特征求索器、基于 Oriented FAST and Rotated BRIEF (ORB) 的旋转不变特征求索器等。对于这些算法及其工作原理的详细解析,请参考博文:图像特征检测描述(一): SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现。其中 SIFT特征求索器基于尺度不变性原理构建了一套完整的表征体系。
SIFT特征点具有很多优点:
SIFT特征作为图像处理中的关键局部特征,在面对旋转、尺度缩放以及亮度变化时具有高度鲁棒性;此外,在面对视角变化、仿射变换以及噪声干扰同样表现出一定的稳定性。该特性通过多方面的抗变异性测试充分验证了其在复杂环境下的适用性。
2.区分性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
3.多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
4.高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
5.可扩展性,可以很方便的与其他形式的特征向量进行联合。
对SIFT特征点的提取主要包括以下四个步骤:
基于多尺度分析的方法中的一种称为尺度空间极值检测(SIFT),其核心思想是遍历各个尺度下的图像区域,在每一种尺度下寻找可能对应于局部极值的位置特征点。为了提高算法的鲁棒性,在实现这一过程时通常会结合高斯函数与其导数特性来进行特征点的定位,在此过程中我们特别关注那些在不同尺度和旋转条件下依然稳定的特征点位置确定问题。
2.关键点定位:在候选位置上,采用精细拟合模型精确地确定其位置参数和尺寸参数.关键点的选择基于其稳定性特征.
- 方向确定:根据图像局部区域的梯度分布情况,为每个关键点赋予一个或多个特定的方向。在后续处理图像数据时(即针对各个关键点的位置、方向和尺度),通过相应的变换操作来实现对该变换过程的不变性。
4.关键点描述:在每个关键点周围的邻域内进行梯度计算,在预设尺度下完成这一过程。计算得到的梯度值则被转换为一种特定形式的特征描述。这种特征描述具有较强的鲁棒性,在较大程度上的局部形状变形以及强光变化情况下都能保持稳定。
关于SIFT算法的理论推导及其内涵解释的部分涉及较为复杂的数学模型构建与几何变换原理探讨。为了更好地理解其在图像处理中的应用价值,请参考这篇详细的分析文章:SIFT特征详解
1. 提取SIFT特征点
1.1 安装cv2模块
通常我们会选择使用OpenCV Python版。但该模块不包含xfeatures2d功能。由于SIFT算法已被专利保护,因此已从OpenCV Python版移除。
关于这个模块的安装存在多个版本可供选择,在经历了几个坑之后最终发现以下方法可行:首先可以通过卸载原有的OpenCV Python模块(若原版为3.4.2.16则无需卸载)。随后按照以下步骤操作:第一步是卸载原有的OpenCV Python模块(若原版为3.4.2.16则无需卸载)。第二步是安装指定版本3.4.2.16及其-contrib Python包即可完成配置。
安装方法:
pip Installing OpenCV Python 3 version 42 build with Python 34
pip install OpenCV contrib Python 3 version 42 build with Python 34
随后创建并初始化了SIFT特征点检测器对象;接着通过该检测器对象在该灰度图中提取出一系列关键点。
sift = cv2.xfeatures2d.SIFT_create() # 构建SIFT特征点检测器对象
keypoints = sift.detect(gray, None) # 用SIFT特征点检测器对象检测灰度图中的特征点
# 将keypoints绘制到原图中
img_sift = np.copy(img)
cv2.drawKeypoints(img, keypoints, img_sift, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 显示绘制有特征点的图像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.title('Raw Img')
plt.subplot(122)
img_sift_rgb=cv2.cvtColor(img_sift,cv2.COLOR_BGR2RGB)
plt.imshow(img_sift_rgb)
plt.title('Img with SIFT features')

########################小**********结###############################
SIFT特征点提取可通过调用cv2.xfeatures2d.SIFT_create()并调用.detect()函数实现;但需提前安装opencv-contrib-python模块以避免程序运行时错误。
#################################################################
