图像拼接(一)——SIFT算法新手入门级介绍!!!

前言
因为博主毕设和图像拼接有关,所以博主简单地学习了SIFT算法,不知道以后研究生会不会接触图像这块,顺便也为了检验一下自己学的是否透彻,所以在CSDN上写一篇Blog,纪录一下,仅供各位小伙伴参考呦~

一、SIFT算法简介

尺度不变特征变换(Scale Invariant Feature Transform,SIFT)算法,是在1999年由哥伦比亚大学计算机科学系教授David Lowe提出的,并在2004年得到了进一步改善。该算法的主要思想是通过判断特征点描述向量之间的相似程度来完成图像之间的匹配。

SIFT算法是把在图像中检测到的特征点用一个128维的特征向量进行描述,因此一幅图像经过SIFT算法处理后会表示为一个128维特征向量集,该特征向量集具有对图像尺度不变、缩放不变和旋转不变的特性。对于光照、仿射和投影变换也有一定的不变性,是一种非常优秀的局部特征描述算法。

在这里插入图片描述
SIFT算法的基本流程如下:

  1. 尺度空间极值点检测
  2. 极值点精确定位
  3. 关键点方向分配
  4. 生成特征点的描述向量

下面将会依次介绍该流程中的各步骤。

二、尺度空间极值点检测

2.1 构建尺度空间

特征点的检测需要知道特征点的位置和尺度,需要位置的原因显而易见,而需要尺度的原因则是因为真实世界中的物体只有在一定尺度下描述才有意义。我们寻找特征点就是要找到在连续的多尺度空间下位置不发生改变的点,也即稳定的特征点,具有尺度不变性。

2.1.1 什么是尺度空间

或许看的次数多了,我们对“尺度空间”这个词感到不再陌生了,但是如果要你来解释什么是尺度空间,你却说不上来。所以先来介绍一下尺度空间的概念。

尺度空间是一个比较晦涩的概念,但尺度空间在自然空间中又是真是存在的,这里我们先从尺度谈起,在自然界物体都是由大小不同的实体组成,我们描述这些实体比如说房子、桌子一般会说有多高或者有多大,那么这个多高和多大一般所说就是长度和占地面积。在肉眼可见的情况下,我们常用厘米、米这样的标量尺度来描述长度和占地面积。而很少用纳米和微米这样很小的尺度。也就是说尺度是用来衡量一个量的一个标准。即我们可以用厘米来描述一个桌子多高,也可以用纳米来描述(当然生活中是没必要的)。
再举一个地图的例子,有世界地图和北京地图两幅。在世界地图上(大尺度下)我们只能看到每一个国家的分布,但这个国家的具体信息我们在这个尺度上是看不到的。但在北京地图上(小尺度下)我们就能清晰看到每一个街道或者商铺的名称。所以往往大尺度下关注的是物体的全局信息,如物体的轮廓等,小尺度下则更注重物体的细节。

以上,对现实中物体的描述一定要在一个十分重要的前提下进行,即对自然界建模时的尺度。当我们用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。图像的尺度空间表达指的就是图像在所有尺度下的描述。

2.1.2 构建过程

SIFT算法用高斯金字塔来作为图像尺度的表示形式时一般有两个步骤:

1、用低通滤波器进行平滑。
2、对平滑过的图像进行下采样。

在用高斯金字塔来作为尺度变化的描述时,我们要明确一点:这里的低通滤波器只能用高斯滤波。因为高斯核是实现尺度变换的唯一线性核(Lindeberg等人已经证明过)。
所以我们首先要做的就是把处于不同尺度下的图片用高斯金字塔表示出来。

高斯金字塔分两步:高斯模糊、下采样。

定义采用不同尺度空间因子的高斯函数G(x,y,σ)与原图像I(x,y)进行卷积运算得到一组模糊图像为二维图像尺度空间L(x,y,σ),简称为高斯金字塔,如下式所示。 L ( x , y , σ ) = G ( x , y , σ )   ∗ I ( x , y ) L(x,y,\sigma )=G(x,y,\sigma )\ *I(x,y) L(x,y,σ)=G(x,y,σ) I(x,y)高斯核函数的具体公式如下: G ( x , y , σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x,y,\sigma )=\frac{1}{2\pi\sigma ^{2}}e^{-\frac{x^{2}+y^{2}}{2\sigma ^{2}}} G(x,y,σ)=2πσ21e2σ2x2+y2在表达式中,σ 代表的是尺度空间因子,σ>=0 才有意义,当 σ=0 表示对原图像无操作。σ 越大,尺度越大,图像模糊程度也就越高。建立尺度空间的关键操作也是难点之一就在于挑选出最佳的尺度因子σ。下图所示不同σ下图像尺度空间:

