SIFT(尺度不变特征变换)算法浅析

SIFT简介

SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种算法,这是一种帮助机器辨别不同图像中的特征点并进行匹配的算法,可以在不同的尺度空间上查找关键点(特征点),就以下面这张图片来说明:

步骤1:建立高斯差分金字塔

图像金字塔是什么:一种以不同尺度,不同分辨率来解释图像的结构,对同一个图像进行不同程度的平滑处理,然后把具有最高级别分辨率的图片放在底层,再接着是尺寸逐渐降低的一系列图像,主要是下采样(最底层分辨率最高且像素点最多)

高斯金字塔是什么:

高斯金字塔是由多组(Octave,译为:八度(音乐领域术语))金字塔组成的,每组金字塔的尺度不同,每组金字塔内还有很多层(Interval),每层的平滑程度不同。

为什么要用高斯金字塔:

高斯金字塔是确定SIFT特征的基础,高斯金字塔模仿的是图像的不同的尺度,尺度可以这样理解:

对于一副图像,你近距离观察,与你在一米之外观察,看到的图像效果是不同的,前者比较清晰,后者比较模糊,前者比较大,后者比较小,通过前者能看到图像的一些细节信息,通过后者可能只能看到图像的一些轮廓的信息,这就是图像的尺度,图像的尺度是自然存在的。

并且:因为高斯核是唯一的线性核,也就是说使用高斯核对图像模糊不会引入其他噪声,因此就选用了高斯核来构建图像的尺度。

高斯金字塔怎么做:

高斯金字塔的组数与原图像分辨率和顶层图像分辨率有关:

n是组数,M,N是图像分辨率MN,t是想要的顶层图像的最小维数的对数值,比如:
对大小为512
512的图像,当塔顶图像为44时,n=9-2=7,当塔顶图像为22时,n=9-1=8。

from https://blog.csdn.net/zddblog/article/details/7521424

一组内的层数与要提取特征点的图片数量有关:s=n+3
这里的n是number,指要提取特征点的图片数量,例如我后面要提取两张图片,所以这里的层数就取5了,这里为什么+3,放在高斯差分金字塔的部分来讲。

步骤:

1.将原图扩大一倍作为金字塔第一组第一层
2. 将第一组第一层图像经过高斯模糊(高斯滤波)生成第一组第二层
3. 之后将高斯模糊滤波器中的参数σ0乘一个比例系数k(k=2^(1/n)),用新的σ1平滑第二层图像得到第三层图像
4. ……
5. 得到第n+1层图像,此时的σn是(k^n)*σ0=2σ0
6. ……
7. 得到第n+3层图像,该组图像滤波完成
8. 对第n+1层图像降采样,得到下一组第一层图片
9. 接下来步骤同上

from https://www.bilibili.com/video/BV1Qb411W7cK?p=1

这样,组与组之间只有分辨率(尺度)不同,层与层之间只有平滑系数不同,可以得到如图所示金字塔:

高斯模糊是什么:

二维正态分布的密度函数叫做高斯函数:


看到函数可能还不算太清楚它的作用,下面这张图可以看得很清楚,高斯函数将中心点的像素值与周围从中心开始的同心圆包围的像素值进行了关联,使得中心点像素值是周围像素值的加权平均。

为什么要进行高斯模糊:

在进行下采样的时候,通常在采样之前对图像进行平滑处理,这样可以保证在采样图像中不会出现虚假的高频信息,而高斯模糊有很好的特性,如没有明显的边界,这样就不会在滤波图像中形成震荡,所以这里在进行下采样形成图像金字塔时要先进行高斯模糊。

高斯模糊怎么做:

首先要给函数参数σ赋值,SIFT算法中给σ赋值为1.6
那么当模糊半径为1时以中心为原点,坐标如下:

将(x,y)带入公式得到下面权值:

计算过程:例如(0,1):将x=0,y=1带入G(x,y)即可:
(1/5.12Π)*e^(-1/5.12)

归一化(令9格的权值和为一):
9格数值之和为:0.43499319088
同除之,得归一化后的权值矩阵:

