7/20 SIFT算法学习笔记

SIFT简介

SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。该方法于1999年由David Lowe首先发表计算机视觉国际会议(International Conference on Computer Vision,ICCV),2004年再次经David Lowe整理完善后发表于International journal of computer vision(IJCV)。截止2014年8月,该论文单篇被引次数达25000余次。

SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

SIFT特点

1.SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性;
2.SIFT特征在应对视角变化、仿射变换、噪声也具有较好的稳定性;
3.特征描述表达的信息量高,有比较大的区分度,能够在大量的特征数据中有更准确的匹配。
4.sift 提取特征点数目多,不容易产生提取不到特征点的情况
5.sift 速度相对较快,优化后的sift,可以达到实时级的要求。
6.可扩展性高,sift最后提出的是特征向量,可以很方便的与其他形式的特征向量进行联合。

特征检测和特征匹配

区别
特征检测是计算机视觉和图像处理中的一du个概念。它指的zhi是使用计算机提取图像dao信息,决定每个图像的点是否属于一个图像特征。特征检测的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。

特征匹配是指将从影像中提取的特征作为共轭实体,而将所提特征属性或描述参数(实际上是特征的特征,也可以认为是影像的特征)作为匹配实体,通过计算匹配实体之间的相似性测度以实现共轭实体配准的影像匹配方法。这是其他领域的术语,感觉用在计算机视觉领域也有一定的可取之处。

更直观的区别,以百度云服务的人脸检测/对比为例子:
7/20 SIFT算法学习笔记_第1张图片
这是特征检测,根据面部特征,检测出人脸中的眼睛、眉毛、鼻子等的位置并加以标记。
7/20 SIFT算法学习笔记_第2张图片
这是特征匹配,检测不同图片中某一特征的相似度。

SIFT算法具体流程

(建议先读这一节,再度下一节,再度一下这一节,会有豁然开朗的感觉)。

1. 尺度空间极值检测

斑点检测

在计算机视觉中,斑点检测是指在数字图像中找出和周围区域特性不同的区域,这些特性包括光照或颜色等。一般图像中斑点区域的像素特性相似甚至相同,某种程度而言,斑点块中所有点是相似的。
https://www.cnblogs.com/YiXiaoZhou/p/5891645.html

首先我们得先了解一下尺度空间什么?(这个在LOG斑点检测中提到)
尺度空间理论的基本思想是:在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多个不同尺度下的尺度空间表示序列。正如我们在LOG中,使用不同的方差 σ 获得不同的高斯核,我们就可以认为σ就是一个被视为尺度的参数。

构造高斯金字塔

注:
1.降采样(下采样),上采样
https://blog.csdn.net/qq_35290785/article/details/89403422
2.图像金字塔
https://www.cnblogs.com/sddai/p/10330756.html
我们现在对尺度空间的定义有了解了,那我们具体怎么实现尺度空间?这里我们采用高斯金字塔的方式,下面我来详细解释。
7/20 SIFT算法学习笔记_第3张图片
图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层,每个金字塔共n层。金字塔的层数根据图像的原始大小和塔顶图像的大小共同决定。

高斯金字塔在简单降采样的基础上加上了高斯滤波,将图像金字塔每层的一张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave)。简单来说就是例如上图中Octave1 中多张图像的大小是一样的,但是就是经过了不同尺度的高斯滤波。

具体构建高斯金字塔的过程就是:
1.对原始图像做不同尺度的高斯滤波
2.通过降采样得到下一组图像的初始图像,这个初始图像是由上一组的倒数第三张图片降采样得到的。
3。然后再对新得初始图像进行不同尺度的高斯滤波,循环2,3步骤,直至层数满足条件。
这个条件如下:
因为是隔点采样,所以金字塔的组数O满足:
在这里插入图片描述
其中M,N分别是原始图像的大小。
一般我们是使用DoG来代替LoG,而 DoG 金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组需 S+3 层图像,实际计算时 S 通常在3到5之间,那么每组的高斯滤波的尺度满足如下条件:
设位于金字塔底的第1组的第1层图像,其高斯滤波的尺度为
在这里插入图片描述
o为组数,s为每一组的第s层图像。
则位于第1组的其它层图像的高斯滤波尺度分别为
7/20 SIFT算法学习笔记_第4张图片
同理,位于第2组的各层图像的高斯滤波尺度分别为
7/20 SIFT算法学习笔记_第5张图片
其中,k为相邻尺度的缩放因子
在这里插入图片描述
我们可以看出满足下一组初始图像是由本组的倒数第三张图片降采样得到的要求。

构造差分高斯金字塔

在斑点检测我们讨论过高斯算子(LOG)与差分高斯算子(DOG)的关系,这里不再详述。我们可以知道使用差分高斯金字塔代替高斯金字塔进行极值检测,会节省很多的计算时间。
7/20 SIFT算法学习笔记_第6张图片
现在我们构造出了差分高斯金字塔,下一步就是在DoG中寻找极值点,就是特征点的候选点。

空间极值点检测

这一步和在斑点检测学习笔记中LOG在尺度空间寻找极值点基本一样。极值点也是关键点的候选点,关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。
7/20 SIFT算法学习笔记_第7张图片
例如上图中,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

当然这样产生的极值点并不全都是稳定的特征点,因为某些极值点对比度较弱,而且DOG算子会产生较强的边缘响应。所以我们下一步还要对这些极值点进行更精确的过滤。

2. 关键点定位

在关键点定位,我们要通过上一步筛选出的极值点,通过拟合三维空间中的二次函数,来精确确定关键点的位置和尺度,此外我们还要删除对比度较弱的极值点,以及删除边缘响应点。我们一步一步来看

