SIFT 尺度不变特征变换

https://www.cnblogs.com/wangguchangqing/p/4853263.html

如何知道两张图片包含相同的信息?

下图是第一张图片的某个点映射到第二个图片的具有相同语义的点

1. 建立高斯差分金字塔

左图

  • 同样大小的图片为一组,每一组图片有很多层
  • 第一组图片使用不同尺度(σ\sigma​)的高斯核进行卷积得到的
    • 模拟近大远小,高斯核的作用:近处清晰远处模糊
  • 第二组图片是第一组图片进行降采样得到
  • 其余组以此类推

右图

  • 在同一组内两层图片相减得到Difference of Gaussian(DOG), 高斯差分金字塔

  • 论文中给出的建议值:

    • O=[log2(min(M,N))]3O = [log_2(min(M, N))] - 3

      • O是应该有多少组
      • M, N是原图片的宽和高
    • S=n+3S = n + 3

      • 每组有S层

      • n是希望从多少张图片中提取特征

        比如五张图片差分后得到4张,然后因为要在尺度空间中求极值,所以需要求导,最上和最下的图片无法求导,4 - 2 = 2

σ\sigma 如何确定?

  • 第一组第一层用σ0\sigma_0, 第一组第二层用k×σ0k \times \sigma_0​…
  • 第二组第一层用第一组的倒数第三层, 带入后凑2σ0\sigma_0
  • 0.5 是经验值, 1.6是希望得到的效果,高斯分布的方差和

2. 极值点的精确定位

  • 关键点就是有稳定性质、不会丢失信息的点, 通常是极值点
  • 原来的极值仅在图片的x、y轴,现在和上下左右的26个点作比较
  • 阈值化:如果绝对值小于0.5×T/n0.5\times T / n​很有可能是噪声
  • 检测到的极值点很有可能不是真正的极值点,所以需要进一步找到亚像素级别的真正的极值点

  • 极值点应该在检测到的点附近,在X0X_0附近做泰勒展开

  • 对比度低,很有可能是噪声

  • Hessian矩阵可以描述曲线局部的曲率,希望两个方向的曲率比较接近,否则有可能是边缘

    • Hessian矩阵的曲率和特征值成正比,不算特征值,使用迹和行列式计算

    • Det(H)小于零,曲率异号,不满足条件

    • 我们希望γ<10\gamma < 10, Tr(H)Det(H)<(1+γ2)γ\frac{Tr(H)}{Det(H)}<\frac{(1+\gamma^2)}{\gamma},这个式子单调递增,所以两个条件等价

    实际求导使用有限差分求导法,即相邻点做差近似

3. 为关键点赋予方向

  • 上面已经求出了亚像素的极值,可能落在了两个层之间,选择比较近的层

  • 然后以特征点为圆心,把落在该圆内的所有像素根据梯度方向分成八个方向

  • 高斯滤波平滑,中间权重大,四周权重小

  • 主方向是最后投票结果最大的方向

    如果另外一个方向大于比如说主方向的80%,就可以称为一个辅方向(实际作为两个特征点处理)

特征点提取

  • 圈中心是特征点
  • 圈的大小是特征的大小
  • 圈中的线是主方向

4. 构建关键点描述符

前面描述了找到一张图片关键点的方法。在实际中我们要找到两张图片的关键点并把它们对应起来,通过构建关键点描述符实现。

关键点描述符

  • 描述符是128维的向量
  • 把关键点周围分成很多小的子区域,每个子区域又包含了很多像素
  • 在每个子区域统计八个方向的梯度(每个子区域8个值)总共8 * 16个值,按顺序写出来就得到了关键点描述符的向量
  • 如何划分子区域?
    • 首先把周围旋转到主方向上(我们希望sift具有旋转不变性)
    • m=3, d=4(横竖多少个子区域)