当前位置: 代码迷 >> 综合 >> 【Computer Vision学习】四、常用算法之尺度不变特征变换(Scale-invariant feature transform,SIFT)介绍
  详细解决方案

【Computer Vision学习】四、常用算法之尺度不变特征变换(Scale-invariant feature transform,SIFT)介绍

热度:4   发布时间:2023-12-13 01:47:07.0

Harris角点检测器是旋转不变的,这意味着即使图像旋转了,我们也可以找到相同的角点。很明显,因为角点在旋转的图像中也仍然是转角点。但是缩放呢?如果缩放图像,则角点可能不是角点。例如,检查下面的简单图像。在同一窗口中放大了小图像中的角点时,该角点变成了平坦的。因此,Harris角点检测不是尺度不变的。

在这里插入图片描述

而SIFT就可以实现尺度不变,2004年,英国哥伦比亚大学的D.Lowe在他的论文《Distinctive Image Features from Scale-Invariant Keypoints》中首次提出了该算法,该算法提取关键点(keypoints )并计算其描述符(descriptors)。

一、SIFT算法理论介绍

SIFT是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,corner points)及其有关尺度和方向的描述子得到特征并进行图像特征点匹配,SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。

SIFT算法描述可分为以下几个部分:

STEP #1:构建尺度空间

这是一个初始化操作,尺度空间理论目的是模拟图像数据的多尺度特征。高斯卷积核是实现尺度变换的唯一线性核,于是一副二维图像的尺度空间定义为:
在这里插入图片描述
其中 G(x,y,σ) 是尺度可变高斯函数,(x,y)是空间坐标,σ是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。

为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(Difference of Gaussian scale-space)。利用不同尺度的高斯差分核与图像卷积生成。

在这里插入图片描述
下图所示不同σ下图像尺度空间:

在这里插入图片描述
关于尺度空间的理解说明:2kσ中的2是必须的,尺度空间是连续的。在 Lowe的论文中 ,将第0层的初始尺度定为1.6(最模糊),图片的初始尺度定为0.5(最清晰). 在检测极值点前对原始图像的高斯平滑以致图像丢失高频信息,所以 Lowe 建议在建立尺度空间前首先对原始图像长宽扩展一倍,以保留原始图像信息,增加特征点数量。尺度越大图像越模糊。

图像金字塔的建立:对于一幅图像I,建立其在不同尺度(scale)的图像,也称为子八度(octave),这是为了scale-invariant,也就是在任何尺度都能够有对应的特征点,第一个子八度的scale为原图大小,后面每个octave为上一个octave降采样的结果,即原图的1/4(长宽分别减半),构成下一个子八度(高一层金字塔)。

在这里插入图片描述

尺度空间的所有取值,i为octave的塔数(第几个塔),s为每塔层数【s为最后输出的尺度个数】

由图片size决定建几个塔,每塔几层图像(S一般为3-5层)。0塔的第0层是原始图像(或你double后的图像),往上每一层是对其下一层进行Laplacian变换(高斯卷积,其中σ值渐大,例如可以是σ, kσ, kk*σ…),直观上看来越往上图片越模糊。塔间的图片是降采样关系,例如1塔的第0层可以由0塔的第3层down sample得到,然后进行与0塔类似的高斯卷积操作。

STEP #2:LoG近似DoG找到关键点<检测DOG尺度空间极值点>

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

在这里插入图片描述

同一组中的相邻尺度(由于k的取值关系,肯定是上下层)之间进行寻找

在这里插入图片描述
在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了 3 幅图像,高斯金字塔有每组S+3层图像。DOG金字塔每组有S+2层图像.

STEP #3:除去不好的特征点

这一步本质上要去掉DoG局部曲率非常不对称的像素。

通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力,在这里使用近似Harris Corner检测器。

①、空间尺度函数泰勒展开式如下:

在这里插入图片描述
对上式求导,并令其为0,得到精确的位置, 得:

在这里插入图片描述
②、在已经检测到的特征点中,要去掉低对比度的特征点和不稳定的边缘响应点

去除低对比度的点:把上述第二个公式代入第一个公式中,即在DoG Space的极值点处D(x)取值,只取前两项可得:

在这里插入图片描述
在这里插入图片描述该特征点就保留下来,否则丢弃。

③、边缘响应的去除
一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率通过一个2×2 的Hessian矩阵H求出:

在这里插入图片描述
导数由采样点相邻差估计得到。

D的主曲率和H的特征值成正比,令α为较大特征值,β为较小的特征值,则:

在这里插入图片描述

令α=γβ,则:

在这里插入图片描述
(r + 1)2/r的值在两个特征值相等的时候最小,随着r的增大而增大,因此,为了检测主曲率是否在某域值r下,只需检测:

在这里插入图片描述

if (α+β)/ αβ> (r+1)2/r, throw it out. 在Lowe的文章中,取r=10。

STEP #4、给特征点赋值一个128维方向参数

上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。

在这里插入图片描述
上式分别为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。

至此,图像的关键点已经检测完毕,每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。

梯度直方图的范围是0~360度,其中每10度一个柱,总共36个柱(或者每45度一个柱,总共8个柱)。随着距中心点越远的领域其对直方图的贡献也响应减小,Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。

在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。

在这里插入图片描述
直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向
在这里插入图片描述
由梯度方向直方图确定主梯度方向,该步中将建立所有scale中特征点的描述子(128维)

在这里插入图片描述

关键点描述子的生成步骤:

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

STEP #5、关键点描述子的生成

首先将坐标轴旋转为关键点的方向,以确保旋转不变性。以关键点为中心取8×8的窗口。

在这里插入图片描述

图左部分的中央为当前关键点的位置,每个小格代表关键点邻域所在尺度空间的一个像素,利用公式求得每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,箭头长度代表梯度模值,然后用高斯窗口对其进行加权运算。

图中蓝色的圈代表高斯加权的范围(越靠近关键点的像素梯度方向信息贡献越大)。然后在每4×4的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点,如图右部分示。此图中一个关键点由2×2共4个种子点组成,每个种子点有8个方向向量信息。这种邻域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。

STEP #6、根据SIFT进行Match

生成了A、B两幅图的描述子,(分别是k1128维和k2128维),就将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。

实际计算过程中,为了增强匹配的稳健性,Lowe建议对每个关键点使用4×4共16个种子点来描述,这样对于一个关键点就可以产生128个数据,即最终形成128维的SIFT特征向量。此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。 当两幅图像的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的取值策略能排分错误匹配点。

二、


参考

  • Distinctive Image Features from Scale-Invariant Keypoints
  • 计算机视觉(本科) 北京邮电大学 鲁鹏 清晰完整合集 - 尺度不变区域与SIFT特征
  • SIFT特征提取与检索
  • Python-opencv3 SIFT算法做特征匹配
  • 应用OpenCV和Python进行SIFT算法的实现
  • 机器学习进阶-图像特征sift-SIFT特征点
  • 一代传奇 SIFT 算法 专利到期!
  • Where did SIFT and SURF go in OpenCV 3?
  • python学习之利用opencv实现SIFT特征提取与匹配
  • OpenCV 4.4 发布!SIFT移到主库,新增YOLOv4 和 EfficientDet 推断支持
  • surf和sift算法被申请专利后部分opencv版本无法使用后的安装pycharm+opencv使用surf和sift算法教程
  • Method and apparatus for identifying scale invariant features in an image and use of same for locating an object in an image
  • 局部特征(4)——SIFT和SURF的比较
  相关解决方案