图像特征提取-SIFT

在没有神经网络之前,学者提出了大量的依赖于先验知识的传统特征提取算法。在图像特征领域,SIFT个人认为是具有里程碑意义的一篇论文。我个人的学习习惯是在学习任何领域之前先看一下这个领域的研究综述,然后再啃几篇关键的、里程碑式的论文。图像特征提取算法有很多,比如有SURF、ORB、LBP、HAAR等等。本文重点说明SIFT,有时间会补充其他几个算法。SIFT(Scale-Invariant Feature Transform)自1999年由David Lowe提出以后被广泛的应用于CV的各种领域:图像识别,图像检索,3D重建等等

1. 基本概念

1.1 灰度

  • 图像灰度
    1、识别物体,最关键的因素是梯度(SIFT/HOG),梯度意味着边缘,这是最本质的部分,而计算梯度,自然就用到灰度图像了,可以把灰度理解为图像的强度。
    2、颜色,易受光照影响,难以提供关键信息,故将图像进行灰度化,同时也可以加快特征提取的速度。
  • 如何得到RGB图像的灰度图像
    1.浮点算法:Gray=R0.3+G0.59+B0.11
    2.整数方法:Gray=(R
    30+G59+B11)/100
    3.移位方法:Gray =(R28+G151+B*77)>>8
    4.平均值法:Gray=(R+G+B)/3
    5.仅取绿色:Gray=G
    图像特征提取-SIFT_第1张图片
    lena RGB图像与灰度图像

1.2 图像滤波与卷积

滤波一般指就是一个二维矩阵(卷积核),卷积就是用这个矩阵与原图像进行卷积运算得到一个新的图像。


图像特征提取-SIFT_第2张图片
卷积运算
  • 如下卷积核得到的图像
    [[ 1 1 1]
    [ 1 -8 1]
    [ 1 1 1]]


    图像特征提取-SIFT_第3张图片
    image.png
  • 如下卷积核得到的图像
    [[-1 -1 -1]
    [-1 9 -1]
    [-1 -1 -1]]


    图像特征提取-SIFT_第4张图片
    锐化
  • 高斯核
    [[0.1069973 0.11310982 0.1069973 ]
    [0.11310982 0.11957153 0.11310982]
    [0.1069973 0.11310982 0.1069973 ]]
    选用不同的尺度的高斯核产生如下的效果,尺度越大越模糊


    图像特征提取-SIFT_第5张图片
    高斯核方差递增

1.3 尺度

尺度是一个视觉问题,不是数学问题,简单的来讲就是你在不同距离上观察一个物体,产生的视觉感受是不同的。比如你站在不同距离观察一片雪花,离的越远你感受的形状越接近于a->b->c->d的顺序,就是越远,你看到的越是一个大概的轮廓。


图像特征提取-SIFT_第6张图片
image.png

1.4 SIFT中的尺度空间的概念

  • 高斯卷积核是实现尺度变换的唯一变换核(why?自行理解)
  • 一幅图像的尺度空间被定义为:高斯卷积核与该图像的卷积,它是高斯卷积核中的参数的函数,这里用到“空间”这个词,是因为是可以连续变化的,具体地,图像的尺度空间为


    图像特征提取-SIFT_第7张图片
    尺度空间的定义

2. SIFT特征提取步骤

一幅图像的SIFT特征提取,分为4个步骤:

  • 尺度空间极值检测
  • 关键点位置及尺度确定
  • 关键点方向确定
  • 特征向量生成
    下面分别是这四部分的详细内容

2.1 尺度空间极值检测

SIFT特征点其实就是尺度空间中稳定的点/极值点,那么,为了得到这些稳定点

  • 首先,需要对输入图像建立尺度空间(通过图像高斯金字塔)
  • 然后,需要从建立得到的尺度空间中检测极值点(转换为图像差分高斯金字塔中极值点的检测)
    • 获取差分高斯金字塔
    • DoG中极值点的检测
2.1.1 尺度空间的建立(高斯金字塔的建立)

对于一幅输入图像,为了进行sift特征检测、实现scale-invariant(任何尺度下都能够有对应的特征点),需要对该图像的尺度空间进行分析,即建立高斯金字塔图像、得到不同scale的图像,这里的高斯金字塔与最原始的高斯金字塔稍微有点区别,因为它在构造尺度空间时,将这些不同尺度图像分为了多个Octave、每个Octave又分为了多层。下图给出了Sift中的高斯金字塔的结构图;


图像特征提取-SIFT_第8张图片
高斯金字塔

图像特征提取-SIFT_第9张图片
高斯金字塔说明

图像特征提取-SIFT_第10张图片
image.png
2.1.2 尺度空间中特征点的检测(DoG中极值点的检测)

