• sift算法研究_无匹配


    1 sift简介    

          David G. Lowe在1999年提出了尺度不变的特征(Scale-Invariant Feature),用来进行物体的识别和图像匹配等,并于2004年进行了更深入的发展和并加以完善。SIFT(Scale-Invariant Feature Transform)算子是一种图像的局部描述子,具有尺度、旋转、平移的不变性,而且对光照变化、仿射变换和3维投影变换具有一定的鲁棒性。在Mikolajczyk对包括SIFT算子在内的十种局部描述子所做的不变性对比实验中,SIFT及其扩展算法已被证实在同类描述子中具有最强的健壮性。

          算法的主要思想是在尺度空间寻找极值点(注意不是平面上的极值点,因此需要过滤掉平面上的极值点),然后对极值点进行过滤,找出稳定的特征点。最后在每个稳定的特征点周围提取图像的局部特性,形成局部描述子并将其用在以后的匹配中。SIFT算法是基于Lindeberg[4]的理论解决了尺度不变性的问题,本文会对尺度空间理论做一些介绍。

    2 尺度空间

          SIFT算法提取的特征点具有尺度不变性,也就是说,同一物体在图片上不论尺度大小,都能根据SIFT算法提取到相同的特征点。这种尺度不变性是根据尺度空间理论得来的。

    2.1 问题提出

          在计算机中,一幅图像通常是用像素矩阵来表示的,每个像素拥有整数类型的灰度级,人理解和解释用这种方式表示的图像是很容易的一件事情。但是,如果每个灰度级用小数来表示,人就不容易理解图像。如今使用的矩阵表示法,图像中所蕴含的信息是隐式的。也就是说,人眼从图像中分辨出的有意义信息是隐式的,由于这些信息没有明确的表示出来,计算机并不能感知。对于计算机来说,一个基本的问题是一副图片中哪些点是相互关联的以及哪些点对应着一片场景中的一个物体。这就是原始分组和知觉组织的问题。从认知学的角度讲,在一幅图像中,即使对一个事物没有概念,或者并不熟悉它,人仍然能够感知此物体的结构。对于人脑来说,即使不知道为什么,也能推测场景中什么是重要的,什么仅是背景而已。

          想要得知图像中哪些是有意义的,必须先要明确这样一个问题:在一幅图像中,只有在一定的尺度范围内,一个物体才有意义。举一个例子,树枝这个概念,只有在几厘米到几米的距离去观察它,才能感知到它的确是树枝;如果在微米级或者千米级去观察,就不能感知到树枝这个概念了,这样的话可以感知到的是细胞或者是森林的概念。

         因而,如果想要描述现实世界的结构,或者将三维物体映射到二维的图像上去,多尺度表示将会至关重要。多尺度表示的概念很容易理解,举例说明,绘制地图时会有比例尺的概念。世界地图中就只能够显示大洲大洋,以及较大的地域和国家;而一个城市地图,甚至可以详细的显示出每条街道。

         这里需要强调一点,事物是实实在在的存在的,但是通过图像这个媒介,观察者可以感知到的概念是不同的。

     2.2 问题的解决

          2.2.1 多尺度表示

         为了使图像中的信息由只有人类可感知的隐式信息,成为计算机可表示的显式信息,可以采用“多尺度表示”(Multi-scale Representation)的图像表示法来解决。在进行图像处理和图像理解时,从图像中提取何种信息,对图像进行何种操作,都是要考虑的基本问题。为了有效的回答这些基本问题,可以对图像分阶段处理,前一阶段处理得到的信息可供后续的处理使用。对于第一阶段的处理,有个基本的约束——处理之前并不知道在图像的场景中到底要提取什么内容;而且,处理所得的特征相对于各种变换(例如光照的变化,图像的尺寸以及视角的变化)要具有鲁棒性。
         多尺度表示事先并不知道到底要使用哪些尺度,所以要计算得出所有的尺度以供后面的步骤使用。一个多尺度表示的示意图如图1 所示。

     

    图1. 一个多尺度表示的示意图。多尺度表示是用一个有序的信号序列来表示原始图像,序列中的每个信号都在不同尺度上[5]。

    多尺度表示的思想是,将原始信号“嵌入”到采用一个单参数变换得到的一系列信号中去,变换得到的每个信号对应于单参数族中的一个参数(例如图1 中t)。一个重要的要求是,多尺度表示中的较粗尺度应该是较细尺度的简化,而且较粗尺度是通过某种固定的方式,由较细尺度图像经过平滑得到。要满足这个性质,可以有多种实现方式。但是一点不变,那就是高斯函数是唯一可用的平滑函数。[c1] 

    实现多尺度表示有多种方式,比如,早期会采用四分树或者八分树,以及图像金字塔。金字塔是结合降采样操作和平滑操作的一种图像表示方式。它的一个很大的好处是,自下而上每一层的像素数都不断减少,这会大大减少计算量;而缺点是自下而上金字塔的量化变得越来越粗糙,而且速度很快。(需要强调的是,这里的金字塔构造方法和小波金字塔的构造方法是类似的,对某一层的图像进行平滑之后,再做降采样,平滑目的是为了降采样后的像素点能更好的代表原图像的像素点,与多尺度表示中的平滑完全不是一个目的)。图2 是金字塔表示法的一个示例

    也就是说多尺度表示时,都会有平滑这一步

    2.2.2尺度空间

    上面提到的四分树或者八分树以及金字塔表示法,在获得多尺度时所采取的步骤是相当粗略的,尺度与尺度之间的“间隔”太大。而这里要提到的“尺度空间”(Scale-Space )表示法是多尺度表示的另外一种有效方法,它的尺度参数是连续的,并且所有尺度上空间采样点个数是相同的(实际上,一个尺度上得到的就是一幅图像,尺度空间采样点也就是该尺度上图像的像素点。也就是说,尺度空间表示法在各个尺度上图像的分辨率都是一样的)。尺度空间表示的主要思想是,由原始信号(例如一幅图像)生成一系列信号,并用这些信号来表示原始信号,这个过程中,精细尺度的信息被逐步的平滑掉(可以认为是细节信息被丢弃)。

    要注意的是,并不是所有的尺度函数都可以用于生成尺度空间。因为一个很重要的问题是,从精细尺度到较粗糙的尺度的变换过程中,信息被逐渐的简化和削弱。也就是说,较粗尺度不可能产生较细尺度中没有的特征。Koenderink[7](1984 )和Lindeberg[8](1994 )已经证明,在一些合理的约束之下,高斯函数是唯一的尺度空间的平滑核函数[7],而且是唯一的线性平滑核函数[8]

    产生尺度空间的公式可以表示如下:

     (1)

    公式(1)表示,以t 作为尺度参数,在整个定义域上用二维高斯核与输入图像做卷积,得到与t 对应的尺度(即在该尺度上的一副图像)。也可以采用与之等价的操作:

    公式(2)采用了物理学中著名的热扩散公式,热扩散公式描述了在均匀介质中,热量是如何向各个方向均匀传导的。注意到(2)式右边是拉普拉斯算子的形式,拉普拉斯算子是各向同性的,这恰好符合热传导的特性。

    3 SIFT方法介绍

      SIFT 特征的优点在前面已经做了说明,下面将对SIFT 方法做详细的介绍。SIFT 算法有以下几个步骤:

      1. 检测尺度空间的极值点。

      2. 抽取稳定的关键点。

      3. 为每个关键点指定一个或者多个方向。

      4. 生成特征点描述子。

     

    3.1 相关工作

           采用特征点进行图像匹配可以追溯到1981 年,Moravec[9] 采用角点检测做立体匹配。1988 年,Harris 和Stephens[10] 改进了Moravec 的检测器,使检测到的特征更加稳定。1992 年,Harris[11] 显示了他的角点检测器在运动跟踪和3 维重构方面的优势,从此之后,角点检测方法被广泛的使用。但是角点检测有两个问题,一是不但可以检测出角点,而且对边缘也十分敏感;二是它不是尺度无关的方法。焦点检测最初的应用多在于运动跟踪和立体匹配方面,后来Zhang 等人[12] 在1995 年实现了图像角点的匹配。他们使用了角点邻域的关联窗来寻找可能的匹配。 19 97 年Schmid 和Mohr[13]做出了开创性的工作,他们采用图像的局部特征进行图像匹配,使得一个特征可以和一个大的图像库中的图像做匹配。他们同样采用Harris 角点,但不同的是,他们开创性的使用了旋转不变的、图像局部区域的描述子。 Harris 角点检测对尺度变化十分敏感,Lowe 在1999 年实现了局部特征的尺度无关性,并且他提出了新的局部描述子,这种描述子更具独特性和鲁棒性。

            最近,有很多工作致力于使局部特征对仿射变换具有不变性:Baumberg, 2000[14]; Tuytelaars and Van Gool, 2000[15]; Mikolajczyk and Schmid, 2002[16]; Schaffalitzky and Zisserman, 2002[17]; Brown and Lowe, 2002[18] 。

     (在开始之前,需要将彩色图像处理成灰度图像),然后进行3.2中所说的内容

    3.2  建立图像尺度空间(或高斯金字塔),并检测极值点

    提取尺度不变的特征点,其主要思想是提取的特征点出现在任何一个尺度上。这样不论图像的尺度如何变化,总能够提取出这种特征点。检测尺度无关的特征点可以通过搜索所有可能的尺度,这可以基于尺度空间理论来解决。

    前面已经提到,在一些合理的假设之下,高斯函数是得到图像尺度空间唯一可用的核函数。将图像I (x, y) 的尺度定义为一个函数L(x, y,σ) ,它由高斯函数G(x, y,σ) 和图像I (x, y) 卷积得到:

    L(x, y,σ) = G(x, y,σ) * I (x, y) ,

    为了在尺度空间中高效的检测稳定关键点的位置,[1][2] 提出在高斯差分函数与图像卷积得到的空间D(x, y,σ) 中寻找极值点,

    D(x, y,σ) = (G(x, y, kσ) -G(x, y,σ) ) * I (x, y) = L(x, y, kσ) -L(x, y,σ) 。(3)

    其中,相邻两个尺度由一个常数k 分开。

    选择这个公式有两个原因。一是这个公式的计算是省时的,因为要描述尺度空间中的特征点,就必须计算输入图像的尺度L,而这里计算D 时,仅需要计算相邻尺度函数的差值。另外一个原因是函数D 的性质与尺度归一化的拉普拉斯高斯函数——即σ22G 很相近[8]。而Mikolajczyk 在实验中表明σ 22G的极大值和极小值能够产生比其他函数(包括梯度,HessianHarris 角点函数)更加稳定的特征。D 和σ22G 的关系可由以下公式说

    该公式是热扩散公式的另一种表示形式,公式左边的项可以用近似的方法计算:

    所以可得:

    从公式可以看出,D 和σ22G 的形式是类似的。由于拉普拉斯函数是尺度无关的,因而高斯差分函数也是尺度无关的。对于所有尺度而言,k 都是一个常数,所以使用D 不会影响极值的选取。当k 趋向于1 的时候,误差会越来越小。但是实验表明,即使k 值不接近1(例如k 取 2 ),对极值的选取也没有多大影响。

    3.2.1计算高斯差分图像

    前面已经论述,为了求尺度无关的特征点,首先需要计算相邻尺度图像的差分,得到一系列图像并在该图像空间中求极值点。采用金字塔可以高效的计算高斯差分图像,如图5 所示:[c1] 

    既进行卷积又要进行降采样形成金字塔

     

     

    金子塔自下而上分为多层,在第一层中,对原始图像不断用高斯函数卷积,得到一系列逐渐平滑的图像。在这一层中,相邻的高斯图像差分得到高斯差分图像。这一组进行完毕后,从中抽取一幅图像A 进行降采样,得到图像B 的面积变为A 的1/4 ,并将B 作为下一层的初始图像,重复第一层的过程。选取A 的原则是,得到A 所用的尺度空间参数σ为初始尺度空间参数的2 倍。设k = 21/ s ,在s 个尺度中寻找极值点,则每层要有s+3 幅图像,生成s+2 幅高斯差分图像。

    经验值分别为3 和1.6* 21/3(*为乘号)。也就是说,k 取21/3

    构造D(x,y,e)的详细步骤:

     1首先采用不同尺度因子的高斯核对图像进行卷积以得到图像的不同尺度空间,将这一组图像作为金子塔图像的第一层。

     2接着对第一层图像中的2倍尺度图像(相对于该层第一幅图像的2倍尺度)以2倍像素距离进行下采样来得到金子塔图像的第二层中的第一幅图像,对该图像采用不同尺度因子的高斯核进行卷积,以获得金字塔图像中第二层的一组图像。

     3再以金字塔图像中第二层中的2倍尺度图像(相对于该层第一幅图像的2倍尺度)以2倍像素距离进行下采样来得到金字塔图像的第三层中的第一幅图像,对该图像采用不同尺度因子的高斯核进行卷积,以获得金字塔图像中第三层的一组图像。这样依次类推,从而获得了金字塔图像的每一层中的一组图像。

    4对上图得到的每一层相邻的高斯图像相减,就得到了高斯差分图像。

    5因为高斯差分函数是归一化的高斯拉普拉斯函数的近似,所以可以从高斯差分金字塔分层结构提取出图像中的极值点作为候选的特征点。对DOG 尺度空间每个点与相邻尺度和相邻位置的点逐个进行比较,得到的局部极值位置即为特征点所处的位置和对应的尺度。

    3.2.2计算极值点

    上一步中已经生成了高斯差分图像,这一步中要计算该空间中的极值点。 为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如下图,图3所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

    有一个问题是到底要在多少个尺度中寻找极值点,即如何确定s 值。实验表明,s 取3 是较好的选择。如果s = 3则需要5 幅高斯差分图像才可以。这里的计算是高效的,因为大多数情况下,只需要几步比较,就可以排除一个像素点,认为它不是极值。

    当然这样产生的极值点并不都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应。

    3.3 抽取稳定的关键点

    上一步已经求出了极值点,现在要对这些极值点进行筛选,去除不稳定的点,以增强特征

    不稳定的点包括低对比度的点和边缘上的点。 点匹配时的稳定性、提高抗噪声能力。同时,由于在金子塔中存在降采样的图像,在这些图像中提取的极值点在原始输入图像中到底在什么位置,也是一个问题。下面将提出上面两个问题的解决方案。

    对于某一个尺度上求取的极值点,采用一个3 维的2 次函数求该极值点在原图像上的位置,并去除低对比度的极值点。首先在某极值点A 对D(x, y,σ) 进行泰勒展开:

    其中,X =(x, y,σ)T 是到点A 的偏移量。对(4)式求X 的偏导数,并令偏导为零,得到

    如果x) 大于0.5 ,也就意味着这个极值点和另一个采样点(图像中的另一个像素)离得更近。采用插值法求得极值点位置的估计值。

    同时,可以利用D(x)) 去除低对比度的点。将公式(5)带入公式(4)得

    通过观察实验结果得出,D(x)) 绝对值小于0.03 的极值点都将被丢弃。为了得到稳定的极值点,还要去除边缘的影响,因为边缘上的极值点抗噪性较差。曲面上每个点(非平点)都有两个主方向,并且沿这两个主方向的法曲率(即两个主曲率)分别是曲面在该点法曲率的最大值和最小值。在边缘上的极值点,垂直于边缘的方向上,法曲率最大,沿边缘的方向上,法曲率最小。如果极值点分布在边缘上,该点的法曲率最大值和最小值之比(即两个主曲率之比),一般情况下要比非边缘点的比值大。根据这种思想,我们可以设一个比值的阈值,当比值大于这个阈值就认为极值点在边缘上。可以采用近似的方法来求主曲率的比值。首先计算待测极值点的海瑟矩阵:

    其中微分可以通过计算邻近点的差值来近似计算。H 的特征值和D 的主曲率对应成比例,这里

    我们只需要计算H 的较大特征值与较小特征值的比例即可。设α是较大的特征值,β是较小的特征值,由矩阵性质知:

    其中用到了矩阵的迹和行列式。通常这里的行列式不会是负值,如果出现负值的情况,即两个主曲率不同号,我们将丢弃这个点,不将其视为极值点。设r=α/ β,我们可得:

    当r≥1,(r +1)2 / r 是r 的单调递增函数,所以要计算主曲率的比值(即r)是否在某阈值之下,只需要判断上式左边的项是否在阈值之下即可。实验表明,阈值通常选择r = 10

    3.4 为关键点指定方向

    SIFT特征的一个关键的特性是旋转不变性,实现旋转不变的基本思想是采用“相对”的概念。为关键点赋一个方向,定义的关键点描述子是相对于这个方向的,因而可以实现匹配时图像的旋转无关性。

    为了实现尺度无关根据关键点所在的尺度选择与该尺度最相近的高斯平滑图像L对于L 上的每个点L(x, y) ,计算梯度和方向

    以关键点为中心,划定一个邻域,利用所有在此区域内的点的梯度形成一个方向直方图。直方图的横坐标是梯度方向,共36 项,每项代表了10 度的范围;纵坐标是梯度大小,对于归到横坐标上任一项内所有的点,将其梯度大小相加,其和作为纵坐标。如图8 所示:

    8. 方向直方图从直方图中选出纵坐标值最大的一项的方向作为该关键点的主方向。如果存在其他方向,纵坐标的大小大于主方向纵坐标大小的80%,也将其作为该关键点的方向。特征点有多个方向的情况下,实际上是在此位置上有多个关键点,他们的方向不同。另外,为了获得更好的稳定性,可以对关键点邻域的梯度大小进行高斯加权。有方法改进了采用直方图指定方向的方式,改用PCA 求关键点的主方向。

     

    3.5 局部描述子

     

    前面已经为关键点赋予了图像位置、尺度以及方向,这一步将根据关键点周围的局部特性计算一个特征描述子。这个描述子还需要对仿射变换、光照变换等具有一定的鲁棒性。如图9 所示,在关键点周围取一个邻域,并对其中点的梯度做高斯加权。这个邻域分为四个子区域,每个子区域取八个方向,生成图8 所示的相同形式的直方图。

    这是SIFT算法的最后一步,现在我们已经得到了拥有尺度不变性和旋转不变性的特征点,接下来要为每个特征点创建一个唯一标识它的“指纹”,SIFT算法作者将它称为SIFT描述子(descriptor)。所生成的SIFT描述子既要能让相同场景中图像的特征点能够正确匹配,而且还要让不同场景中图像的特征点能够正确区分。

    为了得到这样的SIFT描述子,我们将特征点周围16*16的窗口分解为16个4*4的子窗口,图2.12显示了分解的过程。在每个4*4的子窗口中,计算出梯度的大小和方向,并用一个8个bin的直方图来统计子窗口的平均方向,如图2.13所示。

    图2.12将特征点周围16*16的窗口分解为16个4*4的子窗口

     

    图2.13每个子窗口创建一个8bin的直方图

     

    梯度方向在0-44度范围的像素点被放到第一个bin中,45-89度范围的像素点被放到下一个bin中,依此类推。同样加入到bin中的量依赖于该像素点梯度的大小。与之前不同的是,加入的量不仅与像素点的梯度大小相关,而且还依赖离特征点的距离,这样远离特征点的像素点会加入较少的量到直方图中。这通过一个高斯加权函数来实现,这个函数生成一个加权值(像一个二维的钟形曲线),用它乘以16*16的窗口中每个像素点的梯度大小,得到加权后的梯度大小,距离特征点越远,要加入直方图的像素点的梯度大小越小。

    这样每个4*4的子窗口都对应一个8bin的直方图,且直方图中加入的值是像素的用高斯加权后的梯度大小,而特征点周围16*16的窗口中包含16个4*4的子窗口,共有16*8=128个数,然后将这128个数组成的向量进行单位化,单位化后的128维向量就是SIFT的描述子。

    实现细节

    在最后得到SIFT描述子前,我们还要处理两个问题:旋转依赖和亮度依赖。

    由于SIFT描述子中包含梯度方向信息,如果我们旋转图像,那么所有的梯度方向都会改变。为了实现旋转不变性,要使用2.5中计算出的特征点方向,在使用每个4*4子窗口中像素的梯度方向时,要先减去特征点方向。

    由于某些图像亮度变化较大,这可能会导致特征点周围像素的梯度大小变化过大,也就是说在单位化后的SIFT描述子中某些维度的量要远大于其它维度的量。为了减少亮度的依赖,我们将128维SIFT描述子中大于0.2的维度量截取为0.2,并对最后的128为描述子再做一次单位化。

    通过这系列操作,我们最后得到了具有位置稳定、尺度不变性、旋转不变性和较少亮度依赖的SIFT描述子。

    谢谢诸位

  • 相关阅读:
    PyCharm使用(完全图解(最新经典))
    pg存储过程学习
    sql_to_sqlalchemy
    python中嵌入lua解析器
    Python和lua互相调用
    Lupa
    [cb] Unity Editor 添加右键菜单
    [C#] 委托之Action和Func区别
    [反编译U3D]Decompile Unity Resources
    [cb] Assetbundle打包(一)
  • 原文地址:https://www.cnblogs.com/slysky/p/2229530.html
Copyright © 2020-2023  润新知