1. 概述
SIFT全称Scale Invariant Feature Transform,即尺度不变特征变换。相较于Harris和Fast这两种角点特征检测手段,SIFT专注于那些尺度不变的特征。
Harris算子不是尺度不变的,当图像变小时,检测结果的语义也会发生变化。
SIFT被设计出来的目的就是解决特征检测过程中经常遇到的尺度不变问题和旋转不变问题。

SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
基本的算法流程是:
- 尺度空间极值点检测
- 关键点精确定位
- 确定方向
- 确定描述子
2. 高斯金字塔与高斯差分金字塔
高斯金字塔和高斯差分金字塔如下图所示:

首先我们把输入的原图扩大一倍,由该图像进行高斯模糊的得到的第0组第0层图像设定为基准图像,设它的尺度为σ0σ0,称之为基准层尺度。则第0组第1层尺度为kσ0kσ0,第0组第2层尺度为k2σ0k2σ0,以此类推。
那么第0组中的图像的尺度为:
σ=krσ0,r=0,1,...,s−2σ=krσ0,r=0,1,...,s−2第1组的第0层图像倒数第三张图像采样得到,若令k=21sk=21s,则其相对于输入图像来说,尺度为2σ02σ0。
上述规律总结如下:
第oo组第rr层图像相对于输入图像的尺度为:
σ=2okrσ0其中,o=0,1,2,...;r=0,1,2,...,s+2σ=2okrσ0其中,o=0,1,2,...;r=0,1,2,...,s+2该图像相对于本组中的基准图像的尺度为:
σ=krσ0σ=krσ0而差分金字塔(DOG)就比较简单了,直接同组相邻的图像相减即可。
3. 算法流程
3.1 检测极值点
基本思路是在DOG金字塔中检测最大最小值点
具体检测思路是:
- 检测点和周围8个邻域点比较是否为极值点
- 检测点和尺度空间上下两层共计18个邻域点比较是否为极值点
同时满足这两个条件才可以被初步认定为特征点。
3.2 关键点精确定位
我们之前找到的极值点也就是离散空间中的极值点,但是离散空间中的极值点并不是真实的连续空间中的极值点。所以需要对DoG空间进行拟合处理,以找到极值点的精确位置和尺度。
我们得到的极值点是一个三维向量,包括它所在的尺度σσ以及所在尺度图像中的位置坐标,即X=(x,y,σ)X=(x,y,σ),泰勒展开即可得到
f([xyσ])≈f([x0y0σ0])+[∂f∂x∂f∂y∂f∂σ]([xyσ]−[x0y0σ0])+12([xyσ]−[x0y0σ0])[∂2f∂x∂x∂2f∂x∂y∂2f∂x∂σ∂2f∂x∂y∂2f∂y∂y∂2f∂y∂σ∂2f∂x∂σ∂2f∂y∂σ∂2f∂σ∂σ]([xyσ]−[x0y0σ0])若写成矢量形式,则为:
f(X)=f(X0)+∂fT∂X(X−X0)+12(X−X0)T∂2f∂X2(X−X0)此处,X0表示中心,X表示拟合后连续空间的差值坐标,设ˆX=X−X0表示偏移量。令导数为0则有:
ˆX=−∂2f−1∂X2∂f∂X带入原公式:
f(ˆX)=f(X0)+12∂fT∂XˆX若上式得到的偏移量大于阈值,则把位置移动到拟合后的新位置继续进行迭代求偏移量,若迭代过一定次数后偏移量仍然大于阈值,则抛弃该点。
有些极值点的位置是在图像的边缘位置的,因为图像的边缘点很难定位,同时也容易受到噪声的干扰,我们把这些点看做是不稳定的极值点,需要进行去除。
判定办法和Harris的办法很相似,设图像某点处的黑塞矩阵为
M=[I2xIxIyIxIyI2y]=[ACCB]则有:
detM=λ1λ2=AB−C2traceM=λ1+λ2=A+B如果两个特征值相差特别大,就认为是边缘,排除。
3.3 方向计算
选取半径为r的区域作为邻域,计算每个像素的梯度幅角:
θ(x,y)=arctan(L(x,y+1)−L(x,y−1)L(x+1,y)−L(x−1,y))将 2π 分为 n 份,对应于直方图的 n 个单位。比如分为6份,每个直方图代表 60o:
选取其中最高的一柱代表主方向。
之后将每个特征点的方向调整至一致,这期间一般使用双线性差值的办法填补像素。
3.4 确定描述子
步骤1:将16×16区域作为一个patch,校正方向
步骤2:按照3.3所述的办法计算每个像素的方向和幅度
步骤3:将其分为4×4的方框,计算每个方框的8方向直方图
最后就能得到128维描述向量(每个柱可用1-8的数字表示)