SIFT特征详解

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 多分辨率图像金字塔

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

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

    2.2 高斯尺度空间

    咱们还能够经过图像的模糊程度来模拟人在距离物体由远到近时物体在视网膜上成像过程,距离物体越近其尺寸越大图像也越模糊,这就是高斯尺度空间,使用不一样的参数模糊图像(分辨率不变),是尺度空间的另外一种表现形式。
    咱们知道图像和高斯函数进行卷积运算可以对图像进行模糊,使用不一样的“高斯核”可获得不一样模糊程度的图像。一副图像其高斯尺度空间可由其和不一样的高斯卷积获得:
    \[ L(x,y,\sigma) = G(x,y,\sigma) * I(x,y)\]
    其中,\(G(x,y,\sigma)是高斯核函数。\)
    \[ G(x,y,\sigma) = \frac{1}{2 \pi \sigma ^2} e ^ {\frac{x^2 +y^2}{2 \sigma^2}}\]
    \(\sigma\)称为尺度空间因子,它是高斯正态分布的标准差,反映了图像被模糊的程度,其值越大图像越模糊,对应的尺度也就越大。\(L(x,y,\sigma)\)表明着图像的高斯尺度空间。
    构建尺度空间的目的是为了检测出在不一样的尺度下都存在的特征点,而检测特征点较好的算子是\(\Delta^2G\)(高斯拉普拉斯,LoG),
    \[\Delta ^2 = \frac{\partial ^2}{\partial x^2} + \frac{\partial ^2}{\partial y^2}\]
    使用LoG虽然能较好的检测到图像中的特征点,可是其运算量过大,一般可以使用DoG(差分高斯,Difference of Gaussina)来近似计算LoG[Marr and Hidreth]。
    \(k\)为相邻两个高斯尺度空间的比例因子,则DoG的定义:
    \[D(x,y,\sigma) = [G(x,y,k\sigma) - G(x,y,\sigma)] \ast I(x,y) \\ = L(x,y,k\sigma) - L(x,y,\sigma)\]
    其中,\(L(x,y,\sigma)\)是图像的高斯尺度空间。
    从上式能够知道,将相邻的两个高斯空间的图像相减就获得了DoG的响应图像。为了获得DoG图像,先要构建高斯尺度空间,而高斯的尺度空间能够在图像金字塔降采样的基础上加上高斯滤波获得,也就是对图像金字塔的每层图像使用不一样的参数\(\sigma\)进行高斯模糊,使每层金字塔有多张高斯模糊过的图像。降采样时,金字塔上边一组图像的第一张是由其下面一组图像倒数第三张降采样获得。
    易知,高斯金字塔有多组,每组又有多层。一组中的多个层之间的尺度是不同的(也就是使用的高斯参数\(\sigma\)是不一样的),相邻两层之间的尺度相差一个比例因子\(k\)。若是每组有\(S\)层,则\(k = 2 ^{\frac{1}{S}}\)。上一组图像的最底层图像是由下一组中尺度为\(2\sigma\)的图像进行因子为2的降采样获得的(高斯金字塔先从底层创建)。高斯金字塔构建完成后,将相邻的高斯金字塔相减就获得了DoG金字塔。
    高斯金字塔的组数通常是
    \[o = [\log _2min(m,n)] - a\]
    \(o\)表示高斯金字塔的层数,m,n分别是图像的行和列。减去的系数\(a\)能够在\(0-\log_2min(m,n)\)之间的任意值,和具体须要的金字塔的顶层图像的大小有关。
    高斯模糊参数\(\sigma\)(尺度空间),可由下面关系式获得
    \[\sigma(o,s) = \sigma_0 \cdot 2^{\frac{o + s}{S}}\]
    其中\(o\)为所在的组,\(s\)为所在的层,\(\sigma_0\)为初始的尺度,\(S\)为每组的层数。
    在Lowe的算法实现中\(\sigma_0=1.6,o_{min} = -1,S=3\)\(o_{min}=-1\)就是首先将原图像的长和宽各扩展一倍。
    从上面能够得知同一组内相邻层的图像尺度关系
    \[\sigma_{s+1}=k\cdot\sigma_s=2^{\frac{1}{S}}\cdot\sigma_s\]
    相邻组之间的尺度关系
    \[\sigma_{o+1} = 2\sigma_o\]图片

    2.3 高斯金字塔构建示例

    以一个\(512 \times 512\)的图像I为例,构建高斯金字塔步骤:(从0开始计数,倒立的金字塔)
  3. 金字塔的组数,\(\log_2512 = 9\),减去因子3,构建的金字塔的组数为6。取每组的层数为3。
  4. 构建第0组,将图像的宽和高都增长一倍,变成\(1024 \times 1024\)\(I_0\))。第0层\(I_0 \ast G(x,y,\sigma_0)\),第1层\(I_0 \ast G(x,y,k\sigma_0)\),第2层\(I_0 \ast G(x,y,k^2\sigma_0)\)
  5. 构建第1组,对\(I_0\)降采样变成\(512 \times 512\)\(I_1\))。第0层\(I_1 \ast G(x,y,2\sigma_0)\),第1层\(I_1 \ast G(x,y,2k\sigma_0)\)\(I_1 \ast G(x,y,2k^2\sigma_0)\)
  6. \(\vdots\)
  7. 构建第o组,第s层 \(I_o \ast G(x,y,2^ok^s\sigma_0)\)图像处理

