Image feature descriptor
SIFT(Scale Invariable Feature Transform)
综述
SIFT算法的特点
- SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
- 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
- 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
- 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
- 可扩展性,可以很方便的与其他形式的特征向量进行联合。
SIFT算法可以解决的问题
- 目标的旋转、缩放、平移(RST)
- 图像仿射/投影变换(视点viewpoint)
- 光照影响(illumination)
- 目标遮挡(occlusion)
- 杂物场景(clutter)
- 噪声
Lowe的算法中将SIFT算法分为四步
- 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
- 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
- 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
- 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。
高斯模糊
目的是实现尺度不变性
二维高斯函数
G
(
r
)
=
1
2
π
σ
2
N
e
−
r
2
/
(
2
σ
2
)
(1)
G(r) = \frac{1}{{{{\sqrt {2\pi {\sigma ^2}} }^N}}}{e^{ - {r^2}/(2{\sigma ^2})}}\tag{1}
G(r)=2πσ2N1e−r2/(2σ2)(1)
其中,
σ
\sigma
σ是正态分布的标准差,
σ
\sigma
σ值越大,图像越模糊(平滑)。r 为模糊半径,模糊半径是指模板元素到模板中心的距离。
如二维模板大小为
m
∗
n
m*n
m∗n,则模板上的元素
(
x
,
y
)
(x,y)
(x,y)对应的高斯计算公式为:
G
(
x
,
y
)
=
1
2
π
σ
2
e
[
−
(
x
−
m
/
2
)
2
+
(
y
−
n
/
2
)
2
]
/
2
σ
2
(2)
G(x,y) = \frac{1}{{2\pi {\sigma ^2}}}{e^{[ - {{(x - m/2)}^2} + {{(y - n/2)}^2}]/2{\sigma ^2}}}\tag{2}
G(x,y)=2πσ21e[−(x−m/2)2+(y−n/2)2]/2σ2(2)
图像二维高斯模糊
用公式 ( 1 ) (1) (1)计算得到高斯模板矩阵的值与原图像做卷积, 取 σ = 0.6 \sigma=0.6 σ=0.6。
( 6.58573 e − 006 0.0424781 0.00170354 0.0424781 6.58573 e − 006 0.0424781 0.0273984 0.109878 0.109878 0.0424781 0.00170354 0.109878 0.440655 0.109878 0.00170354 0.0424781 0.0273984 0.109878 0.109878 0.0424781 6.58573 e − 006 0.0424781 0.00170354 0.0424781 6.58573 e − 006 ) (3) \left( {\begin{matrix} {{ 6.58573e-006}}&{{0.0424781}}&{{0.00170354}}&{{0.0424781}}&{{ 6.58573e-006}} \\ {{0.0424781}}&{{0.0273984}}&{{0.109878}}&{{0.109878}}&{{0.0424781}} \\ {{0.00170354}}&{{0.109878}}&{{0.440655}}&{{0.109878}}&{{0.00170354}} \\ {{0.0424781}}&{{0.0273984}}&{{0.109878}}&{{0.109878}}&{{0.0424781}} \\ {{ 6.58573e-006}}&{{0.0424781}}&{{0.00170354}}&{{0.0424781}}&{{ 6.58573e-006}} \end{matrix}} \right)\tag3 ⎝⎜⎜⎜⎜⎛6.58573e−0060.04247810.001703540.04247816.58573e−0060.04247810.02739840.1098780.02739840.04247810.001703540.1098780.4406550.1098780.001703540.04247810.1098780.1098780.1098780.04247816.58573e−0060.04247810.001703540.04247816.58573e−006⎠⎟⎟⎟⎟⎞(3)
import numpy as np
import matplotlib.pyplot as plt
from skimage import io
import pylab
import cv2
img = plt.imread("mnls.jpg") #在这里读取图片
plt.imshow(img) #显示读取的图片
pylab.show()
fil = np.array([[ 6.58573e-006,0.0424781, 0.00170354, 0.0424781,6.58573e-006], #这个是设置的滤波,也就是卷积核
[ 0.0424781, 0.0273984, 0.109878, 0.0273984, 0.0424781],
[ 0.00170354, 0.109878, 0.440655, 0.109878, 0.00170354],
[ 0.0424781, 0.0273984, 0.109878, 0.0273984, 0.0424781],
[ 6.58573e-006,0.0424781, 0.00170354, 0.0424781,6.58573e-006]
])
res = cv2.filter2D(img,-1,fil) #使用opencv的卷积函数
plt.imshow(res) #显示卷积后的图片
plt.imsave("res.jpg",res)
pylab.show()
尺度空间极值检测
尺度空间使用高斯金字塔表示。Tony Lindeberg指出尺度规范化的LoG(Laplacion of Gaussian)算子具有真正的尺度不变性,Lowe使用高斯差分金字塔近似LoG算子,在尺度空间检测稳定的关键点。
尺度空间理论
尺度空间(scale space)思想最早由Iijima于1962年提出的,后经witkin和Koenderink等人的推广逐渐得到关注。
其基本思想是:引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。
尺度空间中个尺度图像的模糊程度增加的过程刚好与人对目标由近到远的运动在视网膜上形成的过程相似。在多尺度中进行图像处理更能提取到本质特征。
由于视觉具有不变性,因此要求尺度空间算子对图像的分析与图像的位置、大小、角度以及仿射变换无关,即满足平移不变性、尺度不变性、欧几里得不变性、仿射不变性。
尺度空间的表示
一个图像的尺度空间
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
)
(4)
L(x,y,\sigma ) = G(x,y,\sigma )*I(x,y)\tag4
L(x,y,σ)=G(x,y,σ)∗I(x,y)(4)
其中,
∗
*
∗表示卷积运算 ,
G
(
x
,
y
,
σ
)
G(x,y,\sigma )
G(x,y,σ)为公式
(
2
)
(2)
(2)
高斯金字塔的构建
尺度空间在实现时使用高斯金字塔表式,其构建分为两部分:
- 对图像做降采样,按照图片的大小从小到大自上而下的排列,形成金字塔型;
- 对图像做不同尺度的高斯模糊。
高斯差分金字塔的构建
2002年。Mikolajczyk在实验比较后发现尺度归一化的高斯拉普拉斯算子
σ
2
∇
2
G
\sigma^2\nabla^2G
σ2∇2G的极值与梯度、角点等特征同时考虑,能够产生最稳定的图像特征。而Lindeberg在1994年发现DOG算子与LOG算子
σ
2
∇
2
G
\sigma^2\nabla^2G
σ2∇2G非常近似,因此Lowe使用更高效的DOG算子替代LOG算子进行极值检测(用差分替代微分):
KaTeX parse error: No such environment: split at position 8: \begin{̲s̲p̲l̲i̲t̲}̲ D(x,y,\sigma )…
在实际计算中,用高斯金字塔每octave中的相邻两幅图像相减,得到高斯差分图像,进行极值检测。
F
i
g
u
r
e
1
:
D
o
G
−
P
y
r
a
m
i
d
Figure1: DoG-Pyramid
Figure1:DoG−Pyramid
空间极值点检测
关键点是由DOG空间的局部极值点组成的,关键点的初步探查时通过同octave内各相邻两interval图像比较来完成的。
f
i
g
u
r
e
2
:
极
值
检
测
figure2:极值检测
figure2:极值检测
给定
x
−
y
−
s
c
a
l
e
x-y-scale
x−y−scale空间
X
X
X,测试像素点是否是其在空间中的26个相邻点(标记为绿色的点)的局部极值。
构建尺度空间需确定的参数
σ
\sigma
σ–尺度坐标
O
O
O–octave,层数
S
S
S–interval,层内图片标号
σ
(
o
,
s
)
=
σ
0
2
o
+
s
S
,
o
∈
[
0
,
1
,
.
.
.
,
O
−
1
]
,
s
∈
[
0
,
1
,
.
.
.
,
S
−
2
]
(5)
\sigma(o,s)=\sigma_02^{o+\frac{s}{S}},o\in[0,1,...,O-1],s\in[0,1,...,S-2]\tag5
σ(o,s)=σ02o+Ss,o∈[0,1,...,O−1],s∈[0,1,...,S−2](5)
其中
σ
0
\sigma_0
σ0是基准层尺度。关键点的尺度坐标就是按关键点所在的octave和internal的图片,利用公式
(
5
)
(5)
(5)计算而来。