验证一下,9格数值之和为0.999999999929567804 约为1,这样就得到了高斯模糊的3x3掩膜,用相同方法可以得到4x4等等尺寸的掩膜。一般计算到(6σ+1)*(6σ+1))的掩膜就可以了,即:10.6x10.6

什么是尺度空间:

在图像信息处理中引入一个被视为尺度的参数,通过连续变化尺度参数获得不同尺度下的尺度空间表示序列,对这些序列进行尺度空间内主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。

尺度空间怎么做:

借助高斯金字塔的组和层可以构建一个二维坐标(O,S),这样给点一组(O,S)即可确定尺度空间中的一幅图像,即三维空间(O,S,*image)

什么是高斯差分金字塔(DOG):

构建高斯金字塔就是为了差分金字塔,DOG金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层得到的,之后的以此类推,所有差分图像构成差分金字塔。

高斯差分金字塔怎么做:

DOG金字塔的第O组第S层图像是高斯金字塔的第O组第S+1层减第O组第S层得到的,过程如下图:

from https://www.bilibili.com/video/BV1Qb411W7cK?p=1

DOG金字塔上图像的显示效果如下:

from https://www.cnblogs.com/jiahenhe2/p/7919356.html

这里包含的特征点信息人眼几乎不可见,但是将图像归一化之后,可以很明显的看到差分图像所蕴含的特征,并且有些特征是在不同模糊程度(不同层层)、不同尺度(不同组)下都存在的,这些特征正是SIFT所要提取的“稳定”特征:


from https://www.cnblogs.com/jiahenhe2/p/7919356.html

这时可以来谈一谈为什么一组内的层数应该是S=n+3了,首先高斯差分金字塔内的极值点是在三个方向上的,图像二维空间上的两个以及尺度空间上的一个,每一个像素点要和它所有的相邻点比较,如下图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

这样我们为了在每组中检测n个尺度的极值点,则DOG金字塔每组需n+2层图像,而DOG金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组需n+3层图像,那么为什么要检测n个尺度的极值点呢,以n=3为例,高斯金字塔一组有5层:

可以观察到,其中红色标注数据所代表的层,是差分高斯金字塔中获得极值点的层,也就是说只有在这些层上才发生与上下两层比较获得极值点的操作。

下面将这些红色数据连成一串:

这时发现这些数据是连续的,我们通过在每个组中多构造三层高斯图像,达到了尺度空间连续的效果,每组第一层图像都是从尺度为2σ的上一组的倒数第三张图像降采样得到的,这一效果带来的好处是在尺度空间的极值点确定过程中,我们不会漏掉任何一个尺度上的极值点。


from https://www.bilibili.com/video/BV1Qb411W7cK?p=1

步骤2:极值点的精确定位

前面我们说到,每一个像素点要和它所有的相邻点比较,如下图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

然而在做这一步之前我们先要进行阈值化:

我们找到的极值点的像素值要满足:abs(val)>0.5*T/n

n就是要检测的图片数量,是一个经验系数,一般令T=0.04,这个条件是为了排除一些低对比度的点(对噪声敏感)的影响,这样我们就可以得到一系列稳定的特征点。

但是我们目前取得的特征点是在离散空间中的极值点,这一步骤中极值点的坐标还是离散的整数值,还要精确确定特征点的位置(非整数值)。


利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值法,主要是根据泰勒公式,用值已知的点A估计点A附近的某点B的值。

在图像领域的求导数用的是差分求导法,也就是用作差来代替求导,就是以下的方式

图中的f(x+1)等点与点之间的关系用下面这张图看得更清楚:


from https://www.bilibili.com/video/BV1Qb411W7cK?p=2

借助差分求导法,通过上面的一系列计算求得的Xhead是我们真正的极值点相对检测到的极值点的偏移量,由于把原点看作(0,0),那么求得的Xhead就是极值点(特征点)了,带入f(x)就能求得极值。