在这里插入图片描述
构建高斯金字塔的过程可以表述为通过对原始图像进行降采样处理,由一幅图像形成了一个高斯金字塔结构,即高斯金字塔共有n组,每组m层。第一组图像为原始图像,其他组图像均为原图像通过下采样后得到的新图像。在此基础之上,对金字塔中各组图像分别进行高斯模糊,每一组就会产生S层经过模糊处理的图像,每层图像合并为一组(octave),图像组数与金字塔层数相同。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。
在这里插入图片描述
在这里插入图片描述

2.2 差分高斯金字塔

为了在尺度空间中检测到稳定的极值点,SIFT选择在差分高斯(Difference of Gaussian,DoG)尺度空间D(x,y,σ)中检测极值点而不是直接在高斯金字塔尺度空间L(x,y,σ)中检测。这样也能够保证特征点不会受到噪声的干扰。采用DoG算子检测图像极值点的具体表达式如下: D ( x , y , σ ) = G ( x , y , k σ ) − G ( x , y , σ ) ∗ I ( x , y ) D(x,y,\sigma )={G(x,y,k\sigma )-G(x,y,\sigma )}*I(x,y) D(x,y,σ)=G(x,y,kσ)G(x,y,σ)I(x,y) = L ( x , y , k σ ) − L ( x , y , σ ) =L(x,y,k\sigma )-L(x,y,\sigma ) =L(x,y,kσ)L(x,y,σ)选择高斯差分函数的原因如下:

  1. 计算简单,因为 L ( x , y , σ ) L(x,y,\sigma ) L(x,y,σ)是需要一定计算的,而 D ( x , y , σ ) D(x,y,\sigma ) D(x,y,σ)只需要执行减法。
  2. 高斯拉普拉斯算子LoG(Laplacian of Gaussian),即图像的二阶导数,能够在不同的尺度下检测到图像的点特征,从而检测到图像多尺度变化下的位置不变点,但是LoG的运算效率不高。而DoG是LoG的尺度归一化的近似。DoG和LoG的关系如下述所示:
    在这里插入图片描述

在实际运算过程中,差分高斯尺度空间是由两个相邻的高斯尺度空间两层相减得到的,此时各阶层数相较高斯金字塔会减少1个。如下图所示:
这里写图片描述
这里的几个参数解释如下:

  1. 金字塔的组数:这个高斯金字塔有5组(octave),每个Octave内又包含若干层。所有我们定义第一个参数 O,表示高斯金字塔的组数。
  2. 尺度参数 σ :第一组第一层的尺度参数为 σ ,且Lowe认为最优的 σ=1.6 。且组间尺度关系倍数为2,如第二组的尺度参数是第一组尺度参数的两倍(同一层的两倍)。但组内不同层的尺度参数是不同的。

降采样原理的具体解释可以参考另一篇博客。

2.3 初步检测极值点

极值点的初步检测是在差分高斯金字塔中进行的,Lowe提出每一层极值点都是在三维空间中比较获得的,即这个极值点是同相邻两层和本层周围点共26个点比较得出的。具体搜索过程从每组的第二层开始,以第二层为当前层,对于第二层的DoG图像中的每个像素点,不仅要与和它在相同尺度空间的8邻域像素点做比较,而且还要和相邻两尺度空间中相同位置所对应的3*3邻域的像素点做比较。通过与这26个像素点比较,若被检测点满足最大值或者最小值即为极值点,并记录下该点在空间中的位置和所对应的尺度。注意这里极值点是备选关键点,后面还要进一步处理。第二层搜索完后,再以第三层作为当前层,第二层和第四层分别作为当前层的上下俩层。后面搜索过程类似。具体如下图:
在这里插入图片描述

三、极值点定位

经过极值点的初步检测得到的特征点集中可能还存在一些对噪声比较敏感以及对比度较低、不稳定的点。所以需要对极值点集进行筛选,获取稳定的特征点。极值点的筛选既需要消除对比度较低的点,又需要将边缘响应点去除。具体过程为,首先利用DoG函数的三元二次拟合而找出极值点的位置和尺度,接下来计算相应位置特征点的曲率及DoG值判断出稳定的关键点。

