SIFT算法
SIFT算法分解为如下四步:
- 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函 数来识别潜在的对于尺度和旋转不变的兴趣点。
- 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来 确定位置和尺度。关键点的选择依据于它们的稳定程度。
- 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个 或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺 度和位置进行变换,从而提供对于这些变换的不变性。 4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图 像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局 部形状的变形和光照变化。
尺度空间
在一定的范围内,无论物体是大是小,人眼都可以分辨出来,然而计算机要有相同的能力却很难,所以要让机器能够对物体在不同尺度下有 一个统一的认知, 就需要考虑图像在不同尺度下都存在的特点。
尺度空间的表示
首先引入高斯模糊的概念:
模板上的元素(x,y)对应的高斯计算公式为:
其中,𝜎 是正态分布的标准差,值越大,分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。这样进行模糊处理比其 它的均衡模糊滤波器更高地保留了边缘效果。
一个图像的尺度空间就可以表示了, 定义为G(变化尺度的高斯函数)和I(原图像)的卷积:
高斯金字塔
高斯金字塔的构建分为两部分:
-
对图像做不同尺度的高斯模糊;
-
对图像做降采样(隔点采样)。
图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大 小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子 塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张 图像),每个金字塔共n层。金字塔的层数根据图像的原始大小和塔 顶图像的大小共同决定,其计算公式如下
n = log 2 { min ( M , N ) − t , t ∈ [ 0 , log 2 { min ( M , N ) } ) n=\log _{2}\left\{\min (M, N)-t, t \in\left[0, \log _{2}\{\min (M, N)\}\right)\right. n=log2{min(M,N)−t,t∈[0,log2{min(M,N)})
其中M,N为原图像的大小,t为塔顶图像的最小维数的对数值。如,对 于大小为512512的图像,金字塔上各层图像的大小如表所示,当塔顶图 像为44时,n=7,当塔顶图像为2*2时,n=8。
为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如所示,将图像金字塔每层的一张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave),金字塔每层只有一组图像,组数和金字塔层数相等,使用公式
n
=
log
2
{
min
(
M
,
N
)
−
t
,
t
∈
[
0
,
log
2
{
min
(
M
,
N
)
}
)
n=\log _{2}\left\{\min (M, N)-t, t \in\left[0, \log _{2}\{\min (M, N)\}\right)\right.
n=log2{min(M,N)−t,t∈[0,log2{min(M,N)})计算,每组含有多张(也叫层Interval)图像。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。
⾼斯⾦字塔的构建过程
1,先将原图像扩大一倍之后作为高斯金字塔的第1组第1层,将第1 组第1层图像经高斯卷积(高斯平滑或称高斯滤波)之后作为第1组金 字塔的第2层。对于参数 σ,在SIFT算子中取的是固定值 1.6
2,将 σ 乘以一个比例系数k,等到一个新的平滑因子 σ = k*σ,用 它来平滑第1组第2层图像,结果图像作为第3层。
3,如此重复,最后得到L层图像,在同一组中,每一层图像的尺寸都 是一样的,只是平滑系数不一样。它们对应的平滑系数分别为:0,σ, kσ,k2σ,k3σ……k^(L-2)σ。
4,将第1组导数第三层图像作为比例因子为2的降采样,得到的图 像作为第2组的第1层,然后对第2组的第1层图像作平滑因子为 σ 的高 斯平滑,得到第2组的第2层,就像步骤2中一样,如此得到第2组的L层 图像,同组内它们的尺寸是一样的,对应的平滑系数分别为:0,σ, kσ,k2σ,k3σ……k^(L-2)σ。但是在尺寸方面第2组是第1组图像的一 半。
这样反复执行,就可以得到一共O组,每组L层,共计O*L个图像, 这些图像一起就构成了高斯金字塔,结构如下:
DOG算子 Difference of Gaussian
使用更高效的高斯差分算子代替拉普拉斯算子进行极值检测
DOG金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层 得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构 成差分金字塔。概括为DOG金字塔的第 o 组第 l 层图像是有高斯金字 塔的第 o 组第 l+1 层减第 o 组第 l 层得到的。
- 在同一组内,不同层图像的尺寸是一样的,后一层图像的高斯平滑因子σ是前一层图像平滑因子的k倍;
- 在不同组内,后一组第一个图像是前一组倒数第三个图像的二 分之一采样,图像大小是前一组的一半;
Detection of scale-space extrema 空间极值点检测(关键点的初步探查
关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图 像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺 度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确 保在尺度空间和二维图像空间都检测到极值点。
由于要在相邻尺度进行比较,如高斯差分金子塔图,只能在中间两层中进行两个尺度的极值点检测,其它尺度则只能在不同组中进行。为了在 每组中检测S个尺度的极值点,则DOG金字塔每组需S+2层图像,而DOG 金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组需S+3层 图像,实际计算时S在3到5之间。
当然这样产生的极值点并不全都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应。
Accurate keypoint localization
离散空间的极值点并不是真正的极值点,下图显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用 知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。
– perform a detailed fit to the nearby data to accurately determine position, scale
对附近数据进行详细拟合,以准确确定位置
– keypoints that have low contrast (and are therefore sensitive to noise) or are poorly localized along an edge are removed
对比度低(因此对噪声敏感)或沿边缘局部较差的关键点被去除
优化kp location的公式:
Taylor expansion of the DoG function at 𝒙0
taking the derivative of 𝐷(𝒙) with respect to 𝒙 and setting it to zero
计算D(x)对x的偏导,令其为0,将得到的表达式记为x*, 得到:
Keypoints that have low contrast ( 𝐷 𝒙∗ < 𝑎𝑡ℎ𝑟𝑒𝑠ℎ𝑜𝑙𝑑) or are poorly localized along an edge are removed.
对比度低(𝐷∗ <𝑎𝑡ℎ𝑟𝑒𝑠ℎ𝑜𝑙𝑑)或沿边缘局部较差的关键点被去除。
Compute keypoints’ orientations 关键点方向分配
-
Use the blurred image associated with the keypoint’s scale
为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个 关键点分配一个基准方向。
-
Take image gradients over the keypoint neighborhood
使用图像梯度的方法求取局部结构的稳定方向。对于在DOG金字塔中检测出的关键点点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯 度和方向分布特征。梯度的模值和方向计算公式如下
-
Create a 36-bin histogram of gradient orientations; each sample added to the histogram is weighted by its gradient magnitude and by a Gaussian weighted window
在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向。梯度直方图将0~360度的方向范围分为36个柱(bins),其中每柱10度。如图所示,直方图的峰值方向代表了关键点的主方向,(为简化, 图中只画了八个方向的直方图)。
-
Key point orientation 𝜃: peak of the histogram.
关键点方向𝜃:直方图的峰值。
方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。因此,对于同一梯度值的多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建但方向不同。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且,离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值
descriptors 关键点特征描述
通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。 这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点, 并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
Matching descriptors
- 先计算比较两张图片之间的欧式距离大小:
- 然后在计算计算距离的ratio:当ratio>0.8时,我们就拒绝匹配
Laplacian of Gaussian
尺度归一化拉普拉斯算子高斯(Scale-normalized Laplacian of Gaussian)
The Difference-of-Gaussian provides a close approximation to the scale-normalized Laplacian of Gaussian
高斯差分(DoG)提供了对高斯尺度归一化拉普拉斯算子(NLoG)的近似近似的计算方法:
应用
-
Blob detection with scale normalized Laplacian of Gaussian
斑点检测