对《数字图像处理》11.7节SIFT的总结。
可能的应用场景:对于无人机拍摄角度变化问题,有可能需要SIFT来增加鲁棒性。
0.前言
尺度变换之所以被称为一个变换(Transform),是因为它将图像变换为相对于局部图像特征的尺度不变坐标。SIFT特征(关键点)对图像尺度和旋转是不变的,对仿射失真、三维视点变化、噪声和光照变化具有很强的鲁棒性。
\space
1.尺度空间
尺度空间的本质就是一种多尺度表示,以一致的方式处理不同尺度的图像结构。
灰度图像
f
(
x
,
y
)
f(x,y)
f(x,y)的尺度空间
L
(
x
,
y
,
σ
)
L(x,y,\sigma)
L(x,y,σ)是
f
f
f与一个可变尺度高斯核
G
(
x
,
y
,
σ
)
G(x,y,\sigma)
G(x,y,σ)的空间卷积:
L
(
x
,
y
,
σ
)
=
G
(
x
,
y
,
σ
)
∗
f
(
x
,
y
)
L(x,y,\sigma)=G(x,y,\sigma)*f(x,y)
L(x,y,σ)=G(x,y,σ)∗f(x,y)
其中:
G
(
x
,
y
,
σ
)
=
1
2
π
σ
2
e
−
(
x
2
+
y
2
)
/
2
σ
2
G(x,y,\sigma)=\frac{1}{2\pi\sigma^2}e^{-(x^2+y^2)/2\sigma^2}
G(x,y,σ)=2πσ21e−(x2+y2)/2σ2
在实际操作中,是用不同尺度的高斯核与不同下采样率(称为倍频程)构成的高斯金字塔构成的,如下图所示:
注: 在每一个倍频程内,高斯核的尺度依次以某个倍数增长,即:
σ
,
k
σ
,
k
2
σ
,
.
.
.
\sigma,k\sigma,k^2\sigma,...
σ,kσ,k2σ,...,且下一倍频程的标准差为上一倍频程的两倍,即下一倍频程的高斯核尺度依次为:
2
σ
,
2
k
σ
,
2
k
2
σ
,
.
.
.
2\sigma,2k\sigma,2k^2\sigma,...
2σ,2kσ,2k2σ,...
一般来讲,
k
=
2
,
σ
=
1.6
k=\sqrt{2},\sigma=1.6
k=2,σ=1.6,3个倍频程,每个倍频程内一直到
k
4
k^4
k4.
\space
SIFT的提出者说最好首先用标准差为0.5的高斯核来平滑图像,之后通过线性内插来让尺寸变为原来的两倍,他认为这样可以不在以后的过程中丢失信息。
高斯金字塔就是在不同的尺度,用不同程度的模糊来看了图像,可能会在不同尺度上体现语义。
2.检测局部极值
在第一步中已经得到了高斯金字塔,此时要通过检测局部极值的方式来查找关键点。
2.1 查找初始关键点
大致方法是首先检测一个倍频程中两幅相邻尺度空间图像的高斯差的极值,然后将这个插值对原始图像进行卷积,也就是如下过程:
D
(
x
,
y
,
σ
)
=
[
G
(
x
,
y
,
k
σ
)
−
G
(
x
,
y
,
σ
)
]
∗
f
(
x
,
y
)
D(x,y,\sigma)=[G(x,y,k\sigma)-G(x,y,\sigma)]*f(x,y)
D(x,y,σ)=[G(x,y,kσ)−G(x,y,σ)]∗f(x,y)
根据卷积的线性性质,有:
D
(
x
,
y
,
σ
)
=
G
(
x
,
y
,
k
σ
)
∗
f
(
x
,
y
)
−
G
(
x
,
y
,
σ
)
∗
f
(
x
,
y
)
=
L
(
x
,
y
,
k
σ
)
−
L
(
x
,
y
,
σ
)
D(x,y,\sigma)=G(x,y,k\sigma)*f(x,y)-G(x,y,\sigma)*f(x,y)=L(x,y,k\sigma)-L(x,y,\sigma)
D(x,y,σ)=G(x,y,kσ)∗f(x,y)−G(x,y,σ)∗f(x,y)=L(x,y,kσ)−L(x,y,σ)
也就是说,对高斯尺度空间相邻图像作差,就得到了DoG空间:
为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。
如下图中间的被检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
2.2 改进关键点位置的精度
由于DoG值对噪声和边缘较敏感,因此,在上面DoG尺度空间中检测到局部极值点还要经过进一步的检验才能精确定位为特征点。
具体做法是,先在数字函数的每个极值点处拟合一个内插函数,然后在内插函数中查找改进精度后的极值位置。 SIFT用二阶Taylor公式,将 D ( x , y , σ ) D(x,y,\sigma) D(x,y,σ)写为向量形式 D ( x ) D(\bm x) D(x):
D ( x ) = D + ( ∇ D ) T x + 1 2 x T H x D(\bm x)=D+(\nabla D)^T\bm x+\frac{1}{2}\bm x^T \bm H \bm x D(x)=D+(∇D)Tx+21xTHx
其中 H \bm H H是Hessian矩阵。
要求极值点,令导数为0,得到极值的位置:
x
^
=
−
H
−
1
(
∇
D
)
\hat{\bm x}=-\bm H^{-1}(\nabla D)
x^=−H−1(∇D)
之后将极值点带入到原函数中,得到:
D
(
x
^
)
=
D
+
1
2
(
∇
D
)
T
x
D(\hat{\bm x})=D+\frac{1}{2}(\nabla D)^T \bm x
D(x^)=D+21(∇D)Tx
剔除
D
(
x
^
)
<
0.03
D(\hat{\bm x})<0.03
D(x^)<0.03(经验值)的点,因为函数值很低的点意味着是低对比度的不稳定极值。
\space
2.3 去除边缘效应
使用高斯差会得到图像中的边缘,在图像的边缘有较强的边缘效应(这里不懂),因此要去除边缘效应。
按照冈萨雷斯书上的解释,边缘在一个方向上由高曲折度表征,在正交方向上由低曲折度表征。而Heissan矩阵反映的就是局部曲折度,因此要考察Heissan矩阵的特征值,消除曲折度之比(大特征值比小特征值)高的点。利用矩阵特征值的性质,避免对特征值进行直接计算。
方法是计算关键点处的Heissan矩阵:
H
=
[
D
x
x
D
x
y
D
y
x
D
y
y
]
\bm H=\begin{bmatrix}\\ D_{xx} & D_{xy} \\ D_{yx} & D_{yy} \end{bmatrix}
H=[DxxDyxDxyDyy]
由矩阵的迹和行列式分别等于特征值之和与特征值之积(证明:韦达定理),设大特征值为
α
\alpha
α,小特征值为
β
\beta
β,有:
t
r
(
H
)
=
α
+
β
d
e
t
(
H
)
=
α
β
tr(\bm H)=\alpha+\beta\\ det(\bm H)=\alpha \beta
tr(H)=α+βdet(H)=αβ
考察:
[
t
r
(
H
)
]
2
d
e
t
(
H
)
=
(
r
+
1
)
2
r
\frac{[tr(\bm H)]^2}{det(\bm H)}=\frac{(r+1)^2}{r}
det(H)[tr(H)]2=r(r+1)2
其中
r
=
α
/
β
≥
1
r = \alpha/\beta \ge 1
r=α/β≥1,因此这个比值是递增函数。我们要消除曲折度之比大的点,就是要留下满足:
[
t
r
(
H
)
]
2
d
e
t
(
H
)
<
(
r
0
+
1
)
2
r
0
\frac{[tr(\bm H)]^2}{det(\bm H)}<\frac{(r_0+1)^2}{r_0}
det(H)[tr(H)]2<r0(r0+1)2
的点。通常
r
0
=
10
r_0=10
r0=10.
\space
3.关键点方向
筛选出关键点之后,为了实现图像的旋转不变性,要给每个关键点分配一个一致的方向。对于某一个关键点,就采用其所在的高斯金字塔的图像 L L L来计算其 3 σ 3\sigma 3σ邻域窗口内的点,具体是计算梯度幅度与方向角.
该点处的梯度:
g
r
a
d
L
(
x
,
y
)
=
{
(
L
(
x
+
1
,
y
)
−
L
(
x
−
1
,
y
)
)
,
(
L
(
x
,
y
+
1
)
−
L
(
x
,
y
−
1
)
)
}
≜
{
x
0
,
y
0
}
gradL(x,y)=\{(L(x+1,y)-L(x-1,y)),(L(x,y+1)-L(x,y-1))\}\triangleq\{x_0,y_0\}
gradL(x,y)={(L(x+1,y)−L(x−1,y)),(L(x,y+1)−L(x,y−1))}≜{x0,y0}
则方向:
θ
(
x
,
y
)
=
arctan
y
0
/
x
0
\theta(x,y)=\arctan{y_0/x_0}
θ(x,y)=arctany0/x0
幅度:
M
(
x
,
y
)
=
[
x
0
2
+
y
0
2
]
1
/
2
M(x,y)=[x_0^2+y_0^2]^{1/2}
M(x,y)=[x02+y02]1/2
随后,以关键点为原点,统计邻域内点的梯度幅值和方向。梯度直方图将0~360度的方向范围分为36个柱,其中每柱10度。直方图的峰值则代表了该特征点处邻域梯度的主方向。
\space
至此,每个关键点具有了三个特征:尺度(我的理解就是所在高斯模糊图的标准差)、位置、方向。
4.关键点描述子
通过对特征点周围区域像素的方向进行计算,形成一个向量,这个向量就代表了这个特征点的特征。经验值是在16x16的邻域内以4x4为一块,每块计算8个方向值,如此就形成了4x4x8=128维的向量。
(书图11.62)
5.整体步骤
若用SIFT解决图像匹配的问题,本质就是按照步骤分别:
- 构建两幅图(模板图和实时图)的尺度空间
- 得到初始关键点
- 筛选关键点,包括提高精度(插值)和删除不符合条件的关键点
- 计算关键点方向
- 计算关键点描述子
- 度量描述子之间的距离,包括最近点和次近点的距离。如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。