高斯金字塔构建成功后,将每一组相邻的两层相减就能够获得DoG金字塔.ast

3. DoG空间极值检测

为了寻找尺度空间的极值点,每一个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的全部相邻点进行比较,当其大于(或者小于)全部相邻点时,改点就是极值点。如图所示,中间的检测点要和其所在图像的\(3 \times 3\)邻域8个像素点,以及其相邻的上下两层的\(3 \times 3\)领域18个像素点,共26个像素点进行比较。
从上面的描述中能够知道,每组图像的第一层和最后一层是没法进行比较取得极值的。为了知足尺度变换的连续性,在每一组图像的顶层继续使用高斯模糊生成3幅图像,高斯金字塔每组有\(S+3\)层图像,DoG金字塔的每组有\(S+2\)组图像。
极值检测form

3.1 尺度变化的连续性

\(S=3\),也就是每组有3层,则\(k = 2 ^ {\frac{1}{S}} = 2 ^ {\frac{1}{3}}\),也就是有高斯金字塔每组有\((S-1)3层图像,DoG金字塔每组有\)(S-2)2层图像。在DoG金字塔的第一组有两层尺度分别是\(\sigma,k\sigma\),第二组有两层的尺度分别是\(2\sigma,2k\sigma\),因为只有两项是没法比较取得极值的(只有左右两边都有值才能有极值)。因为没法比较取得极值,那么咱们就须要继续对每组的图像进行高斯模糊,使得尺度造成\(\sigma,k\sigma,k^2\sigma,k^3\sigma,k^4\sigma\),这样就能够选择中间的三项\(k\sigma,k^2\sigma,k^3\sigma\)。对应的下一组由上一组降采样获得的三项是\(2k\sigma,2k^2\sigma,2k^3\sigma\),其首项\(2k\sigma = 2\cdot2^{\frac{1}{3}}\sigma=2^{\frac{4}{3}}\sigma\),恰好与上一组的最后一项\(k^3\sigma = 2^{\frac{3}{3}}\sigma\)的尺度连续起来。
尺度连续性class

4. 删除很差的极值点(特征点)

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

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

    4.1 剔除低对比度的特征点

    候选特征点x,其偏移量定义为\(\Delta x\),其对比度为\(D(x)\)的绝对值\(\mid D(x) \mid\),对\(D(x)\)应用泰勒展开式
    \[D(x) = D + \frac{\partial D^T}{\partial x}\Delta x+ \frac{1}{2}\Delta x^T\frac{\partial ^2D}{\partial x^2}\Delta x\]
    因为x是D(x)的极值点,因此对上式求导并令其为0,获得
    \[\Delta x = -\frac{\partial^2D^{-1}}{\partial x^2}\frac{\partial D(x)}{\partial x}\]
    而后再把求得的\(\Delta x\)代入到D(x)的泰勒展开式中
    \[D(\hat{x}) = D +\frac{1}{2}\frac{\partial D^T}{\partial x}\hat{x}\]
    设对比度的阈值为T,若\(\mid D(\hat{x})\mid \ge T\),则该特征点保留,不然剔除掉。

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

在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。候选特征点的DoG函数D(x)的主曲率与\(2 \times 2\)Hessian矩阵\(H\)的特征值成正比。
\[ H = \left[ \begin{array}{cc} D_{xx} \quad D_{yx} \\ D_{xy} \quad D_{yy} \end{array} \right]\]
其中,\(D_{xx},D_{xy},D_{yy}\)是候选点邻域对应位置的差分求得的。
为了不求具体的值,可使用\(H\)特征值得比例。设\(\alpha = \lambda_{max}\)为H的最大特征值,\(\beta = \lambda_{min}\)为H的最小特征值,则
\[ Tr(H) = D_{xx} + D_{yy} = \alpha +\beta \\ Det(H) = D_{xx} + D_{yy} - D_{xy}^2 = \alpha \cdot \beta \]
其中,\(Tr(H)\)为矩阵H的迹,\(Det(H)\)为矩阵H的行列式。
\(\gamma = \frac{\alpha}{\beta}\) 表示最大特征值和最小特征值的比值,则
\[ \frac{Tr(H)^2}{Det(H)} = \frac{(\alpha +\beta)^2}{\alpha \beta} = \frac{(\gamma \beta + \beta)^2}{\gamma \beta ^2} = \frac{(\gamma +1)^2}{\gamma} \]
上式的结果与两个特征值的比例有关,和具体的大小无关,当两个特征值想等时其值最小,而且随着\(\gamma\)的增大而增大。所以为了检测主曲率是否在某个阈值\(T_{\gamma}\)下,只需检测
\[\frac{Tr(H)^2}{Det(H)} > \frac{(T_{\gamma} + 1)^2}{T_{\gamma}}\]
若是上式成立,则剔除该特征点,不然保留。(Lowe论文中取\(T_{\gamma} = 10\))

