SIFT feature

转载:http://www.cnblogs.com/wangguchangqing/p/4853263.html

1.SIFT概述

SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

1.1 SIFT算法具的特点

  1. 图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
  2. 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
  3. 多量性,即使是很少几个物体也可以产生大量的SIFT特征
  4. 高速性,经优化的SIFT匹配算法甚至可以达到实时性
  5. 扩招性,可以很方便的与其他的特征向量进行联合。

1.2 SIFT特征检测的步骤

有4个主要步骤

  1. 尺度空间的极值检测 搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和选择不变的兴趣点。
  2. 特征点定位 在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。
  3. 特征方向赋值 基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。
  4. 特征点描述 在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。

2. 尺度空间

在一定的范围内,无论物体是大还是小,人眼都可以分辨出来。然而计算机要有相同的能力却不是那么的容易,在未知的场景中,计算机视觉并不能提供物体的尺度大小,其中的一种方法是把物体不同尺度下的图像都提供给机器,让机器能够对物体在不同的尺度下有一个统一的认知。在建立统一认知的过程中,要考虑的就是在图像在不同的尺度下都存在的特征点。

2.1 多分辨率图像金字塔

在早期图像的多尺度通常使用图像金字塔表示形式。图像金字塔是同一图像在不同的分辨率下得到的一组结果,其生成过程一般包括两个步骤:

  1. 对原始图像进行平滑
  2. 对处理后的图像进行降采样(通常是水平、垂直方向的1/2)
    降采样后得到一系列不断尺寸缩小的图像。显然,一个传统的金字塔中,每一层的图像是其上一层图像长、高的各一半。多分辨率的图像金字塔虽然生成简单,但其本质是降采样,图像的局部特征则难以保持,也就是无法保持特征的尺度不变性。

    2.2 高斯尺度空间

    我们还可以通过图像的模糊程度来模拟人在距离物体由远到近时物体在视网膜上成像过程,距离物体越近其尺寸越大图像也越模糊,这就是高斯尺度空间,使用不同的参数模糊图像(分辨率不变),是尺度空间的另一种表现形式。
    我们知道图像和高斯函数进行卷积运算能够对图像进行模糊,使用不同的“高斯核”可得到不同模糊程度的图像。一副图像其高斯尺度空间可由其和不同的高斯卷积得到:

    L(x,y,σ)=G(x,y,σ)∗I(x,y)

    其中,G(x,y,σ)=12πσ2ex2+y22σ2

Δ2=∂2∂x2+∂2∂y2

使用LoG虽然能较好的检测到图像中的特征点,但是其运算量过大,通常可使用DoG(差分高斯,Difference of Gaussina)来近似计算LoG[Marr and Hidreth]。
D(x,y,σ)=[G(x,y,kσ)−G(x,y,σ)]∗I(x,y)=L(x,y,kσ)−L(x,y,σ)

其中,o=[log2⁡min(m,n)]−a

σ(o,s)=σ0⋅2o+sS

其中σs+1=k⋅σs=21S⋅σs
相邻组之间的尺度关系
σo+1=2σo

2.3 高斯金字塔构建示例