那么在实现的时候具体是怎么操作的呢,首先是看Xhead,若Xhead的三个变量任意一个偏移量大于0.5,说明精确极值点更接近于另一个特征点X0,则更换特征点X0,重复上述精确定位流程,直到满足Xhead三个维度<0.5,当这个更换特征点X0的次数超出所设定的迭代次数或者超出图像边界的范围时,这样的特征点应该删除,一般设定迭代次数为5次。

另外,还需要去除一些不稳定的特征点:

去除对比度低的点:

极值点取值的绝对值过小的点易受噪声的干扰而变得不稳定,将迭代出的Xhead带入下式:


如果|f(Xhead)|>0.03,则保留该特征点,否则去除。

去除边缘点:

这些点的特征是:在跨越边缘的方向有较大的主曲率,在与边缘相切的方向主曲率较小

from https://www.bilibili.com/video/BV1Qb411W7cK?p=2

借助2x2Harris矩阵(如上图矩阵)求出主曲率,因D(就是前面的f(x))的主曲率和矩阵H的特征值成正比,令α为较大特征值,β为较小的特征值,则:


矩阵的迹就是α+β,行列式就是α*β,之后,我们通过α/β的值并确定一个阈值来体现那些不好的边缘点,α/β越大,说明这个点越具有边缘效应,就越应该被去掉,所以令α=γβ,则:

以上函数是关于r的增函数,是高中学过的对勾函数,在x>1单增,由于已经假设α是特征值中较大的一个,故r>1,所以单调递增的情况下r 越大,以上函数值就越大,反之,以上函数值越大,r就是越大的,因此我们可以通过已知的Tr(H)和Det(H)去判断r的大小,接下来按照上图所示:

1.如果Det(H)<0,舍去X;

2.如果不满足下式,舍去点X:

到目前为止,我们在高斯差分高斯金字塔中提取的特征点就完成了提纯的步骤,提纯效果如下:
from https://blog.csdn.net/zddblog/article/details/7521424

步骤3:特征点的方向分配

由前一步提取的特征点是在不同尺度空间下提取的,这保证了特征点的尺度不变性。接下来需要解决特征点的旋转不变性,由于关联性,我们不能直接计算特征点的极值方向(梯度),而是应该计算特征点在一定大小邻域内的整体方向概率,即:

对于任一关键点,其梯度的模为:

梯度方向为:

L为关键点所在的尺度空间值

计算以关键点为中心的邻域内所有点的梯度方向,把在0~360°范围内的梯度方向归一化到36个方向内(下图只画了8个方向),每个方向有10°的范围,统计落到每个方向内的关键点个数,以此生成梯度方向直方图。

此处方向直方图的目的是统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。

在实际计算时我们常常给邻域内点赋予高斯分布的权值,即离关键点越近的点对关键点可能的影响越大,反之越远的点造成影响越小,超过3σ的点就不计算其影响,在计算时,按Lowe的建议常把σ设为该特征点尺度的1.5倍,即σ=1.5*σ0。

根据梯度直方图,峰值代表了该特征点处邻域梯度的方向,以直方图中最大值作为该特征点A的主方向。如果某角度的梯度幅值和>=峰值的80%,那么就称为该特征点A的辅方向,实际上仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。在实际编程实现中,就是把该特征点复制成多份特征点,并将方向值分别赋给这些复制后的特征点,这些点的坐标、尺度等参数同特征点A,但是角度不同。

确定了特征点的方向之后,每个特征点有三个信息(x,y,σ,θ):位置、尺度、方向。一般用一个带箭头的圆或直接用箭头表示SIFT区域的三个值,中心表示特征点位置,半径表示关键点尺度,箭头表示主方向和辅方向。具有多个方向的关键点可以复制成多份,然后将方向值分别赋给复制后的关键点。如下图:

from https://blog.csdn.net/xiaowei_cqu/article/details/8096072
至此,sift特征点的方向确定完毕,如下图:

from https://www.bilibili.com/video/BV1Qb411W7cK?p=2

步骤4:生成图像局部描述符

