谈谈对SIFT算法的理解

来源:互联网 发布:js 控制div的隐藏 编辑:程序博客网 时间:2024/06/05 17:30

参考资料

SIFT算法一般是指David G. Lowe在1999年提出,2001、2004两年改进后的算法。其中又属04年这篇最全面而详细。Lowe的论文和Demo参见其主页
http://www.cs.ubc.ca/~lowe/keypoints/

关于SIFT的研究非常多,我在学习中除了如上资料,还参照了以下内容:
一篇很不错的解释
http://blog.csdn.net/zddblog/article/details/7521424
MATLAB的VlFeat库,里面有SIFT的源代码http://www.vlfeat.org

概要

因为Lowe在论文中很多细节并未给出,导致很多人(包括我)在企图实现SIFT时遇到了很大的困难。在参照了前人的笔记以及代码后,我尝试搞懂Lowe的想法,并尽量把我所遇到的不太好理解的地方重点解释。尤其是一个经常被提起的问题:
关键点带有的尺度空间、DoG金字塔层数信息的利用
形象来说,就是
可能重合的关键点如何应用在同一张「二维」图像上,尽管我们在demo上看不到任何重合的SIFT向量,以及这样做的意义是什么
将在后文解释。然而对于和本算法关联不是那么大的知识,i.e. 高斯差分空间上极值点对应主曲率较大处,将给出一个模糊而形象的理解,并给出参考文献,以供有兴趣、有需求的朋友查阅。

希望这篇文章能够帮到各位。

SIFT主要目的

SIFT旨在解决缩放、平移、旋转变换下的图像匹配问题,同时也可以解决小角度的放射变换和3D投 影,以及部分照明因素、噪声的影响。

整体思想

Lowe将SIFT分成了四步,其中第一、二步从图像中提取关键点的位置 (keypoints),第三步对关键 点赋予方向,第四步将关键点包含的位置、方向信息综合成一个128维向量。 于是,SIFT将图像匹 配问题转化为向量最短(欧式)距离求解。

STEP 1 尺度空间极值点检测

关键点:对缩放和旋转变换保持某种性质不变的点
寻找尺度空间中的极值点,即可能的关键点

构建 DoG上的尺度空间

图中每一张平面都是一个经若干次变换得到的平面。 有图所示,我们最后得到的是一黄(左)一蓝(右)代表的两个金字塔状图片层。蓝金字塔(DoG)是黄金字塔相邻层差分得到。
「图」

下面关注黄金字塔的构建。 首先,左下角就是我们拿到的原图。 相同大小的图片成为一个组(octave),每组从下到上依次是1S+3张。 第i张图像由第1张卷积σi=ki1σ的高斯函数产生, 即:

L(x,y,σi)=G(x,y,σi)I(x,y)

其中
G(x,y,σ)=12πσ2e(x2+y2)/2σ2

下一组的第一张由前一组的倒数第三张做因子为2的降采样生成。其余同理。

这样,我们就定义了DoG上的尺度空间。在此空间上的极值点就是备选的关键点了。

选取 DoG和尺度空间的原因

探测在尺度变换下保持不变的位置可以通过寻找在不同尺度下稳定的特征决定。 这个一系列的尺度就是尺度空间。

高斯变换的理由在于:在一定条件下,尺度空间的核函数只有高斯函数。

对尺度空间做差分的原因:Lindeberg (1994)的研究表明Laplacian of Gaussian (LoG) 算子可以产生非常稳定的图像特征。因此理论上应当使用LoG对高斯空间(黄色金字塔)逐层寻找该层中的相对不变的位置,即稳定的特征。

然而,DoG与LoG十分相似,


σ2G=Gσ(G(x,y,kσ)G(x,y,σ)kσσ)

G(x,y,kσ)G(x,y,σ)(k1)σ22G

而且与LoG相比,DoG要好算得多,所以在SIFT算法中取高斯差分函数,即:

D(x,y,σ)==(G(x,y,kσ)G(x,y,σ))I(x,y)L(x,y,kσ)L(x,y,σ)

我们取k=2

极值点检测

我们在得到的DoG上,对每层每个像素点探查极值,方法如下:

  • 对给定点,将它的值与同层周围八 个点进行比较
  • 若是最值点(最大/最小),则继续与其上一层九个点、下一层九个点比较。
  • 若该点是此27个点中最值点,则认为是备选点。