3.1 滤除低对比度点

在尺度空间中,DoG函数在局部特征点 D ( x 0 , y 0 , σ ) D(x_{0},y_{0},\sigma ) D(x0,y0,σ)处的Taylor展开式如下: D ( x , y , σ ) = D ( x 0 , y 0 , σ ) + ∂ D T ∂ x 0 + 1 2 x T ∂ 2 D ∂ x 2 x D(x,y,\sigma )=D(x_{0},y_{0},\sigma )+\frac{\partial D^{T}}{\partial x_{0}}+\frac{1}{2}x^{T}\frac{\partial ^{2}D}{\partial x^{2}}x D(x,y,σ)=D(x0,y0,σ)+x0DT+21xTx22Dx其中, X = ( x , y , σ ) T X=(x,y,\sigma )^{T} X=(x,y,σ)T,对上式求导数,并令其为零,得出的x值就是特征点的精确位置。如下所示。 x m a x = − ( ∂ 2 D ∂ x 0 2 ) − 1 ∂ D ∂ x 0 x_{max}=-(\frac{\partial^{2}D }{\partial x_{0}^{2}})^{-1}\frac{\partial D }{\partial x_{0}} xmax=(x022D)1x0D D ( x m a x ) D(x_{max}) D(xmax)<0.03时,其响应值过小,这样的点易受噪声的干扰而变得不稳定,所以需要将其剔除。

3.2 去除边缘响应点

有些极值点的位置是在图像的边缘上,因为图像的边缘点很难定位,同时也容易受到噪声的干扰,所以这些点是不稳定的极值点,需要去除掉。
由于图像中物体的边缘位置的主曲率一般会比较高,因此可以通过计算主曲率来判断该点是否在物体的边缘位置。极值点处的主曲率可以通过2*2的Hessian矩阵H计算得到:

在这里插入图片描述
假设该矩阵的两个特征值分别为α和β,其中α=γβ,有如下公式: T r ( H ) = D x x + D y y = α + β T_{r}(H)=D_{xx}+D_{yy}=\alpha +\beta Tr(H)=Dxx+Dyy=α+β D e t ( H ) = D x x D y y − ( D x y ) 2 = α β Det(H)=D_{xx}D_{yy}-(D_{xy})^{2}=\alpha \beta Det(H)=DxxDyy(Dxy)2=αβ其中Tr(H)表示矩阵的秩,Det(H)表示矩阵的行列式。因为D的主曲率和H的特征值成正比且为了避免求取具体的特征值,可以通过计算H矩阵的秩Tr(H)和行列式Det(H)的比值,判断极值点是否为边缘伪点。比值如下:

在这里插入图片描述
这里γ越大,则表示该点越有可能在边缘,因此要判断主曲率是否超过一定的阈值γ0,若超过γ0则判定为边缘伪点。此时只需判断下式是否成立即可。
在这里插入图片描述
Lowe在其论文中给出的阈值为10。也就是说,对于主曲率比值大于10的特征点将被删除,否则特征点将被保留。上述运算与求取矩阵H的具体特征值相比,计算量要小的多。

四、为关键点分配方向

精确定位后保留下来的特征点称为关键点。为每个关键点分配方向,从而使描述子能实现图像的旋转不变性,这也是SIFT第三步方向分配的主要目的。可通过特征点邻域内关键点的梯度分布性质来确定特征点的主方向。

4.1 计算梯度幅值和幅角

对于已经检测到的特征点,我们知道该特征点的尺度值 σ ,因此根据这一尺度值,求得最接近这一尺度值的高斯图像:
在这里插入图片描述
该特征点的梯度: L g r a y ( x , y ) = ( ∂ L ∂ x , ∂ L ∂ y ) L_{gray}(x,y)=(\frac{\partial L}{\partial x},\frac{\partial L}{\partial y}) Lgray(x,y)=(xL,yL)计算以特征点为中心,以 3×1.5σ为半径的区域内图像梯度的幅角和幅值(模值),幅值和幅角计算公式如下:
在这里插入图片描述在这里插入图片描述
至此,每个特征点都具备了三个信息 (x,y,σ,θ) :位置、尺度、方向

4.2 加权处理

每个加入梯度直方图的采样点梯度幅值都要进行权重处理,加权采用圆形高斯加权函数,其 σ 值为特征点尺度的1.5倍。

