SIFT算法

1. SIFT简介

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。

Lowe将SIFT算法分解为如下四步:

  1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

  2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。在关键点定位步骤中会剔除低对比度的候选点和边缘候选点。

  3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

  4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

2. 高斯模糊基础知识

介绍高斯模糊的原因在于:

高斯卷积核 实现 尺度变换
高斯金字塔 进行 尺度空间表示
高斯差分金字塔 进行 极值点检测

Lindeberg在1994年就发现**高斯差分函数(Difference of Gaussian ,简称DOG算子)与尺度归一化的高斯拉普拉斯函数非常近似**。

本节先对高斯模糊基础知识进行介绍。

SIFT算法是在不同的尺度空间上查找关键点,而尺度空间的获取需要使用高斯模糊来实现。而且Lindeberg等人已证明**高斯卷积核是实现尺度变换的唯一变换核,并且是唯一的线性核**。

通过高斯模糊 --> 获取尺度空间 --> 获取关键点

高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与原图像做卷积运算,达到模糊图像的目的。

N维空间正态分布方程为:
在这里插入图片描述(2-1)
其中,sigma是正态分布的标准差,siggma值越大,图像越模糊。r为模糊半径,模糊半径是指模板元素到模板中心的距离。如二维模板大小为m*n,则模板上的元素(x,y)对应的高斯计算公式为:
在这里插入图片描述(2-2)

在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆,如图2.1所示。
在这里插入图片描述
在实际应用中,在计算高斯函数的离散近似时,在大概3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。

3. 步骤一:尺度空间极值检测

3.1 尺度空间的表示

尺度空间使用高斯金字塔表示。

一个图像的尺度空间L(x,y,sigma),定义为一个变化尺度的高斯函数与原图像的卷积。
在这里插入图片描述(3-1)
其中,*表示卷积运算,
在这里插入图片描述 (3-2)
m,n表示高斯模板的维度(由确定)。(x, y)代表图像的像素位置。是尺度空间因子,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。

3.2 高斯金字塔

前面说过:

尺度空间使用高斯金字塔表示。

下图就是一个高斯金字塔的示例。

在这里插入图片描述
图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。
高斯金字塔的构建步骤:

  1. 对图像做不同尺度的高斯模糊,得到的每张尺度图像称为一层,多张不同尺度图像为一组(Octave);
  2. 对图像做降采样(隔点采样),形成新的一组(Octave)。

3.3 高斯差分金字塔

2002年Mikolajczyk在详细的实验比较中发现尺度归一化的高斯拉普拉斯函数的极大值和极小值同其它的特征提取函数(例如:梯度,Hessian或Harris角特征)比较,能够产生最稳定的图像特征

Lindeberg在1994年就发现**高斯差分函数(Difference of Gaussian ,简称DOG算子)与尺度归一化的高斯拉普拉斯函数非常近似**。

因此,Lowe使用更高效的高斯差分算子代替拉普拉斯算子进行极值检测,如下:

在这里插入图片描述
在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,如图3.3所示,进行极值检测。
在这里插入图片描述

4. 步骤二:关键点定位

4.1 初步定位

为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域尺度域的相邻点大或者小。
如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。
在这里插入图片描述

4.2 关键点精确定位

以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。

离散空间的极值点并不是真正的极值点,图4.1显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。
在这里插入图片描述

  • 子像素插值 & 去除低对比度的关键点
    以下内容引用自博客:SIFT定位算法关键步骤的说明在这里插入图片描述
    上面提到的微分,可以用有限差分法计算,本文附录部分 “有限差分法”进行介绍。

  • 去除不稳定的边缘响应点
    在这里插入图片描述

5. 步骤三:方向确定

对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔?图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:
在这里插入图片描述
计算得到梯度方向后,使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者每45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向(可以只看下图右边部分的示意图)。
在这里插入图片描述

  • 在Lowe的论文还提到了使用高斯函数对直方图进行平滑以增强特征点近的邻域点对关键点方向的作用,并减少突变的影响。
  • 为了得到更精确的方向,通常还可以对离散的梯度直方图进行插值拟合。具体而言,关键点的方向可以由和主峰值最近的三个柱值通过抛物线插值得到。

在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)。Lowe在论文中指出

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

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

算法流程:

  1. 遍历特征点集合points,搜索每个特征点的邻域,半径为rad,生成含有36柱的方向直方图,梯度直方图范围0~360度,其中每10度一个柱。
  2. 利用高斯加权对方向直方图进行两次平滑,增加稳定性(每相邻三个bin采用高斯加权,根据Lowe的建议,模板采用[0.25,0.5,0.25],并连续加权两次。)
  3. 通过峰值比较,求取关键点方向(可能是多个方向);
  4. 通过Taylor展开式对上述峰值进行二次曲线拟合,计算关键点精确方向,即重新计算峰值所在bin的值;
  5. 根据bin的值还原角度,作为特征点的方向。

6. 步骤四:关键点描述

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

特征描述符的生成大致有三个步骤:

  1. 校正旋转主方向,确保旋转不变性。
  2. 生成描述子,最终形成一个128维的特征向量
  3. 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。
为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θ(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向。旋转后邻域内像素的新坐标为:

在这里插入图片描述
旋转后以主方向为中心取 8×8的窗口。下图所示,左图的中央为当前关键点的位置,每个小格代表为关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算。最后在每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,如右图所示。每个特征点由4个种子点组成,每个种子点有8个方向的向量信息(也就是在这个例子里,一个关键点的描述子为4*8=32维向量)。这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。
在这里插入图片描述
与求主方向不同,此时每个种子区域的梯度直方图在0-360之间划分为8个方向区间,每个区间为45度,即每个种子点有8个方向的梯度强度信息

在实际的计算过程中,为了增强匹配的稳健性,Lowe建议

对每个关键点使用 4×4共16个种子点来描述,这样一个关键点就可以产生128维的SIFT特征向量。

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

7. 步骤五: 根据SIFT描述子进行Match

生成了A、B两幅图的描述子,(分别是k1128维和k2128维,k1和k2是两幅图中的关键点个数),就将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。
在这里插入图片描述
当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,Lowe提出了比较最近邻距离与次近邻距离的方法,距离比率ratio小于某个阈值的认为是正确匹配。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。Lowe推荐ratio的阈值为0.8。但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点。(如果这个地方你要改进,最好给出一个匹配率和ration之间的关系图,这样才有说服力)作者建议ratio的取值原则如下:

ratio=0. 4 对于准确度要求高的匹配;
ratio=0. 6 对于匹配点数目要求比较多的匹配;
ratio=0. 5 一般情况下。
也可按如下原则:当最近邻距离<200时ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分错误匹配点。

8. MATLAB 代码

SIFT算法的MATLAB代码可以从David Lowe的个人网站http://www.cs.ubc.ca/~lowe/keypoints找到代码的Version4,download后可以得到有4个m函数,对应注解可以参考博客SIFT matlab源代码解析

附录

附录1:有限差分法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考博客:

  1. SIFT算法详解
  2. SIFT特征提取分析
  3. SIFT定位算法关键步骤的说明
  4. SIFT(5)----关键点方向分配
  5. SIFT matlab源代码解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值