Lowe在文中解释 ,由于大部分点都不满足第一条(同层八个点中 最大/最小),所以此算法可以迅速消除大部分点。

一些参数

下给出Lowe在文中所使用的参数。其值均是通过实验得出的较优解,故推导过程略。
S=3
σ=1.6
We double the size of the input image using linear interpolation prior to building the rst level of the pyramid.

STEP 2 关键点定位

此节将从3.1中的备选点里选出稳定的点(即为关键点)。

插值关键点的位置、 筛除低对比度的点

低对比度:在极值点的局部,函数D(x,y,σ)的值变化不大的点

  1. D(x,y,σ)在每个极值点x处泰勒展开,取到二阶项近似
    D(x)=D+(Dx)Tx+12xT2Dx2x
  2. Dx=0的点的偏移量x̂ =2D1x2Dx
  3. 如果偏移量大于0.5,则需要替换极值点的位置为其旁边的点(因为之前采用了以因子为2的降采样,所以求出的极值点不够精准),并再次求偏导。
  4. 丢弃D(x̂ )=D+DTxx̂ <0.03的点,即对比度比较低的点

消除边缘效应

因为DoG对边缘非常敏感,然而边缘上点的位置不好确定,也不稳定,所以要丢弃。

清除的要点:
1. DoG上的极值点有一个特性:D(x,y,σ)在边缘处的主曲率很大,在垂直方向上比较小。
2. **主曲率和D(x,y,σ)的海瑟矩阵H的特征值成正比
3. **

Tr(H)2Det(H)=(r+1)2r

其中
H=(DxxDxyDxyDyy)

Tr(H)=Dxx+Dyy=α+β

Det(H)=DxxDyy(Dxy)2=αβ

**所以原问题等价于消除r>10的点

STEP 3 分配方向

对每个关键点赋予一个或多个方向,方向的选取与该点的局部梯度方向(和幅值)有关。
1. 计算所有位置的梯度的幅值和方向

m(x,y)θ(x,y)==(L(x+1,y)L(x1,y)2+(L(x,y+1)L(x,y1))2tan1((L(x,y+1)L(x,y1))/(L(x+1,y)L(x1,y)))


2. 对每个关键点,如下建立方向直方图: 将360度分为36个bin
纵轴(每个bin统计的信息)是该点邻域内所有点梯度幅值的加权平均。 权值为 Gaussian- weighted circular window,为1.5倍的该点尺度
3. 直方图的最值所代表的方向(共36个方向)称为该点的主方向 如果有和主方向的值相差不超过80%的方向,则创建一个其他信息完全相同的关键点,并赋予此方向。 对如上选出的每个方向,其梯度幅值则需要插值一次再赋给关键点。
用双曲函数插值与方向最相邻的三个bin的幅值(为了更好的精度) 键点描述

STEP 4 关键点描述

利用关键点的位置、方向和所属尺度空间层数确定描述此点的向量

首先我们总结一下,目前关键点的特征值有:
1. 位置x,y
2. 尺度
3. 方向向量(方向、长度)

利用在上一章得到的每点方向和幅值,我们可以对每个关键点计算描述子:
1. 考虑关键点周围Gaussian-weighted circular window 这个邻域。将邻域内所有点的方向更新 为θθ0,其中为θ0该关键点的主方向
注:此步就是sift抗旋转的关键步骤
2. 类似上章建立方向直方图。 不同的是bin取为8个,Gaussian-weighted circular window 大小
如下图左所示,为窗口宽度的一半
「图」
图上表示的是从8*8样本中计算的2*2描述子;实际应用中选取16*16样本计算4*4个描述子
3. 得到的八个方向的长度均作为关键点的特征值合起来即构成描述子, 也就是(实际的)448=128维向量
4. 向量归一化(为了抗图像的对比度)
梯度能自然地抗亮度变化
单位向量里只要有任一值大于0.2,该值将被置为0.2,并再次归 一化(为 了减小非线性照明的影响。因为非线性照明会对某些梯度幅值带来较大变化,对梯度方向影响较小)

Algorithm

流程图如下

Q&A

不同层上产生的极值点
不同尺度空间下产生的关键点
尺度空间、关键点的scale是什么?
Gaussian 卷积时窗口大小、边缘的处理
3.2节的数学推导
「at last」所有位置均为离散操作…查看一下有无漏洞

改进

彩色通道

应用

0 0