SIFT特征和SURF特征都是优秀的尺度不变特征,常用来进行物体辨识和图像匹配。所谓的尺度不变特征是指每个检测到的特征点都伴随着对应的尺寸因子(特征点的局部尺寸参数与特征的尺度成正比),下面就这两种著名的尺度不变特征进行简要的介绍和比较。(PS:由于两种特征提取算法的细节较多,本篇文章只简单介绍它们的原理、主要步骤和简单应用,主要关注两者的比较)
1 SIFT特征简介
1.1 SIFT原理
SIFT(Scale-Invariant Feature Transform)特征,即尺度不变特征变换,是一种计算机视觉的特征提取算法,用来侦测与描述图像中的局部性特征。它在尺度空间中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。
1.2 SIFT特征提取步骤
- 尺度空间的极值检测:尺度空间指一个变化尺度( σ )的二维高斯函数 G(x,y,σ) 与原图像 I(x,y) 卷积(即高斯模糊)后形成的空间,尺度不变特征应该既是空间域上又是尺度域上的局部极值。极值检测的大致原理是根据不同尺度下的高斯模糊化图像差异(Difference of Gaussians,DoG)寻找局部极值,这些找到的极值所对应的点被称为关键点或特征点。
- 关键点定位:在不同尺寸空间下可能找出过多的关键点,有些关键点可能相对不易辨识或易受噪声干扰。该步借由关键点附近像素的信息、关键点的尺寸、关键点的主曲率来定位各个关键点,借此消除位于边上或是易受噪声干扰的关键点。
- 方向定位:为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。通过计算关键点局部邻域的方向直方图,寻找直方图中最大值的方向作为关键点的主方向。
- 关键点描述子:找到关键点的位置、尺寸并赋予关键点方向后,将可确保其移动、缩放、旋转的不变性。此外还需要为关键点建立一个描述子向量,使其在不同光线与视角下皆能保持其不变性。SIFT描述子是关键点邻域高斯图像梯度统计结果的一种表示,见下图。通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。Lowe在原论文中建议描述子使用在关键点尺度空间内4*4的窗口中计算的8个方向的梯度信息,共4*4*8=128维向量表征。
1.3 OpenCV中的SIFT应用
OpenCV2中有一个封装类用于检测SIFT特征,其简要应用代码如下:
//特征点的向量
std::vector<cv::KeyPoint> keypoints;
//构造SIFT特征检测器
cv::SiftFeatureDetector sift(
0.03, //特征的阈值
10.) //用于降低直线敏感度的阈值
//检测SIFT特征值
sift.detect(image,keypoints);
更多详细介绍可以参考以下链接:
1.尺度不变特征变换中文维基百科(如访问不了请用VPN访问)
2.SIFT算法详解
2 SURF特征简介
2.1 SURF原理
SURF(Speeded Up Robust Features, 加速稳健特征) 是一种稳健的图像识别和描述算法。它是SIFT的高效变种,也是提取尺度不变特征,算法步骤与SIFT算法大致相同,但采用的方法不一样,要比SIFT算法更高效(正如其名)。SURF使用海森(Hesseian)矩阵的行列式值作特征点检测并用积分图加速运算;SURF 的描述子基于 2D 离散小波变换响应并且有效地利用了积分图。
2.2 SURF特征提取步骤
- 特征点检测:SURF使用Hessian矩阵来检测特征点,该矩阵是x,y方向的二阶导数矩阵,可测量一个函数的局部曲率,其行列式值代表像素点周围的变化量,特征点需取行列式值的极值点。用方型滤波器取代SIFT中的高斯滤波器,利用积分图(计算位于滤波器方型的四个角落值)大幅提高运算速度。
- 特征点定位:与SIFT类似,通过特征点邻近信息插补来定位特征点。
- 方向定位:通过计算特征点周围像素点x,y方向的哈尔小波变换,并将x,y方向的变换值在xy平面某一角度区间内相加组成一个向量,在所有的向量当中最长的(即x、y分量最大的)即为此特征点的方向。
- 特征描述子:选定了特征点的方向后,其周围相素点需要以此方向为基准来建立描述子。此时以5*5个像素点为一个子区域,取特征点周围20*20个像素点的范围共16个子区域,计算子区域内的x、y方向(此时以平行特征点方向为x、垂直特征点方向为y)的哈尔小波转换总和 Σdx、Σdy 与其向量长度总和 Σ|dx|、Σ|dy| 共四个量值,共可产生一个64维的描述子。
2.3 OpenCV中的SURF应用
OpenCV2中也有一个封装类用于检测SURF特征,其简要应用代码如下:
//特征点的向量
std::vector<cv::KeyPoint> keypoints;
//构造SURF特征检测器
cv::SurfFeatureDetector surf(
2500.) //阈值
//检测SURF特征值
surf.detect(image,keypoints);
更多详细介绍和应用可以参考以下链接:
1.加速稳健特征中文维基百科
2.浅墨的博客专栏 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
3 SIFT特征和SURF特征比较
比较项目 | SIFT | SURF |
---|---|---|
尺度空间极值检测 | 使用高斯滤波器,根据不同尺度的高斯差(DOG)图像寻找局部极值 | 使用方形滤波器,利用海森矩阵的行列式值检测极值,并利用积分图加速运算 |
关键点定位 | 通过邻近信息插补来定位 | 与SIFT类似 |
方向定位 | 通过计算关键点局部邻域的方向直方图,寻找直方图中最大值的方向作为关键点的主方向 | 通过计算特征点周围像素点x,y方向的哈尔小波变换,将x、y方向小波变换的和向量的最大值作为特征点方向 |
特征描述子 | 是关键点邻域高斯图像梯度方向直方图统计结果的一种表示,是16*8=128维向量 | 是关键点邻域2D离散小波变换响应的一种表示,是16*4=64维向量 |
应用中的主要区别 | 通常在搜索正确的特征时更加精确,当然也更加耗时 | 描述子大部分基于强度的差值,计算更快捷 |