[SIFT算法原文(Distinctive Image Features from Scale-Invariant Keypoints)
SIFT算法(Scale-invariant feature transform),即尺度不变特征变换,由David Lowe提出,是一种基于局部兴趣点的算法,因此不仅对图片大小和旋转不敏感,而且对光照、噪声等的抗干扰能力也很好。
主要步骤
尺度空间极值探测(Scale-space extrema detection)
利用高斯差分函数对整个图像进行搜索,识别潜在的对缩放和旋转具有不变性的兴趣点。
使用级联滤波方法来识别候选位置,然后进一步探测关键点。在所有尺度中,用尺度空间连续函数探测图像中具有尺度变换不变性的位置。一副图像的尺度空间函数
L
(
x
,
y
,
σ
)
L(x,y,\sigma)
L(x,y,σ)由可变尺度的高斯函数
G
(
x
,
y
,
σ
)
G(x,y,\sigma)
G(x,y,σ)和输入图像
I
(
x
,
y
)
I(x,y)
I(x,y)的卷积生成,即:
L
(
x
,
y
,
σ
)
=
G
(
x
,
y
,
σ
)
∗
I
(
x
,
y
)
L(x,y,\sigma)=G(x,y,\sigma)*I(x,y)
L(x,y,σ)=G(x,y,σ)∗I(x,y),其中,
∗
*
∗指卷积操作,
G
(
x
,
y
,
σ
)
=
1
2
π
σ
2
⋅
e
−
x
2
+
y
2
2
σ
2
\displaystyle G(x,y,\sigma)=\frac{1}{2\pi\sigma^2}\cdot e^{-\frac{x^2+y^2}{2\sigma^2}}
G(x,y,σ)=2πσ21⋅e−2σ2x2+y2。用**高斯差分函数(DOG)**的尺度空间极值同图像做卷积,来有效探测尺度空间中稳定点的位置,即
D
(
x
,
y
,
σ
)
=
(
G
(
x
,
y
,
k
σ
)
−
G
(
x
,
y
,
σ
)
)
∗
I
(
x
,
y
)
=
L
(
x
,
y
,
k
σ
)
−
L
(
x
,
y
,
σ
)
D(x,y,\sigma)=(G(x,y,k\sigma)-G(x,y,\sigma))*I(x,y)=L(x,y,k\sigma)-L(x,y,\sigma)
D(x,y,σ)=(G(x,y,kσ)−G(x,y,σ))∗I(x,y)=L(x,y,kσ)−L(x,y,σ),其中
k
k
k为常系数乘子。
高斯函数有较好的性质方便运算:
σ
⋅
▽
2
G
=
∂
G
∂
σ
≈
G
(
x
,
y
,
k
σ
)
−
G
(
x
,
y
,
σ
)
k
σ
−
σ
\displaystyle\sigma\cdot\bigtriangledown^2G=\frac{\partial G}{\partial \sigma}\approx\frac{G(x,y,k\sigma)-G(x,y,\sigma)}{k\sigma-\sigma}
σ⋅▽2G=∂σ∂G≈kσ−σG(x,y,kσ)−G(x,y,σ),
而 G ( x , y , k σ ) − G ( x , y , σ ) ≈ ( k − 1 ) ⋅ σ 2 ⋅ ▽ 2 G G(x,y,k\sigma)-G(x,y,\sigma)\approx(k-1)\cdot\sigma^2\cdot\bigtriangledown^2G G(x,y,kσ)−G(x,y,σ)≈(k−1)⋅σ2⋅▽2G。
完全探测出高斯差分函数的所有极值的代价是很昂贵的,但可以使用粗糙的大尺度采样获得最稳定和有效的子集。
名词解释:
尺度空间
即试图子图像领域中模拟人眼观察物体的概念与方法。SIFT利用高斯函数进行滤波的主要原因:
(1)高斯核函数是唯一的尺度不变核函数;
(2)高斯差分函数可近似为两个
L
L
L之差,使得特征提取更简单(具体描述如上所示)。
而图像的尺度空间生成
L
L
L是当前图像与不同尺度的核参数
σ
\sigma
σ卷积后产生的图像。
尺度空间的实现可以利用高斯金字塔表示,其构建分两步:(1)对图像做高斯平滑;(2)对图像做降采样。
将图像金字塔每层的一张图像使用不同参数
σ
\sigma
σ做高斯模糊,使得金字塔的每层含有多张高斯模糊图像。金字塔的每层多张图像合称为一组(Octave),每层只有一组图像,组数与金字塔层数相等。每组含有多张(称为层(Interval))图像。降采样时,金字塔上一组图像的初始图像是有前一组图像的倒数第三张图像隔点采样得到的。
若高斯金字塔共有o组,s层,则有 σ ( s ) = σ 0 ⋅ 2 s S \sigma(s)=\sigma_0\cdot2^{\frac{s}{S}} σ(s)=σ0⋅2Ss,其中 σ \sigma σ为尺度空间坐标,s为sub-level层坐标; σ 0 \sigma_0 σ0为初始尺度,S为每组的层数。
DOG局部极值检测
特征点是由DOG空间的局部极值点组成。每一个像素点要和它的图像域和尺度域的所有相邻点进行比较。如图所示,中间的检测点要和它通尺度的8个相邻点和上下相邻尺度对应的2
×
\times
× 9个点比较,以确保在尺度空间和图像空间都检测到极值点。
关键点定位(Keypoint localization)
通过拟合精细的模型在每个候选位置上确定位置和尺度,而关键点的选择依赖于它们的稳定程度。
通过比较一个像素和它的相邻点可以发现候选关键点,接下来是对附近数据执行位置、尺度和主曲率的详细拟合,这些信息使得低对比度的点、对噪声敏感的点以及边缘处的差点被淘汰。使用空间尺度函数
D
(
x
,
y
,
σ
)
D(x,y,\sigma)
D(x,y,σ)的泰勒展开(以样本点为原点,展开到二阶):
D
(
x
)
=
D
+
∂
D
T
∂
x
x
+
1
2
x
T
∂
2
D
∂
x
2
x
\displaystyle D(\mathbf x)=D+\frac{\partial D^T}{\partial\mathbf x}\mathbf x+\frac{1}{2}\mathbf x^T\frac{\partial^2 D}{\partial\mathbf x^2}\mathbf x
D(x)=D+∂x∂DTx+21xT∂x2∂2Dx。
使 D ( x ) D(\mathbf x) D(x)的导数为0,可得极值点 x ^ = − ∂ 2 D ∂ x 2 − 1 ⋅ ∂ D ∂ x \displaystyle\hat{\mathbf x}=-{\frac{\partial^2 D}{\partial\mathbf x^2}}^{-1}\cdot\frac{\partial D}{\partial\mathbf x} x^=−∂x2∂2D−1⋅∂x∂D,极值 D ( x ^ ) = D + 1 2 ∂ D T ∂ x x ^ \displaystyle D(\hat{\mathbf x})=D+\frac{1}{2}\frac{\partial D^T}{\partial\mathbf x}\hat{\mathbf x} D(x^)=D+21∂x∂DTx^。
边缘消除:高斯差分函数对于边缘是很敏感的,但有些差的边缘是不需要的,需要消除。主曲率可利用2 × \times × 2的Hessian 矩阵 H \displaystyle\mathbf H H计算, H \displaystyle\mathbf H H中的导数 D x x , D x y , D y x , D y y D_{xx},D_{xy},D_{yx},D_{yy} Dxx,Dxy,Dyx,Dyy可利用采样点及其相邻点的差分得到,且 H \displaystyle\mathbf H H的特征值和 D D D的主曲率是成正比的。
简化运算:记 H \displaystyle\mathbf H H的奇异值为 α , β , 且 α > β , α = r β \alpha,\beta,且\alpha>\beta,\alpha=r\beta α,β,且α>β,α=rβ,则有 T r ( H ) = D x x + D y y = α + β , D e t ( H ) = D x x D y y − ( D x y ) 2 = α β Tr(\mathbf H)=D_{xx}+D_{yy}=\alpha+\beta,Det(\mathbf H)=D_{xx}D_{yy}-(D_{xy})^2=\alpha\beta Tr(H)=Dxx+Dyy=α+β,Det(H)=DxxDyy−(Dxy)2=αβ,
则 T r ( H ) 2 D e t ( H ) = ( α + β ) 2 α β = ( r + 1 ) 2 r \displaystyle\frac{{Tr(\mathbf H)}^2}{Det(\mathbf H)}=\frac{(\alpha+\beta)^2}{\alpha\beta}=\frac{(r+1)^2}{r} Det(H)Tr(H)2=αβ(α+β)2=r(r+1)2。
因此,检测主曲率是否小于设定的阈值
r
r
r,只需检测
T
r
(
H
)
2
D
e
t
(
H
)
<
(
r
+
1
)
2
r
=
T
\displaystyle\frac{{Tr(\mathbf H)}^2}{Det(\mathbf H)}<\frac{(r+1)^2}{r}=T
Det(H)Tr(H)2<r(r+1)2=T即可,然后便可进行消除。(建议阈值T设置为1.2,小于时保留关键点,大于时剔除)
图中,(a)为原图,(b)为经过高斯差分函数后提取到的边缘关键点及方向,(c),(d)为将阈值
r
r
r设置为10后进边缘消除后的结果。
方向匹配(Orientation assignment)
基于局部图像的梯度方向,为每个关键点设置一个或多个方向,后续对图像的所有操作都与方向、尺度和位置的相关变换有关,这些提供了变换的不变性。
关键点尺度是用来选择尺度最接近的高斯平滑图像
L
L
L,所有的计算都是在同一尺度不变条件下进行的。对于每个采样图像
L
(
x
,
y
)
L(x,y)
L(x,y),利用像素差分法计算其梯度量级
m
(
x
,
y
)
m(x,y)
m(x,y)和方向
θ
(
x
,
y
)
\theta(x,y)
θ(x,y),即:
m ( x , y ) = ( L ( x + 1 , y ) − L ( x − 1 , y ) ) 2 + ( L ( x , y + 1 ) − L ( x , y − 1 ) ) 2 \displaystyle m(x,y)=\sqrt{(L(x+1,y)-L(x-1,y))^2+(L(x,y+1)-L(x,y-1))^2} m(x,y)=(L(x+1,y)−L(x−1,y))2+(L(x,y+1)−L(x,y−1))2
θ ( x , y ) = t a n − 1 [ L ( x , y + 1 ) − L ( x , y − 1 ) L ( x + 1 , y ) − L ( x − 1 , y ) ] \displaystyle \theta(x,y)={tan}^{-1}[\frac{L(x,y+1)-L(x,y-1)}{L(x+1,y)-L(x-1,y)}] θ(x,y)=tan−1[L(x+1,y)−L(x−1,y)L(x,y+1)−L(x,y−1)]。
利用关键点周围区域采样点的梯度方向生成方向直方图,方向直方图有36个覆盖360度的柱子,其峰值与局部梯度的主方向相对应。首先探测到最高峰,然后对最高峰80%以上的峰也创建关键点及方向;因此,对于有多重相似量级的位置,可以在该相同位置和尺度创建具有多个方向的关键点。但只有15%的点会被设置多重方向,但他们对匹配的稳定性是很重要的,最后,得到一个拟合3个直方图且每个峰值最接近的更准确峰位的插值抛物线。
关键点描述子(Keypoint descriptor)
在每个关键点周围的选定区域计算局部图像梯度,这些梯度被转换为一种允许有较大的局部变形和光照变化的表示。计算局部图像区域的描述子,使得他们对光照或者三维视角的变换局域不变性。利用合适的尺度在关键点周围进行局部图像强度采样,使用归一化的相关方法进行匹配。
通过计算关键点位置周围区域的每个采样点的梯度量级和方向,来生成关键点描述子。利用一个高斯窗设置权重(即上图中的圆),然后这些样本被累加到覆盖4
×
\times
× 4个子域的方向直方图,箭头的长度是附近区域该方向的梯度量级之和。上图展现的是一个从8$\times$ 8的样本集中计算出的2
×
\times
× 2的描述子。