SIFT算法关键问题解释(学习笔记)

最近一次作业是实现sift算法,整个算法还是比较复杂,绕来绕去的,也是综合论文(英文译文)和几篇博客(博客1博客2博客3)才看懂的,最后实现是主要参考了博客3的代码(亲测可用)。现在记录几个理解算法时可能遇到的一些问题吧,欢迎交流批评指正。(算法整体的讲解直接看博客1&2即可,两个差不多)


1.组(octave)与层(interval)的区分、组数与层数的确定

有的博客里说“组”和“层”的时候会混着说,本身就是翻译的也没有对错,一般“组”对应“octave”、“层”对应“interval”;

组数的确定$$ \log _2\min \left( rows,cols \right) -2 $$

层数的确定:层数S是由“极值点检测需要的层数s”确定的,S=s+3(原因:假设高斯金字塔每组S层,S=6,则得到的高斯差分金字塔每组S-1层,即5层,编号为0、1、2、3、4;根据极值点检测的方法,需要分为012、123、234,即s=3).

2.原始输入图像(the input image)、基准图像(第0组第0层图像)应该如何处理?

自己直接看其他博客的解释时是有些懵的,这里贴下原文:

Of course, if we pre-smooth the image before extrema detection, we are effectively discarding the highest spatial frequencies. Therefore, to make full use of the input, the image can be expanded to create more sample points than were present in the original. We double the size of the input image using linear interpolation prior to building the first level of the pyramid. While the equivalent operation could effectively have been performed by using sets of subpixel-offset filters on the original image, the image doubling leads to a more efficient implementation. We assume that the original image has a blur of at least σ = 0.5 (the minimum needed to prevent significant aliasing), and that therefore the doubled image has σ = 1.0 relative to its new pixel spacing. This means that little additional smoothing is needed prior to creation of the first octave of scale space. The image doubling increases the number of stable keypoints by almost a factor of 4, but no significant further improvements were found with a larger expansion factor.

这里的0.5、1.0不是真的要对图像做blur,而是假设输入的原始图像自身就含有σ=0.5的blur,经过双线性差值(linear interpolation)扩大一倍后,图像的σ=1. 这么做的原因是可以“increases the number of stable keypoints by almost a factor of 4”,那么为什么不继续扩大呢?这样关键点不就更多更稳点了?论文中解释是“no significant further improvements were found with a larger expansion factor”.

3.如何构建高斯金字塔和高斯差分金字塔?

3.1 每一层σ的确定,每一组对应层σ相同

3.2 高斯金字塔不同组之间关系

下一组的第一层都是由上一组的倒数第三层的图像隔点降采样得到的

-------------------在这里再说明一下,不是对算法整个的解释,整个过程的解释可以看开头的那些链接,这里是其他地方的解释有些不清楚或自己在理解时有障碍的一些的记录和解释理解-----------------------------

4.什么是尺度、尺度空间?

感性的认识:直接解释尺度还是有些抽象,上课时有一个解释是这样的,一面墙,当离近看看的时候,一个一个砖的边界是可以看见的,砖的角点是可以作为特征点的;但是离远了看,整个一面墙,每个砖的角点相同,甚至“看不到”了,此时应该把墙的角点作为特征点才比较有意义。

尺度的表示:尺度空间内核是高斯函数,不同的尺度空间,对应就是不同的σ值。

5.如何得到精确的关键点?

这里说一下精确确定关键点的过程(和极值点检测同时进行),对于图像中每一个点

  • 小于阈值1(0.5*0.03/s)的点直接排除,原因:极值点太多,去掉很小,其中0.03是经验值;
  • 判断是否是极值点(判断的方法不在这里赘述,论文第7页的图一目了然)
  • 特征点的精确定位,原因:离散的像素点,得到的极值点一般不等于连续的极值点(如图),因此需要精确定位
  1. 注意,我们是对局部的精确,即在关键点周围进行精确定位
  2. 精确定位本质是针对三维数据(x, y, σ)一种插值方法,论文中有提到,但没推到过程,博客1中的推导过程比较详细
  3. 去除插值结果小于阈值2(0.03,经验值)的点
  4. 最后消除边缘影响(即去除边缘点,通过Hessian 矩阵)

6.特征点的方向分配

接下来几步没有上面那么直观,但认真看下去,其实也很好理解。另外,这部分“特征点的方向分配”和后面的“描述子的生成”部分都是在特征点周围的窗口讨论,但是是完全不一样的,注意区分。

6.1 关键点的梯度直方图

Q1:窗口的大小(即这个圆的大小)如何确定?

A1:$$ radius=3\times 1.5\times \sigma _0\times k^s $$

Q2:如何构建直方图?

A2:论文中10度为一区间,分为360/10=36个方向(即直方图有36个柱子),举例对于其中某一点,计算其幅值和方向,方向落在某一区间内,在这个方向上加上这一点的赋值×权重。遍历窗口内的每一个点即可。

Q3:权重如何确定?

A3:权重大小,与距离特征点的远近有关,为$$ e^{-\frac{x^2+y^2}{2\cdot \sigma ^2}},\ where\ \sigma =1.5\times \sigma _0\times k^s $$,其中x,y是相对于中心(特征点)距离。

6.2 对梯度直方图进行高斯平滑

设第i个方向的幅值为m(i),则m_new(i)=m(i-1)*0.25+m(i)*0.5+m(i+1)*0.25,循环计算。

论文中要求进行两次高斯平滑

6.3 方向分配

得到梯度直方图后就可以为特征点分配方向了。需要注意以下两点:

  • max作为主方向,作为这个特征点的方向
  • ≥主方向的80%的方向,也可以作为特征点,在这个位置上创建新的特征点,只是方向、幅值不同。

举例:假设得到直方图0~35,0是主方向,幅值为10,;1的赋值为9(>8=10*80%),则在这个特征点上再加一个特征点,但是方向、幅值不同。

7.关键点特征描述

基本上就到最后一步啦~

关键点特征描述称为“描述子”或“描述符”(descriptor),是一个4*4*8的向量,为了说明清楚,我们仍然先附上原文:

It allows for significant shift in gradient positions by creating orientation histograms over 4x4 sample regions. The figure shows eight directions for each orientation histogram, with the length of each arrow corresponding to the magnitude of that histogram entry. 

需要注意的是,与上一步“特征点方向分配”区分,两个窗口是不一样的。这里是4*4个样本区域(sample regions),而不是4*4个像素点,与上一步“特征点方向分配”的不同之处:

  • 需要先将坐标轴方向转为特征点方向
  • 这里是8个方向而不是36个方向
  • $$ int\ radius=3\times \sigma _0\times k^s\times \sqrt{2}\times \left( width+1 \right) /2+0.5 $$,其中width为4
  • 构建梯度直方图后,不是采用高斯平滑,而是差值处理,

其中,w为这点的幅值大小,k,m,n=0或1,关于dr、dc、do的解释如下:

接下来就是将直方图转换为4*4*8=128维的特征值向量,再进行归一化便得到了features。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值