之前在学习三维重建的过程中,了解过SIFT算法,现在老师要求详细的了解SIFT算法,看看能不能对它进行改进,于是又详细的看了一遍SIFT算法。记录一下。
一、SIFT算法综述
SIFT(Scale Invariant Feature Transform)全称尺度不变特征变换,是1999年Lowe提出的一种局部特征描述算子,在2004年得到了改善。
SIFT算子是把图像中检测到的特征点用一个128维的特征向量进行描述,因此一幅图像经过SIFT算法后表示为一个128维的特征向量集,该特征向量集具有对图像缩放,平移,旋转不变的特征,对于光照、仿射和投影变换也有一定的不变性,是一种非常优秀的局部特征描述算法。
SIFT算法的流程分别为:
- 尺度空间极点检测
- 关键点精确定位
- 关键点的方向确定
- 特征向量的生成
下面将会依次对这几步进行介绍。
二、尺度空间极点检测
2.1 尺度空间
特征点的检测就需要知道特征点的位置和尺度,需要位置的原因显而易见,而需要尺度的原因则是因为真实世界中的物体只有在一定尺度下才有意义。我们寻找的特征点就是要找到在连续的尺度空间下位置不发生改变的点。
构建尺度空间的目的就是找到在尺度变化中具有不变性的位置,可以使用连续的尺度变化,即在尺度空间中所有可能的尺度变化中找到稳定的特征点,通过这种方式找到的极点可以保证在图像缩放和旋转变化中具有不变性。
经过前人证明,尺度空间内核是高斯函数。因此假设 I(x,y) 是原始图像, G(x,y,σ) 是尺度空间可变的高斯函数,则一个图像的尺度空间可以定义为
其中, ∗ 表示的是卷积运算,
需要注意的是公式1中的图像 I(x,y) 具有无限的分辨率,也就是说他的尺度 σ=0 ,即 I(x,y)=L(x,y,0) 。也就是说公式1得到的尺度空间图像 L(x,y,σ) 是由尺度尺度空间为0的图像 L(x,y,0 生成的,但是现实生活中是不存在尺度空间为0,即具有无限分辨率的图像的。在Lowe的论文中,他们给定原图一个很小的尺度空间,为0.5。因此由一个小尺度空间图像 L(x,y,σ1) 生成一个大的尺度空间图像 L(x,y,σ2) 的过程为
2.2 高斯差分
为了在尺度空间中找到稳定不变的极值点,在SIFT算法中使用了高斯差分(DOG)函数 D(x,y,σ) ,定义为
选择高斯差分函数的原因如下:
1. 计算简单,因为 L(x,y,σ) 是一定需要计算的,而 D(x,y,σ) 只需要执行减法。
2. 高斯拉普拉斯算子LoG(Laplacian of Gaussian),即图像的二阶导数,能够在不同的尺度下检测到图像的斑点特征,从而检测到图像中尺度变化下的位置不动点,但是LoG的运算效率不高。而DoG是LoG的近似。DoG和LoG的关系如下述所示:
3. 通过前人的实验证明LoG提取的特征稳定性最强。
2.3 高斯金字塔与高斯差分金字塔
高斯金字塔和高斯差分金字塔如下图所示:
这里的几个参数定义如下:
1. 金字塔的组数(number of octaves):大多数情况下为4,但是实际上这个值与图像的大小有关,我在网上查到的资料大多数为