通过上面三个步骤,我们已经得到了任意关键点的三个信息:位置、尺度以及方向 (x,y,σ,θ),接下来是对每一个关键点建立一个描述向量,使其不随各种变化而改变,比如光照变化、视角变化等等。

由于我们的关键点的特征是通过关联其邻域求得的,所以邻域的性质也是关键点性质的一部分,所以这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点。

描述的思路是:对关键点周围像素区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象表述,且具有唯一性。

如下图,对于一个22块,对每块的所有像素点的梯度做高斯加权,每块最终取8个方向,即可以生成228维度的向量,最后以这生成的22*8维向量作为中心关键点的数学描述。

确定采样区域:
特征描述子与关键点所在尺度有关,因此对梯度的求取应在特征点对应的高斯图像上进行。将关键点附近划分成d×d个子区域,每个子区域尺寸为mσ个像元(Lowe建议d=4,m=3,σ为尺特征点的尺度值,综合效果最佳)。考虑到实际计算时需要双线性插值,故计算的图像区域为mσ(d+1),再考虑旋转(将坐标轴旋转为关键点的方向,以确保旋转不变性),则实际计算的图像区域为,如下图所示:

接着将坐标轴旋转为关键点的方向,以确保旋转不变性

旋转后区域内采样点新的坐标为:

将旋转后关键点附近区域划分为4×4个子区域(每个区域间隔为mσ像元),在子区域内计算8个方向(与求主方向不同,每个子区域梯度方向直方图将0°~360°划分为8个方向区间,每个区间为45°)的梯度直方图,Lowe建议子区域的像素的梯度大小按σ=0.5d=0.5x4=2的高斯加权计算加权计算,绘制每个方向梯度方向的累加值,形成一个种子点,这样每个种子点有8个方向区间的梯度强度信息。

由于存在d×d,即4×4个子区域,所以最终共有4×4×8=128个数据,形成著名的128维SIFT特征矢量,这448=128个梯度信息即为该关键点的特征向量,在特征向量形成后,为了去除光照变化的影响,还需要对它们进行归一化处理,对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以不用担心,已经去除,至此,SIFT特征描述向量生成。

https://www.bilibili.com/video/BV1Qb411W7cK?p=4

补充一下

特征点的匹配是通过计算两组特征点的128维的关键点的欧式距离实现的。欧式距离越小,则相似度越高,当欧式距离小于设定的阈值时,可以判定为匹配成功。

欧式距离计算方法:

尺度不变特征转换(Scale-invariant feature transform或SIFT)算法由 David Lowe在1999年所发表,2004年完善总结。

其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。

此算法有其专利,专利拥有者为英属哥伦比亚大学。

SIFT算法具有如下一些特点:
1.SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

  1. 区分性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

  2. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

4.高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

5.可扩展性,可以很方便的与其他形式的特征向量进行联合。

SIFT算法可以解决的问题:
目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:

  1. 目标的旋转、缩放、平移(RST)

  2. 图像仿射/投影变换(视点viewpoint)

  3. 光照影响(illumination)

  4. 目标遮挡(occlusion)

  5. 杂物场景(clutter)

  6. 噪声

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

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

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

  2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

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

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

SIFT的缺点:

  1. 实时性不高。

  2. 有时特征点较少。

  3. 对边缘光滑的目标无法准确提取特征点。

如下图7.1所示,对模糊的图像和边缘平滑的图像,检测出的特征点过少,尤其对圆毫无用武之地:

from https://blog.csdn.net/zddblog/article/details/7521424

参考文章、资料及视频:
https://www.jianshu.com/p/8d2d93c4229b
https://blog.csdn.net/zddblog/article/details/7521424
https://blog.csdn.net/xiaowei_cqu/article/details/8096072
https://www.cnblogs.com/jiahenhe2/p/7919356.html
https://www.cnblogs.com/starfire86/p/5735061.html
https://www.cnblogs.com/AndyJee/p/3734805.html
https://www.bilibili.com/video/BV1Qb411W7cK?p=2
https://baike.baidu.com/item/SIFT/1396275
https://wiki.mbalib.com/wiki/%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB
万分感谢