5. 求取特征点的主方向

通过上面的步骤已经找到了在不一样尺度下都存在的特征点,为了实现图像旋转不变性,须要给特征点的方向进行赋值。利用特征点邻域像素的梯度分布特性来肯定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。
找到了特征点,也就能够获得该特征点的尺度\(\sigma\),也就能够获得特征点所在的尺度图像
\[ L(x,y) = G(x,y,\sigma) \ast I(x,y) \]
计算以特征点为中心、以\(3 \times 1.5 \sigma\)为半径的区域图像的幅角和幅值,每一个点L(x,y)的梯度的模\(m(x,y)\)以及方向\(\theta(x,y)\)可经过下面公司求得
\[ m(x,y) = \sqrt{[L(x+1,y) - L(x-1,y)]^2 + [L(x,y + 1) - L(x,y - 1)]^2} \\ \]
\[ \theta(x,y) = \arctan{\frac{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,\sigma,\theta)\),即位置、尺度和方向。由此能够肯定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具备多个方向的关键点能够被复制成多份,而后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,可是方向不一样的特征点。

6. 生成特征描述

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

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

为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转\(\theta\)(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向。旋转后邻域内像素的新坐标为:
\[\left[ \begin{array}{c} x ^ \prime \\ y ^ \prime \end{array} \right] = \left[ \begin{array}{cc} \cos \theta \quad - \sin \theta \\ \sin \theta \quad \cos \theta \end{array} \right] \left[ \begin{array}{c} x \\ y \end{array}\right] \]

旋转后以主方向为中心取 \(8 \times 8\)的窗口。下图所示,左图的中央为当前关键点的位置,每一个小格表明为关键点邻域所在尺度空间的一个像素,求取每一个像素的梯度幅值与梯度方向,箭头方向表明该像素的梯度方向,长度表明梯度幅值,而后利用高斯窗口对其进行加权运算。最后在每一个\(4 \times 4\)的小块上绘制8个方向的梯度直方图,计算每一个梯度方向的累加值,便可造成一个种子点,如右图所示。每一个特征点由4个种子点组成,每一个种子点有8个方向的向量信息。这种邻域方向性信息联合加强了算法的抗噪声能力,同时对于含有定位偏差的特征匹配也提供了比较理性的容错性。
描述子生成
与求主方向不一样,此时每一个种子区域的梯度直方图在0-360之间划分为8个方向区间,每一个区间为45度,即每一个种子点有8个方向的梯度强度信息。
在实际的计算过程当中,为了加强匹配的稳健性,Lowe建议

对每一个关键点使用$ 4 \times 4$共16个种子点来描述,这样一个关键点就能够产生128维的SIFT特征向量。
这里写图片描述

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

7. 总结

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

  1. DoG尺度空间的极值检测。 首先是构造DoG尺度空间,在SIFT中使用不一样参数的高斯模糊来表示不一样的尺度空间。而构造尺度空间是为了检测在不一样尺度下都存在的特征点,特征点的检测比较经常使用的方法是\(\Delta ^2G\)(高斯拉普拉斯LoG),可是LoG的运算量是比较大的,Marr和Hidreth曾指出,可使用DoG(差分高斯)来近似计算LoG,因此在DoG的尺度空间下检测极值点。
  2. 删除不稳定的极值点。主要删除两类:低对比度的极值点以及不稳定的边缘响应点。
  3. ** 肯定特征点的主方向**。以特征点的为中心、以\(3 \times 1.5\sigma\)为半径的领域内计算各个像素点的梯度的幅角和幅值,而后使用直方图对梯度的幅角进行统计。直方图的横轴是梯度的方向,纵轴为梯度方向对应梯度幅值的累加值,直方图中最高峰所对应的方向即为特征点的方向。
  4. 生成特征点的描述子。 首先将坐标轴旋转为特征点的方向,以特征点为中心的\(16 \times 16\)的窗口的像素的梯度幅值和方向,将窗口内的像素分红16块,每块是其像素内8个方向的直方图统计,共可造成128维的特征向量。
相关文章
相关标签/搜索