由于SIFT只考虑了尺度和旋转不变性,并没有考虑仿射不变性。通过高斯加权,使特征点附近的梯度幅值有较大的权重,这样可以弥补因没有仿射不变性而产生的特征点不稳定的问题。

4.3 生成方向梯度直方图

在完成特征点邻域的高斯图像的梯度计算后,需要建立直方图统计邻域内各个像素点的梯度方向和幅值。梯度方向直方图的横轴是梯度方向角,纵轴是梯度方向角对应的梯度幅度累加值。

在求得的直方图梯度中,共有三十六个柱,每柱代表一个方向,每个方向为十度,共三百六十度。直方图的峰值反映了关键点相邻像素的主方向,通过对直方图中峰值及其相近左右两方向进行抛物插值拟合,得到相应的最高点,令该最高点为特征点主方向即可。如下图所示,该示例中为了简化给出了8方向的方向直方图计算结果,实际Lowe的原文中采用了36方向的直方图。
在这里插入图片描述

五、特征点描述符生成

经过前面的一系列的操作,我们已经得到了图像中的所有特征点,并且计算了他们的方向。接下来要做的就是特征点描述符的生成了,有了特征点描述符,我们就可以准确的描述特征点,相当于特征点的特征,后面我们进行特征点匹配时用到的信息就是特征点描述符。

关键点通常带有向量属性,所以常会选择合适的向量(描述子)对关键点进行描述,并确保选择的向量不会受到光照、角度等因素的影响。这些向量不仅可以代表关键点,也可代表关键点附近具有价值的像素点,同时向量具有相对独特性,能够提升匹配准确度,并且该向量是以抽象的方式将区域图像信息展示出来,具备唯一性
实现特征描述符具体步骤见如下:

5.1 确定所需计算的图像区域半径

在这里插入图片描述
其中 σ 是关键点所在组的尺度,其中 d=4 。

5.2 旋转坐标轴到关键点主方向

在这里插入图片描述
旋转过后的新坐标如下: ( x ^ y ^ ) = ( c o s θ − s i n θ s i n θ c o s θ ) × ( x y ) \binom{\hat{x}}{\hat{y}}=\begin{pmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{pmatrix}\times \binom{x}{y} (y^x^)=(cosθsinθsinθcosθ)×(yx)

5.3 首先以关键点为中心选取8×8窗口对特征向量进行描述

在这里插入图片描述
上图中,水平轴和竖直轴的交点代表选取的特征点。其周围区域的小方格代表关键点邻域所在层的像素,其上箭头的长度代表梯度模值,箭头方向代表该像素的梯度方向,图中蓝色的圈代表高斯加权的范围。然后将该邻域平均划分成四个相同的子区域,通过梯度直方图得到种子点,每一个种子点共包含8个方向的数据。通过对16个种子点进行描述,最终会生成一个16×8=128维的SIFT特征描述向量。最后,对得到的最终特征向量进行归一化操作,就可以获得SIFT特征描述子。这种邻域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。

此时的SIFT特征点已经具备尺度不变、缩放不变和旋转不变的特性。

六、特征点匹配

当两幅图像的SIFT特征向量生成以后,就可以采用关键点描述子的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离小于预先设置的阈值DistRatio,则接受这一对匹配点。降低阈值DistRatio,SIFT匹配点数目会减少,但更加稳定。Lowe推荐的阈值为0.8。但对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配后,结果表明DistRatio取值在0.4~0.6之间最佳,小于0.4很少有匹配点,大于0.6则存在大量错误匹配点。博主参考网络DistRatio的取值原则如下:

  • DistRatio=0.4 对于准确度要求高的匹配;
  • DistRatio=0.6 对于匹配点数目要求比较多的匹配;
  • DistRatio=0.5 一般情况下。

也可按如下原则:当最近邻距离<200时,DistRatio=0.6,反之DistRatio=0.4。DistRatio的取值策略能排分错误匹配点。

Reference:
1、SIFT创始人David Lowe的论文 http://www.cs.ubc.ca/~lowe/keypoints
我感觉读Lowe的原文可以对SIFT算法理解的更透彻。
2、SIFT——尺度空间、高斯金字塔
3、SIFT——关键点定位
这两篇博客是一个作者写的,内容很清楚,文章最后总结的问题也很有启发性。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早知晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值