构造完尺度空间(差分高斯金字塔)后,接下来的任务就是“在尺度中间中检测出图像中的稳定特征点”:

对于DoG中每一个采样点(每一个Octave中每一层),将其与它邻域内所有像素点(8+18=26)进行比较,判断其是否为局部极值点(极大或者极小),更加具体地:如下图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。但要注意:这种相邻层之间的极值点的寻找是在同一Octave中的相邻尺度之间进行寻找的,而不要跨组!


图像特征提取-SIFT_第11张图片
image.png
2.1.3 关键点位置及尺度确定

通过拟和“三维二次函数”可以精确确定关键点的位置和尺度(达到亚像素精度),具体方法还未知,可以得到一系列的SIFT候选特征点集合,但由于这些关键点中有些具有较低的对比对,有些输属于不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),所以,为了增强匹配稳定性、提高抗噪声能力,应该将这2类关键点去除,实现对候选SIFT特征点集合的进一步净化:

  • 剔除对比度低的点
  • 剔除边缘点

2.2 关键点方向确定

  • 计算关键点的方向,需要利用以该关键点为中心的某邻域窗口内所有像素点的梯度分布特性(目的是为了使的sift算子具备旋转不变性),所以,下面首先给出计算尺度空间中每个像素点的梯度模值和方向的方法,按照下面公式计算:


    image.png
    • 其中L所用的尺度为每个关键点各自所在的尺度。


      图像特征提取-SIFT_第12张图片
      image.png
  • 接下来,对于每个关键点(假设尺度为sigma),利用直方图统计其相邻窗口内的像素的梯度分布,从而,确定该关键点的方向,具体方法如下:
    • 分别计算以该关键点为中心的相邻窗口中像素点的梯度方向和模值
    • 为该窗口内每一个像素点赋予一个权值:由每个像素点对应的梯度模值和以关键点为中心尺度为1.5sigma的高斯核决定
    • 设定某种规则,开始统计直方图,例如,这里将方向(0~360°)分为8份,那么,梯度方向直方图将有8个柱,窗口内每个像素到底属于哪个柱由该像素点的梯度方向确定(见下图所示)


      图像特征提取-SIFT_第13张图片
      image.png

      -在该关键点对应的梯度方向直方图中,找到包含像素点最多的那个方向作为该关键点的方向,对于上图而言,方向角(0.25π,0.5π)这个区间内的像素点最多,所以,以(0.25π+0.5π)/2 = 0.375π作为该关键点的方向
      至此,得到了图像中所有关键点的方向!实际上,关键点方向的确定是为了接下来的特征向量生成中的坐标旋转使用的!

2.3 特征向量生成

上面只是得到了每个关键点的方向,接下来,需要确定每个关键点的特征向量,具体方式如下:

  • 将坐标轴旋转到关键点的方向


    图像特征提取-SIFT_第14张图片
    image.png
  • 对于某一个关键点,取其周围8 * 8窗口,如下图绿色区域所示,其中,8*8窗口内每个小矩形框为一个像素,箭头表示该像素位置的梯度方向和模值


    图像特征提取-SIFT_第15张图片
    image.png
  • 在该8 * 8窗口对应的4个(称为4个种子点)44的小块儿上,分别计算该小块儿包含的16个像素点的梯度直方图(8个柱),并进行累加(每个柱对应的所有像素点的梯度模值累加),每个小块儿可以得到8个特征(8个方向对应的模值的累加),从而,4个种子点将得到关键点的48=32个特征,如下图右侧所示,4个种子点,每个种子点产生8个特征
    图像特征提取-SIFT_第16张图片
    image.png
  • 实际中,Lowe建议使用个子块儿(称为16个种子点)进行特征计算,那么,每个关键点将具有16*8=128个特征,如下图所示,此时,需要在特征点周围取的窗口,分割为个子块儿(这样做的目的是为了增强后续匹配的稳健性)。


    图像特征提取-SIFT_第17张图片
    image.png

    至此,关键点特征向量完全确定!此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。


    图像特征提取-SIFT_第18张图片
    image.png

3. SIFT特征的匹配

现有A、B两幅图像,分别利用上面的方法从各幅图像中提取到了k1个sift特征点和k2个特征点及其对应的特征描述子,即k1 * 128维和k2 * 128维的特征,现在需要将两图中各个scale(所有scale)的描述子进行匹配。
接下来采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。

  • 取图像A中的某个关键点,并找出其与图像B中欧式距离最近的前两个关键点
    • 在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。
    • 利用2个近邻点比较的目的是为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,所以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的取值策略能排分错误匹配点。

参考资料

[1] SIFT特征提取及匹配
[2] 图像处理之特征提取

你可能感兴趣的:(图像特征提取-SIFT)