您的位置:首页 > 其它

sift 算法理解

2015-11-05 11:11 148 查看
关于sift算法的理解,前前后后也用了一个月的时间,今天写下来,希望可以对大家有所帮助。

该算法可以分为四大步,如图所示:



复杂程度依次是4颗星,2颗星,3颗星,3颗星。

现在开始

1、construct scale space, 构造尺度空间

1.1 尺度空间在图像处理中是一个非常有用的概念,可以在维基百科上找到完整定义,简而言之,他的作用就是模拟一个由近到远的物体在人眼视网膜上的成像过程。比如,你脸前的电脑屏幕,距离你0.5米,它“看起来”是个屏幕,倘若把他放到100米之外,它“看起来”就是一个“点”了。如下图:



1.2 图像尺度空间的定义:原图像和高斯核做卷积操作



•L is a blurred image
•G is the Gaussian Blur operator
•I is an image
•x,y are the location coordinates
•σ is the “scale” parameter. The amount ofblur. Greater the value, greater the blur.
一定要留意这个σ,sift算法从头到尾,我们都需要这个值,一定要放在脑子里!
•The *is the convolution operation in x and y. It applies Gaussian blur G onto image I

注意:
–高斯核是唯一一个能产生尺度空间的核。
–尺度是自然存在的,不是人为创造的。高斯卷积仅仅是种解释尺度空间的方法。

1.3 我们使用高斯金字塔来描述尺度空间



解释:
1、一大摞那个东西叫做一个octave(翻译为“组”), 每个octave由若干个interval(翻译为“层”)组成。
2、层之间做的是高斯平滑操作,传到下一个组的时候,做的是降采样操作。其实就是传统金字塔加上高斯平滑操作。
3、用每组的倒数第三层,降采样,生成下一组的第一层。
4、金字塔要从下往上看!从下往上看!从下往上看!说三遍!

1.4



高斯金字塔属性:
1、每组生成s+3个层,如上图,生成5层,则s=2;
2、组内,相邻两层的尺度空间关系是k倍,k= 21/s   ,
例子中,k= 21/2   .
3、每组的相同位置的层,尺度空间关系是2倍。

1.5至此,建造完尺度空间,生成了什么鬼?给出一个动态的例子,一目了然。
https://img-blog.csdn.net/20130524205728672


1.6 但是到这,还没完,sift的创造者想出来一个惊天地泣鬼神的方法,如下:



其中 

正是规范化的LoG算子。

所以我们引进了一种改进的方法:DoG(Difference of Gaussian) 汉文名字:高斯差

1.7 DoG 函数





对应的,我们要创建DoG 金字塔,如上图右侧, 具体操作就是用高斯金字塔相邻两层做减操作生成一个DoG的层,就是上图两个黄片相减 生成一个绿片,

最终就成如下图



2、Key point localization 关键点定位

现在,我们已经得到了DoG 金字塔,就可以进行关键点定位了,关键点定位操作是基于DoG金字塔的。

2.1 关键点有三个属性:尺度、坐标、方向



解释:

1)以x为例, 和周围的26个邻居点作比较,如果它最大或者最小,那么就是关键点

2)一组内的最上和最下层的点,由于缺少比较对象,就忽略了。

2.2 一旦关键点全部被找到之后,进一步处理,去掉一些“长的丑的”的关键点

1)去除对比度的关键点

2)去除边缘响应强的关键点

完成这步之后,图像上关键点如图:



3、Assign Key point Orientation 给关键点分配方向

3.1 选取关键点邻近区域,对该区域内所有像素点求取梯度大小和梯度方向,区域面积大小为关键点所在尺度空间值的3倍大小,即3σ,梯度大小和梯度方向公式如下:



3.2 做统计操作

用36个柱(每个柱大小就是10度)的梯度直方图统计这些像素点。统计的时候 梯度大小要按照高斯分布进行累加,就是说,距离关键点越近的点,贡献值越大。最后得到的直方图就是在某一方向,该区域内所有像素点贡献出的梯度大小之和。

直方图峰值代表了主方向,对于大于峰值80% 的“次峰值”,我们也保留,当做第二主方向,所以说,关键点可能有多个方向, 如右下图。





现在,我们已经得到了关键的三个属性值了,尺度(scale),位置(x,y), 方向(direction),距离成功很近了。





4、build Keypoint descriptor 构建关键点描述子

这一步的想法可以参考第三步。

简单来说,就是选择关键点附近 的区域,然后分割成4*4的小区域。每个小区域的面积大小和确定关键点主方向选的面积大小一样。用8个柱(每个柱45度)来统计每个小区域的梯度信息,这样的话,总共就是4*4*8个柱,用向量表示这128个柱,sift就至此结束。实际情况稍微复杂一些。如下:

4.1 区域面积的选择

考虑到三线性插值和旋转,实际选择区域面积较大。

4.2 旋转区域到主方向,主方向在第三步求出





4.3 统计像素的梯度大小和梯度方向,同样高斯模值用高斯分布加成。



4.4 用一组128维的向量把上右图表示出来。

4.5 接近尾声的时候,再来两个处理。第一,对这个128维的向量进行归一化处理,这样解决了光照的问题。第二,设置门限值,再一次归一化处理,解决非线性关照,相机饱和度变化造成默写方向梯度值过大问题。

至此,sift算法结束,接下来的工作就是如何尽情玩 苦苦生成的128维向量了!

后记:

sift算法不是很难,就是比较琐碎,

这是我用英文写的一个关于sift算法的PPT
http://download.csdn.net/detail/u010807846/9243001
另外网上牛人很多,下面我把当时自己学习用到的连接放到下面,希望对你帮助
http://www.360doc.com/content/14/1013/15/18306241_416576994.shtml#(推荐) http://www.fx114.net/qa-211-83116.aspx(推荐) http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html(推荐) http://blog.csdn.net/zd0303/article/details/8365680 http://www.zhizhihu.com/html/y2010/2146.html http://blog.csdn.net/xiaowei_cqu/article/details/8069548 http://www.fx114.net/qa-73-284482.aspx http://blog.csdn.net/v_JULY_v/article/details/6186942
有问题直接放评论就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: