SIFT算法综述
来源:互联网 发布:mac os x ei 编辑:程序博客网 时间:2024/06/05 10:12
一、SIFT算法综述
SIFT(Scale Invariant Feature Transform)全称尺度不变特征变换,是1999年Lowe提出的一种局部特征描述算子,在2004年得到了改善。
SIFT算子是把图像中检测到的特征点用一个128维的特征向量进行描述,因此一幅图像经过SIFT算法后表示为一个128维的特征向量集,该特征向量集具有对图像缩放,平移,旋转不变的特征,对于光照、仿射和投影变换也有一定的不变性,是一种非常优秀的局部特征描述算法。
SIFT算法的流程分别为:
- 尺度空间极点检测
- 关键点精确定位
- 关键点的方向确定
- 特征向量的生成
下面将会依次对这几步进行介绍。
二、尺度空间极点检测
2.1 尺度空间
特征点的检测就需要知道特征点的位置和尺度,需要位置的原因显而易见,而需要尺度的原因则是因为真实世界中的物体只有在一定尺度下才有意义。我们寻找的特征点就是要找到在连续的尺度空间下位置不发生改变的点。
构建尺度空间的目的就是找到在尺度变化中具有不变性的位置,可以使用连续的尺度变化,即在尺度空间中所有可能的尺度变化中找到稳定的特征点,通过这种方式找到的极点可以保证在图像缩放和旋转变化中具有不变性。
经过前人证明,尺度空间内核是高斯函数。因此假设
其中,
需要注意的是公式1中的图像
2.2 高斯差分
为了在尺度空间中找到稳定不变的极值点,在SIFT算法中使用了高斯差分(DOG)函数
选择高斯差分函数的原因如下:
1. 计算简单,因为
2. 高斯拉普拉斯算子LoG(Laplacian of Gaussian),即图像的二阶导数,能够在不同的尺度下检测到图像的斑点特征,从而检测到图像中尺度变化下的位置不动点,但是LoG的运算效率不高。而DoG是LoG的近似。DoG和LoG的关系如下述所示:
3. 通过前人的实验证明LoG提取的特征稳定性最强。
2.3 高斯金字塔与高斯差分金字塔
高斯金字塔和高斯差分金字塔如下图所示:
这里的几个参数定义如下:
1. 金字塔的组数(number of octaves):大多数情况下为4,但是实际上这个值与图像的大小有关,我在网上查到的资料大多数为
2. 每层的组数:
3. 参数:
——————————————————————分割线——————————————————————
下面我们详细讲一下高斯金字塔的生成过程:
设我们输入的图像的尺度为0.5(Lowe论文中设定),由该图像进行高斯模糊得到第0组的第0层图像作为基准图像,设它的尺度为
那么第0组中的图像的尺度为
但是第1组中的图像是第0组中的图像经过隔点采样后得到的,因此相对于输入图像分辨率来说,其尺度为
上述总结规律如下:
第
而DoG金字塔的生成过程就比较简单了,就是由高斯金字塔相邻的两层相减得到DoG金字塔中的一层,然后依次得到。由高斯金字塔中每组有
——————————————————分割线——————————————————
金字塔中每一组(octave)中的每层(scale)的平滑尺度都不同,下一组的第一层都是由上一层的倒数第三张的图像隔点降采样得到的。
这样做的目的是使DoG满足尺度连续性,下面讲具体的原因:
在高斯金字塔中第一组中的不同层中的平滑尺度分别为
由第二组的第一层的平滑尺度为
2.4 极值点的选定
如上图的最右方所示,只有当前点与其周围26个点值相比,如果是最大值或者最小值则该点为极值点,否则不是。这种比较计算量比较小,因为大多数的点在比较的前几步就已经被pass掉了
这里还有一个问题,对于除第一组以外的其他组中得到的极值点的位置,如何映射到原图中的位置呢?这里我觉得可能是根据位置的对应关系,但是具体还不清楚,等我把sift的实现源码看完后再解释。(这样理解是对的!)
三、特征点的精确定位
计算机中存储的图像数据是离散的,而我们之前找到的极值点也就是离散空间中的极值点,但是离散空间中的极值点并不是真实的连续空间中的极值点。所以需要对DoG空间进行拟合处理,以找到极值点的精确位置和尺度。另外,我们还需要去除那些在边缘位置的极值点,以提高关键点的稳定性。
3.1 特征点精确定位
在Lowe的论文中,使用的是泰勒展开式作为拟合函数。通过SIFT算法详解(1)综述与尺度空间检测中提到的,我们得到的极值点是一个三维向量,包括它所在的尺度
另外,如果13式中得到
3.2 去除不稳定极值点
有些极值点的位置是在图像的边缘位置的,因为图像的边缘点很难定位,同时也容易受到噪声的干扰,我们把这些点看做是不稳定的极值点,需要进行去除。
由于图像中的物体的边缘位置的点的主曲率一般会比较高,因此我们可以通过主曲率来判断该点是否在物体的边缘位置。某像素点位置处的主曲率可以由二维的Hessian矩阵
首先需要去除行列式为负的点。接下来需要去掉主曲率比较大的点,Lowe中使用如下判断规则:
四、特征点方向的计算
为了实现特征点的旋转不变性,因此需要计算特征点的角度。在计算特征点的方向时是根据特征点所在的高斯尺度图像中的局部特征计算出的。该高斯尺度
像素的梯度幅值计算公式为
在完成邻域范围内的梯度幅值和幅角的计算以后,需要建立直方图来对邻域内各个像素点的幅角进行记录。在这里直方图一共分为36个柱,每个柱表示10度。把邻域内的所有像素点按所在的幅角范围进行分类,这里以0度~9度为例,把邻域内的所有幅角在该范围内的像素点的幅角乘以加权后的值相加作为该柱的高度。
把直方图建立好后,为了防止噪声的干扰,需要对直方图进行平滑。在OpenCV中的SIFT源码是使用下式进行平滑的
需要寻找直方图中的最高柱作为该特征点的主方向,因为该柱体表示的是一个范围,要精确求值需要如下的拟合
我们需要求出该柱体的具体的值,因为在Lowe的论文中,最高柱体的80%是一个阈值,用来判断该特征点的辅方向。
这样我们已经求出了SIFT特征点,以及特征点的方向,下面就是对于特征点的描述符的生成过程。
经过前面的一系列的操作,我们已经可以得到了图像中的所有特征点,并且计算了他们的方向。接下来要做的就是特征点描述符的生成了,有了特征点描述符,我们就可以准确的描述特征点,相当于特征点的特征,后面我们进行特征点匹配时用到的特征就是特征点描述符。
特征点描述符是跟特征点所在的尺度相关的,因此我们需要在特征点所在的尺度图像中生成特征点的描述符。在Lowe的论文中,把特征点的邻域区域划分为
为了保证特征点的方向不变性,我们需要把特征点及其邻域进行旋转,旋转角度即为特征点的角度。由于是对正方形进行旋转,为了使旋转的区域包含整个正方形,则旋转的半径应为这个正方形的对角线的一半,即
像素点的旋转过程如下
在这里,我们仍然需要计算像素点的梯度幅值和梯度幅角,用以生成直方图,同样,这里根据像素点与特征点的距离,像素点的加权值也是不一样的,这里仍然采用高斯加权,高斯处理的方法为
最终形成的是一个128柱的直方图(
这里需要注意一下,因为我们把特征点的邻域区域划分为了
因此每个像素点对于整个直方图的贡献的计算如下所述:
- 计算各个像素点的梯度幅值和梯度幅角;
- 根据该像素点距离特征点的距离进行加权(即第一次高斯加权),该像素点的幅值乘以加权值;
- 根据该像素点在所在的小正方形区域内据中心的距离进行加权(即第二次高斯加权),把2中的结果再乘以一个权值。
经过上面的计算,就可以得到128柱的直方图
实际上为了去除非线性光照的变化,在实现的过程中对于已经归一化好的描述符
————————————————————————————分割线————————————————————————————
最后放一点资料,主要是博客网址,其实现在SIFT算法研究的已经比较透彻了,网上有好多分析SIFT算法的文章,自己去找,英文好的话可以直接去读Lowe的论文。
这里放一些我写这几篇博客主要参考的网址,因为我写博客主要的目的是让我确认我确实理解这些算法了,因为只有理解了才能顺畅的介绍下来,其实我这几篇博客我参考的人有很多,主要有:
赵春江的专栏:Opencv2.4.9源码分析——SIFT
这篇写的SIFT算法非常非常详细,作者真是非常厉害!不过有些许错误,不过理解了SIFT以后发现这点错误也比较容易,这里就不列举了
小魏的修行路:SIFT原理与源码分析
这一系列文章也写得非常好,这两篇博文可以参照着看。
Rachel Zhang的介绍SIFT的博文
我的博客主要是用我认为好理解的话把SIFT算法的流程又说了一遍,写的马马虎虎。
- SIFT算法综述
- SIFT算法综述
- SIFT综述
- SIFT/ SURF/ORB综述
- sift算法
- SIFT算法
- sift算法
- SIFT 算法
- sift算法
- SIFT算法
- SIFT 算法
- SIFT算法
- SIFT算法
- SIFT算法
- SIFT算法
- SIFT算法
- SIFT算法
- SIFT算法
- Android通过EventBus进行对activity到fragment跳转的控制
- 简单商品展示案例(ListView)
- 今天开通我的博客啦~
- POJ 3744 Scout YYF I (矩阵优化的概率DP)
- MySQL/事务
- SIFT算法综述
- 微信小程序开发之搭建腾讯云ubuntu开发环境PHP+MYSQL+APACHE2
- ARM指令例子
- 分布式计算、并行计算及集群、网格、云计算的区别
- Nginx+uwsgi部署django项目
- 心跳机制、轮询、长连接的概念
- 5. Longest Palindromic Substring
- poj 1837 dp推方案数
- 国产优化