以一个512×512的图像I为例,构建高斯金字塔步骤:(从0开始计数,倒立的金字塔)
  • 金字塔的组数,log2⁡512=9,减去因子3,构建的金字塔的组数为6。取每组的层数为3。
  • 构建第0组,将图像的宽和高都增加一倍,变成I0∗G(x,y,k2σ0)
  • 构建第1组,对I1∗G(x,y,2k2σ0)
  • 构建第o组,第s层 Io∗G(x,y,2oksσ0)

  • 高斯金字塔构建成功后,将每一组相邻的两层相减就可以得到DoG金字塔.

    3. DoG空间极值检测

    为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,改点就是极值点。如图所示,中间的检测点要和其所在图像的

    3.1 尺度变化的连续性

    4. 删除不好的极值点(特征点)

    通过比较检测得到的DoG的局部极值点实在离散的空间搜索得到的,由于离散空间是对连续空间采样得到的结果,因此在离散空间找到的极值点不一定是真正意义上的极值点,因此要设法将不满足条件的点剔除掉。可以通过尺度空间DoG函数进行曲线拟合寻找极值点,这一步的本质是去掉DoG局部曲率非常不对称的点
    要剔除掉的不符合要求的点主要有两种:

    1. 低对比度的特征点
    2. 不稳定的边缘响应点

      4.1 剔除低对比度的特征点

      候选特征点x,其偏移量定义为D(x)应用泰勒展开式

      D(x)=D+∂DT∂xΔx+12ΔxT∂2D∂x2Δx

      由于x是D(x)的极值点,所以对上式求导并令其为0,得到
      Δx=−∂2D−1∂x2∂D(x)∂x

      然后再把求得的D(x^)=D+12∂DT∂xx^
      设对比度的阈值为T,若∣D(x^)∣≥T,则该特征点保留,否则剔除掉。

    4.2 剔除不稳定的边缘响应点

    在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。候选特征点的DoG函数D(x)的主曲率与H的特征值成正比。

    H=[DxxDyxDxyDyy]


    其中,β=λmin为H的最小特征值,则

    Tr(H)=Dxx+Dyy=α+βDet(H)=Dxx+Dyy−Dxy2=α⋅β


    其中,γ=αβ 表示最大特征值和最小特征值的比值,则

    Tr(H)2Det(H)=(α+β)2αβ=(γβ+β)2γβ2=(γ+1)2γ


    上式的结果与两个特征值的比例有关,和具体的大小无关,当两个特征值想等时其值最小,并且随着下,只需检测

    Tr(H)2Det(H)>(Tγ+1)2Tγ


    如果上式成立,则剔除该特征点,否则保留。(Lowe论文中取Tγ=10)

    5. 求取特征点的主方向

    经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度分布特性来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。
    找到了特征点,也就可以得到该特征点的尺度σ,也就可以得到特征点所在的尺度图像

    L(x,y)=G(x,y,σ)∗I(x,y)


    计算以特征点为中心、以θ(x,y)可通过下面公司求得

    m(x,y)=[L(x+1,y)−L(x−1,y)]2+[L(x,y+1)−L(x,y−1)]2
    θ(x,y)=arctan⁡L(x,y+1)−L(x,y−1)L(x+1,y)−L(x−1,y)


    计算得到梯度方向后,就要使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者没45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向。在Lowe的论文还提到了使用高斯函数对直方图进行平滑以增强特征点近的邻域点对关键点方向的作用,并减少突变的影响。为了得到更精确的方向,通常还可以对离散的梯度直方图进行插值拟合。具体而言,关键点的方向可以由和主峰值最近的三个柱值通过抛物线插值得到。在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)。Lowe在论文中指出

    15%的关键点具有多方向,而且这些点对匹配的稳定性很关键。

    得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点。

    6. 生成特征描述

    通过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点。描述子应具有较高的独立性,以保证匹配率
    特征描述符的生成大致有三个步骤:

    1. 校正旋转主方向,确保旋转不变性。
    2. 生成描述子,最终形成一个128维的特征向量
    3. 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。

    为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θ(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向。旋转后邻域内像素的新坐标为:

    [x′y′]=[cos⁡θ−sin⁡θsin⁡θcos⁡θ][xy]

    旋转后以主方向为中心取 在实际的计算过程中,为了增强匹配的稳健性,Lowe建议

    对每个关键点使用

    通过对特征点周围的像素进行分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

    7. 总结

    SIFT特征以其对旋转、尺度缩放、亮度等保持不变性,是一种非常稳定的局部特征,在图像处理和计算机视觉领域有着很重要的作用,其本身也是非常复杂的,下面对其计算过程做一个粗略总结。

    1. DoG尺度空间的极值检测。 首先是构造DoG尺度空间,在SIFT中使用不同参数的高斯模糊来表示不同的尺度空间。而构造尺度空间是为了检测在不同尺度下都存在的特征点,特征点的检测比较常用的方法是DoG(差分高斯)来近似计算LoG,所以在DoG的尺度空间下检测极值点。
    2. 删除不稳定的极值点。主要删除两类:低对比度的极值点以及不稳定的边缘响应点。
    3. ** 确定特征点的主方向**。以特征点的为中心、以3×1.5σ为半径的领域内计算各个像素点的梯度的幅角和幅值,然后使用直方图对梯度的幅角进行统计。直方图的横轴是梯度的方向,纵轴为梯度方向对应梯度幅值的累加值,直方图中最高峰所对应的方向即为特征点的方向。
    4. 生成特征点的描述子。 首先将坐标轴旋转为特征点的方向,以特征点为中心的16×16的窗口的像素的梯度幅值和方向,将窗口内的像素分成16块,每块是其像素内8个方向的直方图统计,共可形成128维的特征向量。

    1.SIFT概述

    SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

    1.1 SIFT算法具的特点

    1. 图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
    2. 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
    3. 多量性,即使是很少几个物体也可以产生大量的SIFT特征
    4. 高速性,经优化的SIFT匹配算法甚至可以达到实时性
    5. 扩招性,可以很方便的与其他的特征向量进行联合。

    1.2 SIFT特征检测的步骤

    有4个主要步骤

    1. 尺度空间的极值检测 搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和选择不变的兴趣点。
    2. 特征点定位 在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。
    3. 特征方向赋值 基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。
    4. 特征点描述 在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。

    2. 尺度空间

    在一定的范围内,无论物体是大还是小,人眼都可以分辨出来。然而计算机要有相同的能力却不是那么的容易,在未知的场景中,计算机视觉并不能提供物体的尺度大小,其中的一种方法是把物体不同尺度下的图像都提供给机器,让机器能够对物体在不同的尺度下有一个统一的认知。在建立统一认知的过程中,要考虑的就是在图像在不同的尺度下都存在的特征点。

    2.1 多分辨率图像金字塔

    在早期图像的多尺度通常使用图像金字塔表示形式。图像金字塔是同一图像在不同的分辨率下得到的一组结果,其生成过程一般包括两个步骤:

    1. 对原始图像进行平滑
    2. 对处理后的图像进行降采样(通常是水平、垂直方向的1/2)
      降采样后得到一系列不断尺寸缩小的图像。显然,一个传统的金字塔中,每一层的图像是其上一层图像长、高的各一半。多分辨率的图像金字塔虽然生成简单,但其本质是降采样,图像的局部特征则难以保持,也就是无法保持特征的尺度不变性。

      2.2 高斯尺度空间

      我们还可以通过图像的模糊程度来模拟人在距离物体由远到近时物体在视网膜上成像过程,距离物体越近其尺寸越大图像也越模糊,这就是高斯尺度空间,使用不同的参数模糊图像(分辨率不变),是尺度空间的另一种表现形式。
      我们知道图像和高斯函数进行卷积运算能够对图像进行模糊,使用不同的“高斯核”可得到不同模糊程度的图像。一副图像其高斯尺度空间可由其和不同的高斯卷积得到:

      L(x,y,σ)=G(x,y,σ)∗I(x,y)

      其中,G(x,y,σ)=12πσ2ex2+y22σ2
      Δ2=∂2∂x2+∂2∂y2
      使用LoG虽然能较好的检测到图像中的特征点,但是其运算量过大,通常可使用DoG(差分高斯,Difference of Gaussina)来近似计算LoG[Marr and Hidreth]。
      D(x,y,σ)=[G(x,y,kσ)−G(x,y,σ)]∗I(x,y)=L(x,y,kσ)−L(x,y,σ)
      其中,o=[log2⁡min(m,n)]−a
      σ(o,s)=σ0⋅2o+sS
      其中σs+1=k⋅σs=21S⋅σs
      相邻组之间的尺度关系
      σo+1=2σo

      2.3 高斯金字塔构建示例

      以一个512×512的图像I为例,构建高斯金字塔步骤:(从0开始计数,倒立的金字塔)
    3. 金字塔的组数,log2⁡512=9,减去因子3,构建的金字塔的组数为6。取每组的层数为3。
    4. 构建第0组,将图像的宽和高都增加一倍,变成I0∗G(x,y,k2σ0)
    5. 构建第1组,对I1∗G(x,y,2k2σ0)
    6. 构建第o组,第s层 Io∗G(x,y,2oksσ0)

    高斯金字塔构建成功后,将每一组相邻的两层相减就可以得到DoG金字塔.

    3. DoG空间极值检测

    为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,改点就是极值点。如图所示,中间的检测点要和其所在图像的

    3.1 尺度变化的连续性

    4. 删除不好的极值点(特征点)

    通过比较检测得到的DoG的局部极值点实在离散的空间搜索得到的,由于离散空间是对连续空间采样得到的结果,因此在离散空间找到的极值点不一定是真正意义上的极值点,因此要设法将不满足条件的点剔除掉。可以通过尺度空间DoG函数进行曲线拟合寻找极值点,这一步的本质是去掉DoG局部曲率非常不对称的点
    要剔除掉的不符合要求的点主要有两种:

    1. 低对比度的特征点
    2. 不稳定的边缘响应点

      4.1 剔除低对比度的特征点

      候选特征点x,其偏移量定义为D(x)应用泰勒展开式

      D(x)=D+∂DT∂xΔx+12ΔxT∂2D∂x2Δx

      由于x是D(x)的极值点,所以对上式求导并令其为0,得到
      Δx=−∂2D−1∂x2∂D(x)∂x

      然后再把求得的D(x^)=D+12∂DT∂xx^
      设对比度的阈值为T,若∣D(x^)∣≥T,则该特征点保留,否则剔除掉。

    4.2 剔除不稳定的边缘响应点

    在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。候选特征点的DoG函数D(x)的主曲率与H的特征值成正比。

    H=[DxxDyxDxyDyy]


    其中,β=λmin为H的最小特征值,则

    Tr(H)=Dxx+Dyy=α+βDet(H)=Dxx+Dyy−Dxy2=α⋅β


    其中,γ=αβ 表示最大特征值和最小特征值的比值,则

    Tr(H)2Det(H)=(α+β)2αβ=(γβ+β)2γβ2=(γ+1)2γ


    上式的结果与两个特征值的比例有关,和具体的大小无关,当两个特征值想等时其值最小,并且随着下,只需检测

    Tr(H)2Det(H)>(Tγ+1)2Tγ


    如果上式成立,则剔除该特征点,否则保留。(Lowe论文中取Tγ=10)

    5. 求取特征点的主方向

    经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度分布特性来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。
    找到了特征点,也就可以得到该特征点的尺度σ,也就可以得到特征点所在的尺度图像

    L(x,y)=G(x,y,σ)∗I(x,y)


    计算以特征点为中心、以θ(x,y)可通过下面公司求得

    m(x,y)=[L(x+1,y)−L(x−1,y)]2+[L(x,y+1)−L(x,y−1)]2
    θ(x,y)=arctan⁡L(x,y+1)−L(x,y−1)L(x+1,y)−L(x−1,y)


    计算得到梯度方向后,就要使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者没45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向。在Lowe的论文还提到了使用高斯函数对直方图进行平滑以增强特征点近的邻域点对关键点方向的作用,并减少突变的影响。为了得到更精确的方向,通常还可以对离散的梯度直方图进行插值拟合。具体而言,关键点的方向可以由和主峰值最近的三个柱值通过抛物线插值得到。在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)。Lowe在论文中指出

    15%的关键点具有多方向,而且这些点对匹配的稳定性很关键。

    得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点。

    6. 生成特征描述

    通过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点。描述子应具有较高的独立性,以保证匹配率
    特征描述符的生成大致有三个步骤:

    1. 校正旋转主方向,确保旋转不变性。
    2. 生成描述子,最终形成一个128维的特征向量
    3. 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。

    为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θ(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向。旋转后邻域内像素的新坐标为:

    [x′y′]=[cos⁡θ−sin⁡θsin⁡θcos⁡θ][xy]

    旋转后以主方向为中心取 在实际的计算过程中,为了增强匹配的稳健性,Lowe建议

    对每个关键点使用

    通过对特征点周围的像素进行分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

    7. 总结

    SIFT特征以其对旋转、尺度缩放、亮度等保持不变性,是一种非常稳定的局部特征,在图像处理和计算机视觉领域有着很重要的作用,其本身也是非常复杂的,下面对其计算过程做一个粗略总结。

    1. DoG尺度空间的极值检测。 首先是构造DoG尺度空间,在SIFT中使用不同参数的高斯模糊来表示不同的尺度空间。而构造尺度空间是为了检测在不同尺度下都存在的特征点,特征点的检测比较常用的方法是DoG(差分高斯)来近似计算LoG,所以在DoG的尺度空间下检测极值点。
    2. 删除不稳定的极值点。主要删除两类:低对比度的极值点以及不稳定的边缘响应点。
    3. ** 确定特征点的主方向**。以特征点的为中心、以3×1.5σ为半径的领域内计算各个像素点的梯度的幅角和幅值,然后使用直方图对梯度的幅角进行统计。直方图的横轴是梯度的方向,纵轴为梯度方向对应梯度幅值的累加值,直方图中最高峰所对应的方向即为特征点的方向。
    4. 生成特征点的描述子。 首先将坐标轴旋转为特征点的方向,以特征点为中心的16×16的窗口的像素的梯度幅值和方向,将窗口内的像素分成16块,每块是其像素内8个方向的直方图统计,共可形成128维的特征向量。

    相关推荐