引言
本节主要是David Lowe对于SIFT算法的阐述Distinctive Image Features from Scale-Invariant Keypoints和Herbert Bay, Andreas Ess, Tinne Tuytelaars, Luc Van Gool, 对于SURF算法的阐述以及小结。
SIFT特征提取小结
根据LOWE的文章(更为SIFT特征提取分析,请见详参考博文尺度不变特征变换(SIFT)特征提取分析)。
首先,先对SIFT算法的主要原理、流程做一个简要阐述。由于该算法的核心是“尺度不变”特征点的提取,所以特征点得筛选资源从高斯金字塔产生的差分高斯空间中的局部极值点获得。
- 第一、个人认为关于高斯金字塔以及拉普拉斯算子的原理可以作以下直观理解:SIFT算法的尺度不变特征点大多是边缘上的点(更进一步是边缘上的角点(如矩形的四个顶点),关于边缘上非角点得去除会在下文提到),而边缘上的点即是高频(亮度与邻接点相差大)的点,它的亮度变化率取到一个极大值,即亮度变化率的变化率(亮度的二阶导数)等于0,即拉普拉斯算子△I=0。
- 第二、由于当图像与高斯核卷积后,I(x,y)变为G(X,Y,σ),求二阶偏导数可以转化为求关于尺度σ的一阶偏导数(高斯核即二维正态分布是热传导方程的一个解),且求这个偏导数更易实现,所以引入以σ为变量的高斯差分空间。对高斯差分空间可作如下直观理解:当人眼由远及近地观察一个物体,物体的细节会变化,但大体轮廓不会变化,由此可以通过比较站在远处和近处的两个画面来确定轮廓。事实上高斯差分空间中的图像看起来像浮雕,轮廓非常明显,所以求出高斯差分空间邻接图像的极值点即可。】
其次,进行初步取得的极值点得筛选工作,分两步,筛出特征点。
- 用二次曲面来模拟每个极值点附近的图像亮度函数,求出理论上极值点,设定一个界限,舍去实际点与理论点偏差大于界限的点。
- 去除仅落在边缘上而非角点的点。这类应被舍去的点有一个特征:沿着边缘切线方向的图像函数平缓(曲率小),垂直边缘方向陡峭(曲率大)。由于Hessian矩阵的两个特征值是X,Y方向的曲率,所以求出每个极值点两个特征值的比值,设定一个界限,舍去不合格的点即可。
最后,选定特征点后,就对每个特征点进行描述子(模拟人眼视网膜)的制作(因为特征点对图像的变化过于敏感,而描述子不敏感)。
- 由于SIFT对旋转有不变性,所以为每个特征点计算一个方向,这是制作描述子的预备工作。(具体实现是选定一个特征点附近的区域,算出区域中所有点的梯度大小以及方向,然后将这些方向分为36组,按梯度大小和正态分布函数加权,绘制0~360°的直方图,再用二次函数拟合求直方图的最大值点,得到一个特征点的总方向(若有次最大值点接近极大值点,则将这一特征点分为二个在同一坐标的点,但分别使用两个不同方向)。
- 确定方向后将区域内所有点的梯度方向转过一个上述确定的主方向的角度。然后将区域分为4*4=16个正方形子区域,每个区域中的点按梯度大小和正态分布加权,绘制出8个方向的直方图,所以每个特征点可得到一个128维的描述子向量(因为要使特征点对对比度变化不敏感,还需对向量归一化处理)。这些描述子即可用于匹配,即寻找另一幅图像中与该特征点128维向量几何距离最短的点。LOWE提到的方法是用K-D树搜索,但由于高维情形耗时较长,需加一个近似最优的贪心法剪枝和一个卡时出解的策略求得近似解。至此,SIFT算法完成。
除上述对SIFT算法的理论可行性讨论外,在SIFT实现的过程中还有一个重要的方面是一些参数的选择,例如一个OCTAVE几个图,一个描述子几个子区域,以及舍弃极值点时界限阈值(threshold)的选择,这些都关系到识别的精确度和算法的效率。Lowe在文章中给出了推荐数据,但在具体情况下可能可以再作微调(如识别的场景不同)。
SIFT算法时间复杂度的瓶颈在于描述子的建立和匹配,如何优化对特征点的描述方法是提升SIFT效率的关键,PCA-SIFT等算法在这里做了优化。
SURT特征提取小结
SURF算法(更为SURF特征提取分析,请见详参考博文SURF特征提取分析)是对SIFT算法的改进,其基本结构、步骤与SIFT相近,但具体实现的过程有所不同。SURF算法的优点是速度远快于SIFT且稳定性好。
首先,先对SURF算法的中特征点的提取
- 在SURF算法中,特征点的判据为某像素亮度的Hessian矩阵的行列式(Dxx*Dyy-Dxy*Dxy)为一个极值。由于Hessian矩阵的计算需要用到偏导数的计算,这一般通过像素点亮度值与高斯核的某一方向偏导数卷积而成;在SURF算法里,为提高算法运行速度,在精度影响很小的情况下,用近似的盒状滤波器(0,1,1组成的box filter)代替高斯核。因为滤波器仅有0,-1,1,因此卷积的计算可以用积分图像(Integral image)来优化(O(1)的时间复杂度),大大提高了效率。每个点需计算Dxx,Dyy,Dxy三个值,故需要三个滤波器;用它们滤波后,得到一幅图像的响应图(Response image,其中每个像素的值为原图像素的Dxx*Dyy-Dxy*Dxy)。对图像用不同尺寸的滤波器进行滤波,得到同一图像在不同尺度的一系列响应图,构成一个金字塔(该金字塔无需像SIFT中的高斯一样进行降采样,即金字塔每组中的每层图像分辨率相同)。
- 特征点的检测与SIFT一致,即若某点的Dxx*Dyy-Dxy*Dxy大于其邻域的26个点(与SIFT一致)的Dxx*Dyy-Dxy*Dxy,则该点为特征点。特征点的亚像素精确定位与SIFT一致。
其次,描述子的建立
- 为保证特征点描述子的旋转不变性,需对每个特征点计算主方向。计算主方向的过程如下:
1. 统计以特征点为中心,正比于特征点尺度的某个数位半径,张角为60°的扇形区域内所有像素点的 sumX=(y方向小波变换响应)*(高斯函数),sumY=(x方向小波变换响应)*(高斯函数), 计算合成向量角度θ=arctan(sumY/sumX),模长sqrt(sumy*sumy+sumx*sumx)。
2. 将扇形沿逆时针旋转(一般取步长为0.1个弧度),以同样方法计算合成向量。
3. 求出各方向扇形的合成向量模长最大值,其对应的角度即特征点主方向。
- 描述子的建立过程如下:
1. 选定以特征点为中心的一块正方形区域,将其旋转与主方向对齐。
2. 将正方形分为4x4的16个子区域,对每个区域进行Haar 小波变换(同样用积分图像加速),得到4个系数。
3. 由上述两步,生成4x4x4=64维向量,即描述子,用它可以进行匹配等工作。
此算法的优点在于大量合理使用积分图像降低运输量,而且在运用的过程中并未降低精度(小波变换,Hessian矩阵行列式检测都是成熟有效的手段)。在时间上,SURF运行速度大约为SIFT的3倍;在质量上,SURF的鲁棒性很好,特征点识别率较SIFT高,在视角、光照、尺度变化等情形下,大体上都优于SIFT。
PCA-SIFT特征分析(提升篇)
PCA-SIFT算法在描述子构建上作了创新,主要是将统计学中的主成分分析(PCA)应用于对描述子向量的降维,以提高匹配效率。PCA 的原理是:一般有效信号的方差大,噪声的方差小;通过PCA可以通过降维滤除噪声,保留信号。
算法描述
该算法的前期步骤(检测特征点、修正、计算主方向)与传统SIFT相同,区别在于描述子的构建。步骤如下:
1. 构建描述子的区域选定为以特征点为中心的41X41矩形(已与特征点主方向对齐);
2. 计算39x9矩形内每个像素对水平、垂直两个方向的偏导数(最外层像素不计算偏导数)。得到一个39x39x2=3042维的向量,对其归一化。
3. 假设有N个特征点,那么所有特征点描述子向量构成一个Nx3042的矩阵。对这N个向量计算NxN协方差矩阵。
4. 计算协方差矩阵的前k个最大特征值所对应的特征向量,这k个向量组成一个3042xk的投影矩阵。
5. 将Nx3042的描述子矩阵与3042xk的投影矩阵相乘,得到Nxk的矩阵,即降维描述子向量组成的矩阵。此时N个特征点的描述子向量均为k维。文中作者经过实验,取k=36。
该算法的创新之处在于降低描述子维度的同时滤除了部分描述子向量中的干扰信息,有较好的鲁棒性。同时该算法为后人研究描述子打开了一个方向,例如GLOH算法在描述特征点时也是用PCA将16*17维的向量降为40维,但GLOH算法构建描述子的方法不同,它是基于对数极坐标来构建的。
结果比较
PCA-SIFT所得的描述子在旋转、尺度变换,透视变换,添加噪声匹配的情形下,匹配均大幅领先于SIFT;在亮度变换时,与传统SIFT不相上下。在匹配时所得的正确点对也多于传统SIFT。可见PCA-SIFT生成的描述子质量很高。SIFT和PCA-SIFT的比较。在运行时间方面,PCA-SIFT在特征点提取、描述子计算中略快于SIFT;但在后续的描述子匹配过程中,PCA-SIFT的速度大大超过SIFT的速度。