-End-

更多文章,欢迎关注公众号:凡古一往

SIFT(尺度不变特征变换)算法浅析相关推荐

  1. [转载]SIFT(尺度不变特征变换)算法小结

    原文地址:SIFT(尺度不变特征变换)算法小结[转]作者:慕容天峰 最近一直在看SIFT算法.Sift是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善.S ...

  2. OPENCV学习笔记 - SIFT 尺度不变特征变换 Python

    OPENCV学习笔记 - SIFT 尺度不变特征变换 Python 为什么我们需要SIFT尺度不变特征变换? 第一,建立高斯差分金字塔 第二,极值点的精确定位 第三,确定关键点的主方向 第四,构建关键 ...

  3. 【图像】尺度不变特征变换算法(SIFT)

    SIFT(Scale-Invariant Feature Transform),中文含义就是尺度不变特征变换.自1999年由David Lowe提出以后被广泛的应用于CV的各种领域:图像识别,图像检索 ...

  4. OpenCV系列之SIFT尺度不变特征变换 | 三十九

    目标 在这一章当中, 我们将学习SIFT算法的概念 我们将学习找到SIFT关键点和描述算符. 理论 在前两章中,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了, ...

  5. OpenCV(22)SIFT尺度不变特征变换(纯理论)

    SIFT算法(纯理论) 1.引言 前面介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性.以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使 ...

  6. python-opencv图像处理之SIFT尺度不变特征变换

    在这一章当中,我们将学习SIFT算法的概念,找到SIFT关键点和描述算符. 一.概念 在前面,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了,我们也可以找到相同 ...

  7. OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)

    OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform) 1. 效果图 2. 原理 2.1 步骤 2.2 opencv实现方法 2.3 SIFT ...

  8. 算法 | 尺度不变特征变换匹配算法 Scale Invariant Feature Transform (SIFT)

    /******************************************************/ github:https://github.com/MichaelBeechan CS ...

  9. 数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法

    数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法 一.概述: 提到特征点算法,首先就是大名鼎鼎的SIFT算法了.SIFT的全称是Scale Invariant Feature Transf ...

最新文章

  1. LaTeX Test
  2. 创作共用协议创始人-Lawrence Lessig(2)
  3. static变量初始化
  4. 重庆大学计算机学院就读,唐远炎(计算机学院)老师 - 重庆大学 - 院校大全
  5. redis缓存穿透、缓存雪崩、缓存击穿、并发竞争
  6. 熊吃人该不该杀?这头3米高的大熊吃了7个人,还在洞里藏了很多女人用的东西.........
  7. 测试无服务器应用程序的最佳方法
  8. 使用jQuery写一个简单的轮播图(笔记)
  9. Redhat as 4 中创建 LVM 逻辑卷
  10. jmeter录制 过滤_Jmeter(二)-使用代理录制脚本
  11. TOEFL wordlist 16
  12. stm32f7699遇到的犯二问题
  13. PON串口链接详细步骤说明
  14. Day07(续)Java方法讲解
  15. 代码模块化和可读性的tradeoff
  16. java restful项目打包_GitHub - yangguang010/RestfulAPI: 使用java封装萤石开放平台的接口 HTTPS—SDK。可以直接将api封装成jar包...
  17. Linux 基本操作:使用 lsblk 命令查看磁盘信息
  18. java测试生成中征码(数字)
  19. RE2正则表达式库的Windows移植
  20. 【干货】黑马JavaEE云计算大数据全套视频下载

热门文章

  1. 一年级下册数学计算机应用题,一年级数学下册期中检测试题
  2. php 怎么配置邮件,PHP发邮件的配置_PHP教程
  3. collapse用法
  4. Java Calendar类知识点总结
  5. oracle9i的erp数据库无法正常关闭的解决方法。
  6. SpannableString与SpannableStringBuilder使用
  7. 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
  8. HTML5促使本地应用向Web迁移
  9. 网站安全检测 Web 安全测试工具
  10. linux 网络 PING IP可以通,ping域名ping不通