SIFT特征
SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点的描述子得到特征并进行图像特征点匹配。
其具体步骤为:
(1)构建尺度空间,检测极值点:
尺度空间构建的基础是DOG金字塔,DOG金字塔构建的基础是高斯金字塔,首先构建高斯图像金字塔。将金字塔分成O组,每一组称为一个Octave;每一个Octave又分成S层,每层的图像是由不同方差的高斯滤波器滤波的结果;每一个Octave的底层图像由上一个Octave的第S层图像高宽下2采样得到(缩小1/4);(2)构建DOG图像金字塔:对高斯塔相邻两层做差得到DOG响应金字塔。在高斯金字塔中一共生成O组S层不同尺度的图像,这两个量合起来(O,S)就构成了高斯金字塔的尺度空间,也就是说以高斯金字塔的组O作为二维坐标系的一个坐标,不同层S作为另一个坐标,则给定的一组坐标(O,S)就可以唯一确定高斯金字塔中的一幅图像,如下图所示。各尺度下图像的模糊度逐渐变大,能够模拟人在距离目标由近到远时目标物体在视网膜上的形成过程。
图像金字塔图片大小决定Octave的数目(Rob Hess代码默认当图片缩小到4个像素则停止),每Octave的层数设为3-5层(代码默认3);对于第 i 个(i=1...)Octave的第 n 层(n=1...S)图片,其对应的高斯尺度为,其中,sita一般预设为1.6。在实际中,为了保证上一组Octave与当前Octave的连续性,需要对每Octave的顶层再加3层,也就是实际上每一Octave的层数为S+3(假设S=3,对第1个Octave,gauss塔尺度为σ, kσ, k2σ, DoG塔尺度为σ, kσ,而DOG空间中的极值比较需要3层,因此考虑加上3层,这样第1个Octave的DOG空间尺度为 σ, kσ, k2σ, k3σ,k4σ,第2个Octave的DOG空间尺度为 2σ, 2kσ, 2k2σ, 2k3σ, 2k4σ,进行极值比较时底层和顶层无法计算,可以选择DoG space中的中间三项kσ,k2σ,k3σ(只有左右都有才能有极值),那么下一octave中(由上一层降采样获得)所得三项即为2kσ,2k2σ,2k3σ,其首项2kσ=。刚好与上一octave末项k3σ=尺度变化连续起来,所以每次要在Gaussian space添加3项,每组(塔)共S+3层图像,相应的DoG金字塔有S+2层图像。)
SIFT尺度空间的极值检测在DOG塔里进行,对每个点,比较其相邻的26个点,若为最大或最小值则记为待选极值点。
SIFT极值点检测同一组中的相邻尺度(由于k的取值关系,肯定是上下层)之间进行寻找。
(2)极值点的过滤:
1、对于DOG金字塔的每个点,检测其邻近26个点,如果为极值则记为待选点;
2、以上极值点是在离散空间中搜索的(找的的极值点是在高斯差分之后所确定下来的,那么其是属于离散空间上的点,不一定是真正意义上的极值点。我们需用用到一条曲线来进行拟合。).SIFT对每个待选点,通过插值得到极值点再连续空间中的精确位置(包括 行,列,尺度):
极值点的寻找令f(x)为该向量在DOG空间中的响应,将其泰勒展开,对f(X)求导,取其导数为0时候的点,即为所求精确位置距当前位置的偏移向量。当计算得到的偏移向量每一维都小于0.5时认为位置调整完毕。
3、根据(2)更新的极值点位置及偏移向量,计算对应的DOG响应(理论上f(X)的极值),如果该响应小于给定阈值(0.03),认为其不够稳定,删除。
4、过滤可能的边缘点。SIFT认为边缘点不好定位,并且易受噪声影响,因此需要去除。注意到边缘点在横跨边缘的地方有较大曲率,而在垂直边缘的方向有较小曲率。曲率通过DOG响应的Hessian矩阵求得。
(3)生成特征描述子:
上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。
在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向。
将坐标轴旋转为关键点的方向,以确保旋转不变性。
坐标轴旋转以关键点为中心取16×16的窗口。
每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向。将坐标轴旋转为关键点的方向,以确保旋转不变性。在每4×4的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点,计算keypoint周围的16*16的window中每一个像素的梯度,而且使用高斯下降函数降低远离中心的权重。 这样就可以对每个feature形成一个4*4*8=128维的描述子,每一维都可以表示4*4个格子中一个的scale/orientation. 将这个向量归一化之后,就进一步去除了光照的影响
。
日前在别的博客上也看到了更详细的描述,见https://blog.csdn.net/dcrmg/article/details/52577555;https://blog.csdn.net/dcrmg/article/details/52561656