极值点精确定位

首先我们先描述清楚我们为什么要再进行极值点的精确定位?
7/20 SIFT算法学习笔记_第8张图片
如上图,我们的数字图像都是离散采样的,我们检测到的极值点也是经过离散采样,而真实空间都是连续的,所以我们通过拟合一个函数,就可以过得更加精确的连续空间上的极值点。
具体的拟合过程,在此不进行详细的描述,过程就是通过对DOG函数的泰勒展开,过得真正的极值点与当前的极值点的偏移量,来求得真实的极值点。这个过程可以迭代多次进行,获得更精确的解。

删除低对比度极值点

所谓低对比度的点,是那些对噪声敏感的候选点 ,需要剔除。这些点就是那些检测到的极值点与真正的极值点相差较多的极值点。上一步我们获得了检测出的极值点与真正的极值点的差值,当差值大于某个阈值时,则删除这些极值点,因为这些极值点非常的不稳定。

消除边缘响应

由于DoG函数在图像边缘有较强的边缘响应,而边缘上的极值点抗噪性较差,因此我们还需要排除边缘响应。为什么边缘上的点不好呢?一方面图像边缘上的点是很难定位的,具有定位歧义性;另一方面这样的点很容易受到噪声的干扰而变得不稳定。
那么如何消除这些边缘响应呢?
我们知道曲面上每个点(非平点)都有两个主方向,并且沿这两个主方向的法曲率分别是曲面在该点法曲率的最大值和最小值。对于边缘上的点,沿垂直于边缘的方向上,法曲率最大,而沿边缘的方向上,法曲率最小。因此对于分布在边缘上附近的极值点,它们的法曲率最大值和最小值之比,一般情况下要比非边缘点的比值大。
根据这种思想,我们可以设一个比值的阈值,当比值大于这个阈值就认为极值点在边缘上。
而主曲率可以通过2×2的Hessian矩阵求出
在这里插入图片描述

这里Dxx表示DOG金字塔中某一尺度的图像x方向求导两次,微分可以通过计算邻近点的差值来近似计算。在我们之前的斑点检测到是不是用过这个?
又因为DOG的主曲率和H的特征值成正比,我们只需要计算 H 的较大特征值与较小特征值的比例即可。假设两个特征值分别为α(较大值),β(较小值),r = α/β 则有如下:
在这里插入图片描述
那么
在这里插入图片描述
在作者的论文中,r取10,也就是一个点的求得的H,满足下列式子
在这里插入图片描述
则这个极值点保存,否则,则删除。

3. 方向确定

为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。这样就算目标旋转,其他特征都相对与基准方向,并不会因为目标旋转而改变。那么怎么求这个基准方向呢?

我们通过求极值点周围像素点的梯度来为极值点赋予方向,像素点的梯度表示为
在这里插入图片描述
则其梯度幅值为:
在这里插入图片描述
梯度的方向为
在这里插入图片描述
我们求出了像素的梯度了,那么到底要求极值点周围哪些点呢?
我们统计的是以该特征点为圆心,以该特征点所在的高斯图像的尺度 σ 的4.5倍为半径的范围内像素点。
现在我们确定了并求出了周围的像素点的像素值,那么怎么去算主方向呢?
我们使用直方图统计邻域内像素的梯度和方向。梯度直方图将0~360度的方向范围分为36个柱(bins),其中每柱10度。直方图的峰值方向代表了关键点的主方向(这里也是离散的,是不是可以拟合成连续的求成更准确的主方向?大家想一想,代码中是这样做的)。如下图:
7/20 SIFT算法学习笔记_第9张图片
有时候一个特征点的角度可能会有好几个角度与峰值相差是比较少的,这样我们就可以用多个角度来辅助说明特征点的角度。我们把这个角度的差值定义为80%,只要大于最大峰值的80%就定为该特征点的辅助方向。对于辅助方向的处理,我们这样就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点。所以存在多个关键点在同一个位置,但有多个方向。
至此,我们计算出的带有位置、尺度和方向的关键点也就是sift特征点。

4. 关键点描述

现在我们算出来的特征点,都是在固定在图片坐标系中的特征描述。我们需要脱离图片坐标系的固定限制,提取出特征点的局部描述,这样就可以与其他图片的相似的部分去作对比,我们来看看怎么提取局部描述子。

生成局部描述符的思路就是:通过对关键点的周围区域分块,计算块内的梯度直方图,生成具有独特性的向量,这个向量应该是该区域图像信息的一种抽象,并且具有唯一性。
下面我们来看看具体是怎么做的。
首先根据特征点的尺度选择高斯金字塔中的图像,计算特征点邻域范围内各点的梯度方向和梯度的幅值,并根据上文得到的特征点梯度方向更新这些梯度的方向,以此达到描述子的方向不变性。如下图(具体的公式不解释,比较简单):
7/20 SIFT算法学习笔记_第10张图片
我们将关键点的周围区域分成16块,分别计算每个块的梯度直方图如下:
7/20 SIFT算法学习笔记_第11张图片

统计每个4×4块的方向梯度直方图,为了去除光照对描述子的影响,对梯度直方图进行归一化处理。然后将每个直方图槽数据串联即可得到SIFT描述子。作者实验证明,当梯度直方图4×4维的时候,SIFT描述子具有最好的区分度,因此这就诞生了的128(4×4×8)维SIFT特征向量。当然也可以产生其他维数的特征向量。
参考文章
作者:开飞机的乔巴
链接:https://www.jianshu.com/p/a1469eb5d9e7
来源:简书

你可能感兴趣的:(7/20 SIFT算法学习笔记)