sift算法

本文摘自:SIFT算法详解 和 python opencv入门 SIFT算法。做了删减,舍弃了数学推导,力求通俗易懂。

本文目录:

1. SIFT定义

2. SIFT的特点

3. 步骤

3.1. 尺度空间极值检测

3.2. 关键点定位

3.3. 确定关键点方向

3.4. 生成关键点描述符

4. 尺度空间理论

5. 调用python-opencv中的sift包

-----------------------------------------------------------------------------------------------------------------------

1. SIFT定义

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。

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

2. SIFT的特点

SIFT算法的特点有:

  1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
  2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
  3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
  4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
  5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

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

  1. 目标的旋转、缩放、平移(RST)
  2. 图像仿射/投影变换(视点viewpoint)
  3. 光照影响(illumination)
  4. 目标遮挡(occlusion)
  5. 杂物场景(clutter)
  6. 噪声

3. 步骤

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

  1. 尺度空间极值检测:搜索所有尺度上的极值点。通过高斯差分函数来识别潜在的对于尺度和旋转不变的兴趣点。
  2. 关键点定位:在每个候选的位置(即极值点)上,通过一个拟合精细的模型来确定关键点的精确位置。关键点的选择依据于它们的稳定程度。
  3. 关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
  4. 生成关键点描述符:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

3.1. 尺度空间极值检测

Lindeberg在1994年发现高斯差分函数(Difference of Gaussian ,简称DOG算子)与尺度归一化的高斯拉普拉斯函数(Laplacian of Gaussian ,简称LOG算子)非常近似。我对LOG算子的理解是,先对图像做高斯模糊,对模糊的图像做拉普拉斯算子操作(本质上是求梯度)。

所以尺度空间极值检测的方法是,首先构建图像高斯金字塔。然后差分构建高斯差分金字塔,在高斯差分金字塔的每层图像中找极值点(比周围都大的点,或比周围都小的点)。

                                     

3.2. 关键点定位

上一小节检测到的极值点是离散空间的极值点,需通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。下图显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。

3.3. 确定关键点方向

为每个关键点设置方向以后可以获得旋转不变性。
获取关键点所在尺度空间的邻域,然后计算该邻域内的所有像素的梯度和方向,根据计算得到的结果创建方向直方图,直方图的峰值为主方向的参数,其他高于主方向百分之80的方向被判定为辅助方向,这样设定对稳定性有很大帮助。因此,有些关键点会被赋予多个方向,以此保证关键点的旋转不变性。实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且,离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值。

3.4. 生成关键点描述符

经过上面的步骤计算,每个关键点有三个信息,位置、尺度、方向。所以具备平移、缩放、和旋转不变性。接下来对每个关键点用一组向量将这个关键点描述出来,使其不随着光照、视角等等影响而改变。该描述符不但涉及关键点,而且还涉及到关键点周围的像素,使其有更强的不变特性。

基本原理是使用在关键点尺度空间内4*4的窗口中计算的8个方向的梯度信息,共4*4*8=128维向量表征。这总共的128个信息的向量就是关键点描述符的主要内容。此外还要测量,以达到光照、旋转的稳定性。

 

4. 尺度空间理论

尺度空间(scale space)思想最早是由Iijima于1962年提出的,后经witkin和Koenderink等人的推广逐渐得到关注,在计算机视觉邻域使用广泛。

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

尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中,更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。

尺度空间满足视觉不变性。该不变性的视觉解释如下:当我们用眼睛观察物体时,一方面当物体所处背景的光照条件变化时,视网膜感知图像的亮度水平和对比度是不同的,因此要求尺度空间算子对图像的分析不受图像的灰度水平和对比度变化的影响,即满足灰度不变性和对比度不变性。另一方面,相对于某一固定坐标系,当观察者和物体之间的相对位置变化时,视网膜所感知的图像的位置、大小、角度和形状是不同的,因此要求尺度空间算子对图像的分析和图像的位置、大小、角度以及仿射变换无关,即满足平移不变性、尺度不变性、欧几里德不变性以及仿射不变性。
构建尺度空间的目的是为了检测出在不同的尺度下都存在的特征点,如此可以获得缩放不变性。

5. 调用python-opencv中的sift包

代码:

import cv2

img = cv2.imread('lena.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
# kp = sift.detect(gray, None)    # find the keypoint in the images
kp, des = sift.detectAndCompute(gray, None)  # find the keypoint in the images and calculate the descriptors.
img = cv2.drawKeypoints(gray, kp, img)     # draw the small circles on the locations of keypoints.
cv2.imshow('sp',img)
cv2.waitKey(0)

"""
关键点kp的属性:
    pt: 点的x y坐标
    size: 表示特征的直径
    angle: 特征方向
    response: 关键点的强度
    octave: 特征所在金字塔层级
        算法进行迭代的时候, 作为参数的图像尺寸和相邻像素会发生变化
        octave属性表示检测到关键点所在的层级
    ID: 检测到关键点的ID

描述符descriptor是一个二维数组,大小为关键点数目*128
"""

运行结果:

 

原文地址:https://www.cnblogs.com/picassooo/p/13394334.html