[ZZ] sift学习备注

http://blog.csdn.net/txdb/archive/2009/07/15/4350631.aspx

第一次接触sift是在一年前了。当时急于搞毕业论文,觉得sift太难理解。换到神经网络上了。

现在回过头来,发现sift的资料还是一样的稀少,还好有代码,研究sift人倒是多了很多了。。决定再花点时间琢磨看看。参考的代码为sifttutorial(matlab代码)和一个c#代码gkp。

    首先就是要搞清楚尺度空间理论,Tony Lindeberg【1994】 在他的论文中有详细的介绍,我没有耐心看完。所以还是不很懂。其中有句话是这么说的“The main result we will arrive at is that if rather general conditions are posed on the types of computations that are to be performed at the first stages of visual processing, then the Gaussian kernel and its derivatives are singled out as the only possible smoothing kernels”,大致意思就是高斯核和它的导数是唯一可能的构建尺度空间的核函数,这个是结论,原理没怎么看明白。

    很多地方都有核函数的概念,其实就是一个转换运算,原图像和高斯核做卷积得到新的图像。高斯函数就是那个正态分布函数,我们这里使用的是N(0,sigma平方),关于0点对称,sigma的大小决定了分布的发散程度,sigma越大,越发散,(正态分布,具体可以看http://baike.baidu.com/view/45379.htm)。lowe【1999】的论文中指出采用sigma=x^1/2=1.4142,高斯函数是开区间正负无穷范围内的连续函数,当然无法直接做计算。x离散为整数解决了连续问题(sigma太小时候,刻度区间也要减小,见下文),x取值范围设置为【-n,+n】,这个有点主成分分析的味道。取适当的n值使得高斯分布能“approximated sufficient accuracy”,文中sigma=1.4时取n=3,共7个采样点。如何选取n的值文中没说明,知道的告诉个参考文献啊(现在知道这个是3sigma法则,虽然有些代码中取的是3.5sigma)。这里还要提下算法上二维高斯卷积可以通过横竖两个方向的一维高斯卷积分两步来完成。刚才说的7个采样点就是一维的。

   刚刚补充了点高斯函数的知识。

   lowe用一种近似的方法来生成尺度空间,参看lowe【2004】,注意这里k的取值为1.6(lowe【1999】中是1.5好像),这个值是试验值。不过lowe【2004】第7页,有k=2^1/s的公式(这样的话K=sigma=1.4),并且每个尺度的模糊图像数也有s+3来确定。s是什么呢?“we choose to divide each octave of scale space into an integer number,s,of intervals,so k=2^1/s”。大致意思应该是选取间隔的取整值s来分开每个octave。这里的interval应该是图像down-sample的interval,即k=interval=1.6 。每个octave的图像数为s+3,so that final extrema detection covers a complete octave.但是根据low【2004】的说明,s的值是实验的结果,而且取值为3,(见figure 3)不是figure 1中所示的2,至于+3,是因为极值检测覆盖3个level,所以DOG要加上2个level,s+2,而产生DOG则还需要加一个level,所以scale(level)就成了s+3.sigma的值也是实验结果(见figure 4),并且好像presigma和sigma有点不一样。k的值就是所谓的尺度采样频率似乎。
   lowe[1999]中对原始图像先放大一倍再采样,以获得更多的特征点。
   下面讲到尺度采样频率和空间域采样频率,这部分是比较糊涂的。看到这里scale的概念不是很清楚了(是一个octave中的level,octave翻译成倍频程)。   从matlab代码中看original image先做一个sigma=0.5的antialias blur。然后放大一倍。取0.5是因为这个是antialias的最小值,在写代码时sigma取0.5碰到了些问题,用sigma=0.5生成的高斯核做卷积后得到的像素值会大于1。sigma很小时正态分布类似一个脉冲,并且这个脉冲的区间间隔远小于1(论文中离散刻度间隔为1),无法用离散刻度间隔为1的数列近似。用刻度为0.5则可以近似。
   代码中没有考虑这个情况,另外代码中还有一个preblur-sigma为1,对第一幅图像先做antialias blur,放大一倍后,又做一个preblur,好像论文中没有提及,而且sigma=0.5的blur运算应该是有错误的。
  再看下c#的代码
  计算高斯核时,首先注明采用了正态分布的3sigma法则,解释如下:
  // From "Image Processing, Analysis and Machine Vision", pp. 84:
  // 'Pixels more distant from the center of the operator have smaller
  // influence, and pixels farther than 3 * sigma from the center have
  // neglible influence.'
  C#代码中先对原图像方法一倍(可控参数),然后用preprocSigma=1.5做高斯滤波
接下去就是构建尺度空间做极值检测了。

   现在的问题是s是怎么确定的,k和s有必然联系吗,sigma和k或s有联系吗?(这部分已经初步解决了,现在。)
   
   接下去的工作是keypoint的定位问题。去年就是看到这里停住的。

 

原文地址:https://www.cnblogs.com/xfzhang/p/1901508.html