SIFT算法特征提取及匹配原理详解
1. 简介
SIFT
算法,全称为尺度不变性特征匹配算法(Scale Invariant Feture Transform
),它是计算机视觉中最常应用的特征匹配算法之一,用来检测与描述图像中的局部性特征,这种描述具有尺度不变性,对旋转、缩放、亮度变化等保持不变性。该算法由David Lowe
1999年发表,在2004年进行完善,后续在其基础上有很多改进的算法,目前用到的特征匹配算法可能不是SIFT
算法本身而是改进后的算法,但是无论用什么改进的算法,其基本思想是不变的,只不过是在计算性能和效率上有所提升。
2. SIFT的特点及性能
SIFT
局部特征描述有助于辨识物体,这些特征描述子基于物体上的局部特征点生成而与物体的大小及旋转无关。对噪声、旋转、亮度变化的鲁棒性较好,而且SIFT
特征描述在一定程度上也能对目标物体部分遮蔽进行检测,在少数的目标物体上也能够产生很多的SIFT
特征向量,特征信息量大,经过筛选优化后可进行快速匹配,SIFT
特点总结如下:
- 图像的局部特征描述子具有较好的稳定性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。
- 多量性,即使少数的几个物体也可以产生大量的
SIFT
特征向量。 - 独特性好,特征信息量丰富,适用于海量特征库进行快速、准确的匹配。
- 高速性,经优化的
SIFT
匹配算法能快速进行匹配。 - 可扩展性,能够与其他形式的特征向量进行联合。
目标物体的自身状态、所处环境和成像设备等因素影响图像配准、目标识别跟踪的性能。而SIFT
算法在一定程度上可解决:
- 目标的旋转、缩放、平移(
RST
) - 图像仿射/投影变换(视点
viewpoint
) - 光照影响(
illumination
) - 目标遮挡(
occlusion
) - 复杂场景(
clutter
) - 噪声干扰
3. SIFT特征检测步骤
- 尺度空间的极值检测: 搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和旋转不变性的兴趣点。
- 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
- 特征方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
- 关键点描述:在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。
下面根据SIFT
特征检测步骤对该算法进行通俗地解读,SIFT
算法涉及到的数学概念及实现流程较多,下面分模块逐步进行解读。
4. 尺度空间的极值检测
4.1 图像尺度空间的概念
在一定的范围内,无论是大目标物体还是小目标物体,人眼都可以分辨出来,然而计算机要实现不仅在清晰的层面上辨别出物体,还要在模糊的层面上辨别出物体有什么特点却有一定的难度,竟然有难度该如何解决呢?
解决办法并不复杂,人类在什么层面上观察到的目标,让计算机也在相同条件下辨别目标,所以要让机器能够对物体在不同尺度上有一个统一的认知,就需要考虑图像在不同尺度下都存在的特点。Lindeberg
等人已证明高斯卷积核是实现尺度变换的唯一变换核,并且是唯一的线性核。SIFT
算法在构建尺度空间时候也是采取高斯核函数进行滤波,使原始图像保存最多的细节特征,经过高斯滤波后细节特征逐渐减少来模拟大尺度情况下的特征表示。如下图1所示,有6副Lena
图像,第1幅图像为原图,对图像做一些改变后逐渐变得模糊看不清图像中的具体内容。
4.2 尺度空间的表示
早期图像的多尺度通常使用图像金字塔来表示形式,图像金字塔是同一图像在不同的分辨率下得到的多组结果,其生成过程首先是对原始图像进行平滑,然后对处理后的图像进行降采样,降采样后得到一系列尺寸不断缩小的图像。
一个图像的尺度空间
L
(
x
,
y
,
σ
)
L(x, y, σ)
L(x,y,σ)定义为一个变化尺度的高斯函数
G
(
x
,
y
,
σ
)
G(x, y, σ)
G(x,y,σ)与原图像
I
(
x
,
y
)
I(x, y)
I(x,y)的卷积。
L
(
x
,
y
,
σ
)
=
G
(
x
,
y
,
σ
)
∗
I
(
x
,
y
)
(1)
L(x, y, σ)=G(x, y, σ)*I(x, y)\tag{1}
L(x,y,σ)=G(x,y,σ)∗I(x,y)(1)
其中,
∗
*
∗表示卷积,高斯核函数
G
(
x
,
y
,
σ
)
=
1
2
π
σ
2
e
−
(
x
−
m
/
2
)
2
+
(
y
−
n
/
2
)
2
2
σ
2
G(x, y, σ)=\frac1{2πσ^2}e^{-\frac{(x-m/2)^2+(y-n/2)^2}{2σ^2}}
G(x,y,σ)=2πσ21e−2σ2(x−m/2)2+(y−n/2)2,
m
,
n
m,n
m,n为高斯模板的维度,
(
x
,
y
)
(x, y)
(x,y)表示图像像素点的位置,
σ
σ
σ表示尺度空间因子,对应高斯正态分布中的标准差,该值越大图像越模糊,对应的尺度也就越大,反之,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。
4.3 高斯金字塔的构建
高斯金字塔的构建包含两部分:
- 对图像做不同尺度的高斯模糊。
- 对图像做降采样,通常是采样前图像的水平、垂直方向的1/2。
尺度空间使用高斯金字塔实现如下图2所示。
图像的金字塔模型将原始图像不断降阶采样得到一系列大小不一的图像,从下到上由大变小构成金字塔模型。原图像为金字塔的第一层,每次降采样得到的新图像为金字塔的某一层(每层一张图像)。
为体现尺度空间的连续性(下文有解释),高斯金字塔在简单降采样的同时还进行了高斯模糊。如上图所示,对金字塔的每层图像中的每张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊后的图像,在这里将金字塔每层多张图像合称为一组(Octave
),金字塔的每层含有一组图像,不难发现组数与金字塔的层数相等,每组中的每张图像称为该组中的层(Interval
)。
说明: 由于每个
Octave
中的多张图像是按层次叠放的,为避免与高斯图像金字塔中的层数混淆,本文对“层”未特别说明的地方一般都指每个Octave
中的各层图像。
不难发现,高斯金字塔有多组,每组又有多层。一组中的多个层之间的尺度是不一样的(也就是使用的高斯参数 σ σ σ是不同的),相邻两层之间的尺度相差一个比例因子 k k k。如果每组有 S S S层,则 k = 2 1 S k=2^{\frac1S} k=2S1。上一组图像的最底层图像是由前一组中尺度为 2 σ 2σ 2σ的图像进行因子为2的降采样得到的(高斯金字塔先从底层建立)。
假设金字塔的组数共有
o
o
o组,其组数根据图像的大小和塔顶图像的大小共同决定,其计算公式如下:
o
=
l
o
g
2
m
i
n
(
M
,
N
)
−
a
(2)
o=log_2{min(M, N)}-a\tag{2}
o=log2min(M,N)−a(2)
其中,
M
,
N
M, N
M,N分别是原图像的行和列,
a
a
a可以在
0
−
l
o
g
2
m
i
n
(
M
,
N
)
0-log_2min(M, N)
0−log2min(M,N)之间任意取值(即塔顶图像的最小维数的对数值)。
以一个 512 × 512 512×512 512×512的图像 I I I为例,构建高斯金字塔步骤:(从0开始计数,倒立的金字塔)
- 金字塔的组数, l o g 2 512 = 9 log_2512=9 log2512=9,减去因子3,构建的金字塔的组数为6。取每组的层数为3(一般为3~5层)。
- 构建第0组,将图像的宽和高都增加一倍,变成 1024 × 1024 ( I 0 ) 1024×1024(I_0) 1024×1024(I0)。第0层 I 0 ∗ G ( x , y , σ 0 ) I_0∗G(x,y,σ_0) I0∗G(x,y,σ0),第1层 I 0 ∗ G ( x , y , k σ 0 ) I_0∗G(x,y,kσ_0) I0∗G(x,y,kσ0),第2层 I 0 ∗ G ( x , y , k 2 σ 0 ) I_0∗G(x,y,k^2σ_0) I0∗G(x,y,k2σ0)。
- 构建第1组,对 I 0 I_0 I0降采样变成 512 × 512 ( I 1 ) 512×512(I_1) 512×512(I1)。第0层 I 1 ∗ G ( x , y , 2 σ 0 ) I_1∗G(x,y,2σ_0) I1∗G(x,y,2σ0),第1层 I 1 ∗ G ( x , y , 2 k σ 0 ) , 第 2 层 I 1 ∗ G ( x , y , 2 k 2 σ 0 ) I_1∗G(x,y,2kσ_0),第2层I_1∗G(x,y,2k^2σ_0) I1∗G(x,y,2kσ0),第2层I1∗G(x,y,2k2σ0)。
- …
- 构建第 o o o组,第 s s s层 I o ∗ G ( x , y , 2 o k s σ 0 ) I_o∗G(x,y,2^ok^sσ_0) Io∗G(x,y,2oksσ0)。
根据上述分析,高斯模糊参数
σ
σ
σ(尺度空间),可由下面关系式得到
σ
(
o
,
s
)
=
σ
0
⋅
2
o
+
s
S
(3)
σ(o, s)=σ_0·2^{o+\frac sS}\tag{3}
σ(o,s)=σ0⋅2o+Ss(3)
其中
o
o
o为所在的组,
s
s
s为所在的层,
σ
0
σ_0
σ0为初始的尺度,
S
S
S为每组的层数。
在Lowe
论文的算法实现中
σ
0
=
1.6
σ_0=1.6
σ0=1.6,
o
m
i
n
=
−
1
o_{min}=−1
omin=−1,
S
=
3
S=3
S=3,
o
m
i
n
=
−
1
o_{min}=−1
omin=−1就是首先将原图像的长和宽各扩展一倍。
从上面分析可以得知相邻组之间的尺度关系
σ
o
+
1
=
2
σ
o
(4)
σ_{o+1}=2σ_o\tag{4}
σo+1=2σo(4)
同一组内相邻层的图像尺度关系
σ
s
+
1
=
k
⋅
σ
s
=
2
1
S
⋅
σ
s
(5)
σ_{s+1}=k·σ_s=2^{\frac1S}·σ_s\tag{5}
σs+1=k⋅σs=2S1⋅σs(5)
为了有效的在尺度空间检测到稳定的关键点,Lowe
提出了高斯差分尺度空间(DoG Scale-Space
),将每一组相邻的两层相减就可以得到DoG
金字塔,利用不同尺度的高斯差分核与图像卷积生成。
D
(
x
,
y
,
σ
)
=
(
G
(
x
,
y
,
k
σ
)
−
G
(
x
,
y
,
σ
)
)
∗
I
(
x
,
y
)
=
L
(
x
,
y
,
k
σ
)
−
L
(
x
,
y
,
σ
)
(6)
D(x, y, σ)=(G(x, y, kσ)-G(x, y, σ))*I(x, y)=L(x, y, kσ)-L(x, y, σ)\tag{6}
D(x,y,σ)=(G(x,y,kσ)−G(x,y,σ))∗I(x,y)=L(x,y,kσ)−L(x,y,σ)(6)
注: 虽然使用
Laplacian of Gaussian(LoG)
能够很好地找到找到图像中的兴趣点,但是需要大量的计算量,而Difference of Gaussian(DoG)
算子计算简单,是尺度归一化的LoG
算子的近似,所以使用DoG
图像的极大极小值近似寻找特征点。有关DoG寻找特征点的介绍及方法详见DoG (Difference of Gaussian)角点检测,极值点检测用的非极大值抑制。
在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,如下图3所示,进行极值检测。
4.4 检测DoG尺度空间极值点
图像中的特征点是由DoG
尺度空间的局部极值点组成,为寻找DoG
空间中的极值点,每一个像素点要和它所有的相邻点进行比较,看其是否比它的图像域和尺度域的相邻点大或者小。如下图4所示,中间的检测点和它同尺度的8个相邻点及上下相邻尺度对应的9×2=18个点共26个点比较,以确保在二维图像空间和尺度空间都检测到极值点。 一个点如果在DoG
尺度空间在本层以及上下两层的26个点中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。
在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了3幅图像,高斯金字塔有每组S+3层图像,DoG
金字塔每组有S+2层图像。解释如下:
同样假设S=3,也就是每组有3层,则
k
=
2
1
s
=
2
1
3
k=2^{\frac1s}=2^{\frac13}
k=2s1=231,按照上图可得Gauss Space
和DoG space
分别有3个(S个)和2个(S-1个)分量,在DoG space
中,第一层两项分别是
σ
,
k
σ
σ, kσ
σ,kσ; 第二层两项分别是
2
σ
,
2
k
σ
2σ, 2kσ
2σ,2kσ,由于无法比较极值,我们必须在高斯空间继续添加高斯模糊项,使得形成
σ
,
k
σ
,
k
2
σ
,
k
3
σ
,
k
4
σ
σ,kσ,k^2σ,k^3σ,k^4σ
σ,kσ,k2σ,k3σ,k4σ,这样就可以选择DoG space
中的中间三项
k
σ
,
k
2
σ
,
k
3
σ
kσ,k^2σ,k^3σ
kσ,k2σ,k3σ(只有左右都有才能有极值),那么下一组中(由上一层降采样获得)所得三项即为
2
k
σ
,
2
k
2
σ
,
2
k
3
σ
2kσ,2k^2σ,2k^3σ
2kσ,2k2σ,2k3σ,其首项
2
k
σ
=
2
⋅
2
1
3
σ
=
2
4
3
σ
2kσ=2·2^{\frac13}σ=2^{\frac43}σ
2kσ=2⋅231σ=234σ。刚好与上一组末项
k
3
σ
=
2
⋅
(
2
1
3
)
3
σ
=
2
⋅
2
3
3
σ
k^3σ=2·(2^{\frac13})^3σ=2·2^{\frac33}σ
k3σ=2⋅(231)3σ=2⋅233σ尺度变化连续起来,所以每次要在Gaussian space
添加3项,每组共S+3层图像,相应的DoG
金字塔有S+2层图像。
5. 关键点定位
上述检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG
算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。
5.1 关键点的精确定位
离散空间的极值点并不是真正的极值点,下图6显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值。
为了提高关键点的稳定性,需要对尺度空间DoG
函数进行曲线插值。利用DoG
函数在尺度空间的Taylor
展开式(插值函数),任意一极值点在
(
x
0
,
y
0
,
σ
0
)
(x_0, y_0, σ_0)
(x0,y0,σ0)处的泰勒展开如下(去掉2阶后面的高次项):
f ( [ x y σ ] ) ≈ f ( [ x 0 y 0 σ 0 ] ) + [ ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ σ ] ( [ x y σ ] − [ x 0 y 0 σ ] ) (7) f \left({ \left[ \begin{matrix} x \\ y \\ σ \end{matrix} \right]}\right) ≈ f \left({ \left[ \begin{matrix} x_0 \\ y_0 \\ σ_0 \end{matrix} \right]}\right)+\left[\frac{∂f}{∂x},\frac{∂f}{∂y},\frac{∂f}{∂σ}\right] \left({\left[\begin{matrix} x\\ y\\ σ\end{matrix} \right]}-{\left[\begin{matrix} x_0\\ y_0\\ σ\end{matrix} \right]}\right) \tag{7} f⎝⎛⎣⎡xyσ⎦⎤⎠⎞≈f⎝⎛⎣⎡x0y0σ0⎦⎤⎠⎞+[∂x∂f,∂y∂f,∂σ∂f]⎝⎛⎣⎡xyσ⎦⎤−⎣⎡x0y0σ⎦⎤⎠⎞(7)
上式的矩阵表示如下:
D
(
X
)
=
D
+
∂
D
T
∂
X
X
+
1
2
X
T
∂
2
D
∂
X
2
X
(8)
D(X)=D+\frac{∂D^T}{∂X}X+\frac12X^T\frac{∂^2D}{∂X^2}X\tag{8}
D(X)=D+∂X∂DTX+21XT∂X2∂2DX(8)
其中,对
X
X
X求导并令方程等于0,可以得到极值点的偏移量为
X
^
=
−
∂
2
D
−
1
∂
X
2
∂
D
∂
X
(9)
\hat{X}=-\frac{∂^2D^{-1}}{∂X^2}\frac{∂D}{∂X}\tag{9}
X^=−∂X2∂2D−1∂X∂D(9)
代入上述矩阵方程,对应极值点的值为
D
(
X
^
)
=
D
+
1
2
∂
D
T
∂
X
X
^
(10)
D(\hat{X})=D+\frac12\frac{∂D^T}{∂X}\hat{X}\tag{10}
D(X^)=D+21∂X∂DTX^(10)
其中,
X
^
\hat{X}
X^代表相对插值中心的偏移量,当它在任一维度上的偏移量大于0.5时(即
x
x
x或
y
y
y或
σ
σ
σ),意味着插值中心已经偏移到它的邻近点上,所以必须改变当前关键点的位置。同时在新的位置上反复插值直到收敛;也有可能超出所设定的迭代次数或者超出图像边界的范围,此时这样的点应该删除,在Lowe
中进行了5次迭代。另外,过小的点易受噪声的干扰而变得不稳定,所以将小于某个经验值(Lowe
论文中使用0.03,Rob Hess
等人实现时使用0.04/S)的极值点删除。同时,在此过程中获取特征点的精确位置(原位置加上拟合的偏移量)以及尺度(
σ
σ
σ)。
5.2 消除边缘响应
一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。DoG
算子会产生较强的边缘响应,需要剔除不稳定的边缘响应点。获取特征点处的Hessian
矩阵,主曲率通过一个2x2
的Hessian
矩阵
H
H
H求出(
D
D
D的主曲率和
H
H
H的特征值成正比):
H
=
[
D
x
x
D
x
y
D
x
y
D
y
y
]
(11)
H=\left[\begin{matrix} D_{xx} & D_{xy}\\ D_{xy} & D_{yy} \end{matrix}\right] \tag{11}
H=[DxxDxyDxyDyy](11)
假设 H H H的特征值为 α α α和 β β β( α α α和 β β β代表 x x x和 y y y方向的梯度)且 α > β α>β α>β,则
T
r
(
H
)
=
D
x
x
+
D
y
y
=
α
+
β
(12)
T_r(H)=D_{xx}+D_{yy}=α+β\tag{12}
Tr(H)=Dxx+Dyy=α+β(12)
D
e
t
(
H
)
=
D
x
x
D
y
y
−
(
D
x
y
)
2
=
α
β
(13)
Det(H)=D_{xx}D_{yy}-(D_{xy})^2=αβ\tag{13}
Det(H)=DxxDyy−(Dxy)2=αβ(13)
令
α
=
γ
β
α=γβ
α=γβ,则
T
r
(
H
)
2
D
e
t
(
H
)
=
(
α
+
β
)
2
α
β
=
(
γ
β
+
β
)
2
γ
β
2
=
(
γ
+
1
)
2
γ
(14)
\frac {Tr(H)^2}{Det(H)}=\frac{(α+β)^2}{αβ}=\frac{(γβ+β)^2}{γβ^2}=\frac{(γ+1)^2}{γ}\tag{14}
Det(H)Tr(H)2=αβ(α+β)2=γβ2(γβ+β)2=γ(γ+1)2(14)
(
γ
+
1
)
2
/
γ
(γ+1)^2/γ
(γ+1)2/γ的值在两个特征值相等时最小,随着
γ
γ
γ的增大而增大。值越大,说明两个特征值的比值越大,即在某一个方向的梯度值越大,而在另一个方向的梯度值越小,而边缘恰恰就是这种情况。所以为了剔除边缘响应点,需要让该比值小于一定的阈值,因此,为了检测主曲率是否在某域值
γ
γ
γ下,只需检测:
T
r
(
H
)
2
D
e
t
(
H
)
<
(
γ
+
1
)
2
γ
(15)
\frac {Tr(H)^2}{Det(H)}<\frac{(γ+1)^2}{γ}\tag{15}
Det(H)Tr(H)2<γ(γ+1)2(15)
如果 ( α + β ) 2 / α β > ( γ + 1 ) 2 / γ (α+β)^2/αβ>(γ+1)^2/γ (α+β)2/αβ>(γ+1)2/γ则舍弃,在Lowe文章中,取 γ = 10 γ=10 γ=10。
6. 特征方向确定
上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。
6.1 梯度计算
对于在DoG
金字塔中检测出的关键点,采集其所在高斯金字塔图像
3
σ
3σ
3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:
m
(
x
,
y
)
=
(
L
(
x
+
1
,
y
)
−
L
(
x
−
1
,
y
)
)
2
+
(
L
(
x
,
y
+
1
)
−
L
(
x
,
y
−
1
)
)
2
(16)
m(x,y)=\sqrt{(L(x+1,y)-L(x-1,y))^2+(L(x,y+1)-L(x,y-1))^2}\tag{16}
m(x,y)=(L(x+1,y)−L(x−1,y))2+(L(x,y+1)−L(x,y−1))2(16)
θ
(
x
,
y
)
=
t
a
n
−
1
(
(
L
(
x
,
y
+
1
)
−
L
(
x
,
y
−
1
)
)
/
L
(
x
+
1
,
y
)
−
L
(
x
−
1
,
y
)
)
(17)
θ(x,y)=tan^{-1}((L(x,y+1)-L(x,y-1))/L(x+1,y)-L(x-1,y))\tag{17}
θ(x,y)=tan−1((L(x,y+1)−L(x,y−1))/L(x+1,y)−L(x−1,y))(17)
L
L
L为关键点所在的尺度空间值,按Lowe
的建议,梯度的模值
m
(
x
,
y
)
m(x,y)
m(x,y)按
σ
=
1.5
σ
o
c
t
σ=1.5σ_{oct}
σ=1.5σoct的高斯分布加成,按尺度采样的
3
σ
3σ
3σ原则,领域窗口半径为
3
×
1.5
σ
o
c
t
3×1.5σ_{oct}
3×1.5σoct。
6.2 梯度直方图
梯度直方图的范围是0~360°,其中每45°一个
b
i
n
bin
bin,总共8个
b
i
n
s
bins
bins,或每10°为一个
b
i
n
bin
bin,总共有36个
b
i
n
s
bins
bins。随着距中心点越远的邻域对梯度直方图的贡献越小。在实际计算时,在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。Lowe
论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向。如下图7所示,为简化,图中只画了八个方向的直方图。
方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。因此,对于同一梯度值的多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建但方向不同。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且,离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值。
如果在第
i
i
i个
b
i
n
bin
bin寻找一个确定的方向,由以上分析做出以下假设:
假设插值抛物线方程为
H
(
u
)
=
a
u
2
+
b
u
+
c
H(u)=au^2+bu+c
H(u)=au2+bu+c,其中
a
,
b
,
c
a,b,c
a,b,c为抛物线的系数,
u
∈
[
−
1
,
1
]
u∈[-1,1]
u∈[−1,1],对此抛物线求导并令其等于0。
由 H ′ ( u ) = 0 H'(u)=0 H′(u)=0得 u m a x = − b 2 a u_{max}=-\frac{b}{2a} umax=−2ab,即抛物线的顶点位置横坐标。现分别将 H ( − 1 ) , H ( 0 ) , H ( 1 ) H(-1),H(0),H(1) H(−1),H(0),H(1)代入抛物线插值方程
{ H ( − 1 ) = a − b + c H ( 0 ) = c H ( 1 ) = a + b + c (18) \begin{cases} H(-1)=a-b+c \\ H(0)=c \\ H(1)=a+b+c \end{cases} \tag{18} ⎩⎪⎨⎪⎧H(−1)=a−b+cH(0)=cH(1)=a+b+c(18)
解得
{ a = [ H ( 1 ) + H ( − 1 ) ] / 2 − H ( 0 ) b = [ H ( 1 ) − H ( − 1 ) ] / 2 c = H ( 0 ) (19) \begin{cases} a=[H(1)+H(-1)] /2-H(0)\\ b=[H(1)-H(-1)]/2 \\ c=H(0) \end{cases} \tag{19} ⎩⎪⎨⎪⎧a=[H(1)+H(−1)]/2−H(0)b=[H(1)−H(−1)]/2c=H(0)(19)
进一步可得
u m a x = − b 2 a = H ( − 1 ) − H ( 1 ) 2 [ H ( − 1 ) + H ( 1 ) − 2 H ( 0 ) ] u_{max}=-\frac{b}{2a}=\frac{H(-1)-H(1)}{2[H(-1)+H(1)-2H(0)]} umax=−2ab=2[H(−1)+H(1)−2H(0)]H(−1)−H(1),即局部坐标系中的值。 b i n bin bin在直方图中的索引号为 i ′ = i + u m a x = i + H ( − 1 ) − H ( 1 ) 2 [ H ( − 1 ) + H ( 1 ) − 2 H ( 0 ) ] i'=i+u_{max}=i+\frac{H(-1)-H(1)}{2[H(-1)+H(1)-2H(0)]} i′=i+umax=i+2[H(−1)+H(1)−2H(0)]H(−1)−H(1)。
至此,图像的关键点已检测完毕,每个关键点有三个信息:位置、所处尺度、方向。由此可以确定一个SIFT
特征区域。
7. 关键点描述
通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,使其不随各种变化而改变,比如光照变化、视角变化等等。并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
SIFT
描述子是关键点邻域高斯图像梯度统计结果的一种表示。通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。Lowe
建议描述子使用在关键点尺度空间内4×4
的窗口中计算的8个方向的梯度信息,共4*4*8=128
维向量表征。
7.1 确定描述子所需的区域
特征描述子与特征点所在的尺度有关,所以对梯度的求取应在特征点对应的高斯图像上进行。将关键点附近的邻域划分为
d
×
d
d×d
d×d(Lowe
建议
d
=
4
d=4
d=4)个子区域,每个子区域做为一个种子点,每个种子点有8个方向。每个子区域的大小与关键点方向分配时相同,即每个区域有
3
σ
o
c
t
3σ_{oct}
3σoct个子像素,为每个子区域分配边长为
3
σ
o
c
t
3σ_{oct}
3σoct的矩形区域进行采样(
3
σ
o
c
t
3σ_{oct}
3σoct个子像素实际用边长为
3
σ
o
c
t
\sqrt{3σ_{oct}}
3σoct的矩形区域即可包含,为了简化计算取其边长为
3
σ
o
c
t
3σ_{oct}
3σoct,并且采样点宜多不宜少)。考虑到实际计算时,需要采用三线性插值,所需图像窗口边长为
3
σ
o
c
t
×
(
d
+
1
)
3σ_{oct}×(d+1)
3σoct×(d+1)。在考虑到旋转因素(方便下一步将坐标轴旋转到关键点的方向),如下图9所示,实际计算所需的图像区域半径为:
7.2 坐标轴旋转至主方向及分配采样点
将坐标轴旋转为关键点的方向,以确保旋转不变性。
旋转后邻域内采样点的新坐标为
(
x
′
y
′
)
=
(
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
)
(
x
y
)
(20)
\left(\begin{matrix} x'\\ y' \end{matrix}\right)= \left(\begin{matrix} cosθ & -sinθ\\ sinθ & cosθ \end{matrix}\right) \left(\begin{matrix} x\\ y \end{matrix}\right) \tag{20}
(x′y′)=(cosθsinθ−sinθcosθ)(xy)(20)
其中
(
x
,
y
)
∈
[
−
r
a
d
i
u
s
,
r
a
d
i
u
s
]
(x,y)∈[-radius,radius]
(x,y)∈[−radius,radius]
将邻域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8个方向上,计算其权值。旋转后的采样点坐标在半径为 r a d i u s radius radius的圆内被分配到的子区域,计算影响子区域的采样点的梯度和方向,分配到8个方向上,旋转后的采样点落在子区域的坐标为
( x ′ ′ y ′ ′ ) = 1 3 σ o c t ( x ′ y ′ ) + d 2 (21) \left(\begin{matrix} x''\\ y'' \end{matrix}\right)= \frac1{3σ_{oct}}\left(\begin{matrix} x'\\ y' \end{matrix}\right)+\frac d2 \tag{21} (x′′y′′)=3σoct1(x′y′)+2d(21)
该坐标为归一化后的坐标,在特征点局部坐标系中把
3
σ
3σ
3σ长度作为1个单元长度,
d
/
2
d/2
d/2是把坐标系由特征点处平移至左上角的边界点上。Lowe
建议子区域的像素的梯度大小按
σ
=
0.5
d
σ=0.5d
σ=0.5d的高斯加权计算,即
w = m ( a + x , b + y ) ∗ e − ( x ′ ) 2 + ( y ′ ) 2 2 × ( 0.5 d ) 2 (22) w=m(a+x,b+y)*e^{-\frac{(x')^2+(y')^2}{2×(0.5d)^2}}\tag{22} w=m(a+x,b+y)∗e−2×(0.5d)2(x′)2+(y′)2(22)
其中 a , b a,b a,b为关键点在高斯金字塔图像中的位置坐标。
7.3 插值计算种子点八个方向的梯度
采样点在子区域中的坐标 ( x ′ ′ , y ′ ′ ) (x'',y'') (x′′,y′′)(图中蓝色窗口内红色点)线性插值,计算其对每个种子点的贡献。如图11中的红色点,落在第0行和第1行之间,对这两行都有贡献。对第0行第3列种子点的贡献因子为 d r dr dr,对第1行第3列的贡献因子为 1 − d r 1-dr 1−dr,同理,对邻近两列的贡献因子为 d c dc dc和 1 − d c 1-dc 1−dc,对邻近两个方向的贡献因子为 d o do do和 1 − d o 1-do 1−do。则最终累加在每个方向上的梯度大小为:
w e i g h t = w ∗ d r k ∗ ( 1 − d r ) 1 − k ∗ d c m ∗ ( 1 − d c ) 1 − m ∗ d o n ∗ ( 1 − d o ) 1 − n (23) weight=w*dr^k*(1-dr)^{1-k}*dc^m*(1-dc)^{1-m}*do^n*(1-do)^{1-n}\tag{23} weight=w∗drk∗(1−dr)1−k∗dcm∗(1−dc)1−m∗don∗(1−do)1−n(23)
其中 k , m , n k,m,n k,m,n为0(像素点超出了对要插值区间的四个邻近子区间所在范围)或为1(像素点处在对要插值区间的四个邻近子区间之一所在范围)。
7.4 特征描述子及门限化
如上统计的4*4*8=128
个梯度信息即为该关键点的特征向量。特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理,对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以也能去除。得到的描述子向量为
H
=
(
h
1
,
h
2
,
.
.
.
,
h
128
)
H=(h_1,h_2,...,h_{128})
H=(h1,h2,...,h128),归一化后的特征向量为
L
=
(
L
1
,
L
2
,
.
.
.
.
,
L
128
)
L=(L_1,L_2,....,L_{128})
L=(L1,L2,....,L128),则
L i = h i ∑ j = 1 128 h j j = 1 , 2 , 3 , . . . (24) L_i=\frac{h_i}{\sqrt{\sum_{j=1}^{128}{h_j}}} j=1,2,3,...\tag{24} Li=∑j=1128hjhij=1,2,3,...(24)
描述子向量门限。非线性光照,相机饱和度变化对造成某些方向的梯度值过大,而对方向的影响微弱。因此设置门限值(向量归一化后,一般取0.2)截断较大的梯度值。然后,再进行一次归一化处理,提高特征的鉴别性。
7.5 SIFT特征提取算法流程总结
经过上述对SIFT特征提取的详细分析与推导,SIFT特征提取算法流程总结如下:
8. SIFT特征匹配
8.1 特征匹配策略
生成了两幅图的描述子
k
1
∗
128
k1*128
k1∗128维和
k
2
∗
128
k2*128
k2∗128维后,将两图中各个scale
(所有scale
)的描述子进行匹配,匹配上128维即可表示两个特征点匹配成功。
实际计算过程中,为了增强匹配的稳健性,Lowe
建议对每个关键点使用4×4
共16个种子点来描述,这样对于一个关键点就可以产生128个数据,即最终形成128维的SIFT
特征向量。此时SIFT
特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。当两幅图像的SIFT
特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT
匹配点数目会减少,但更加稳定。为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,Lowe
提出了比较最近邻距离与次近邻距离的方法,距离比率ratio
小于某个阈值认为是正确匹配。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio
值比较高。Lowe
推荐ratio
的阈值为0.8。但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio
取值在0. 4~0. 6之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点。作者建议ratio
的取值原则如下:
- ratio=0. 4 对于准确度要求高的匹配;
- ratio=0. 6 对于匹配点数目要求比较多的匹配;
- ratio=0. 5 一般情况下。
也可按如下原则:当最近邻距离<200时,ratio=0. 6
,反之ratio=0. 4
。ratio
的取值策略能排分错误匹配点。
8.2 实验演示
8.2.1 特征向量的生成
如下图所示,图13(加有噪声)与图15为模板图像(参考图像),图17为待匹配图像。在正常尺度大小情况下,它们的特征点检测如下图14、图16与图18所示。
当两幅图像的SIFT
特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值(本文为0.6),则接受这一对匹配点。
8.2.2 尺度变换特征匹配
为体现SIFT
现特征描述子基于物体上的局部特征点生成而与物体的大小无关的特点,现将待匹配图像以不同大小比例尺度(0.1-0.5)进行缩放后再与参考图像进行匹配,遍历参考图像,找到匹配数比较合适的缩放级别,观察待匹配图像与哪一幅参考图像更加匹配,即哪两幅图像相似信息量更多。其匹配效果如下图18所示。
从图18实验结果演示可以发现,通过缩放遍历,待匹配图像检测到的特征向量数逐渐增多,同时与参考图像的匹配对数也逐渐增多,缩放尺度scale=0.4
时,参考图像共有384个特征向量,待匹配图像检测到472个特征特征向量,匹配数达到62对,此时已找到匹配数比较适合的缩放级别,完成特征匹配过程。
9. SIFT的缺点
SIFT
在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在:
- 实时性不高;
- 对边缘光滑的目标无法准确提取特征点;
近来不断有人改进,其中最著名的有SURF
和CSIFT
。
10. 结尾
本篇文章详细介绍了SIFT
算法的来源,特点,检测性能及具体检测步骤,并且详细讲解了SIFT
算法理论原理。还根据检测到的SIFT
特征向量进行了实验演示,验证了图像局部SIFT
特征描述子具有较好的稳定性,独特性好,特征信息量丰富,匹配准确。最后简单地介绍了该算法存在的缺点。
参考资料
- David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004.
- David G.Lowe Object Recognition from Local Scale-Invariant Features. 1999
- Tony Lindeberg Scale-space theory: A basic tool for analysing structures at different scales.1994
- SIFT特征点提取
- SIFT算法详解
- SIFT特征提取分析
- 宋丹 10905056 尺度不变特征变换匹配算法Scale Invariant Feature Transform (SIFT)(PPT)
- 线性插值与抛物线插值
- Matlab图像处理学习笔记(六):基于sift特征点的人民币识别