尺度不变特征变换(SIFT)

尺度不变特征变化(SIFT)

SIFT——Scale Invariant Feature Transform

介绍

  • 尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。
  • 局部影像特征的描述与侦测可以帮助辨识物体,SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。
  • 使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配
    尺度不变特征变换(SIFT)
    尺度不变特征变换(SIFT)

应用范围

包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。

原理

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

特征检测步骤

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

代码

import cv2
import numpy as np

inputImgfile = 'bdlibrary.jpg'
outputImgfile = 'bdlibrary_sift.jpg'
outputfeature='bdlibrary_sift.txt'

# feature number
featureSum = 0 
img = cv2.imread(inputImgfile)
cv2.imshow("library",img)

gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) 
detector = cv2.xfeatures2d.SIFT_create() 
# key point
kps , des = detector.detectAndCompute(gray,None) 
# drawing key points 
img=cv2.drawKeypoints(gray,kps,img) 
cv2.imwrite(outputImgfile,img)
# save key point

np.savetxt(outputfeature ,des , fmt='%.2f') 
featureSum += len(kps) 
cv2.imshow('result',img)
 
print('kps:' + str(featureSum))

while 1:
 key = cv2.waitKey(1)
 if key>0:
   break
cv2.destroyAllWindows()

一些小问题

cv2.xfeatures2d.SIFT_creat().detectAndCompute(gray,None)

返回关键点keypoints和描述符descriptors
关键点包含的信息:

  • class-id 默认-1
  • octave 从金字塔哪一层提取得到的
  • pt 关键点坐标
  • response 响应程度,角点程度
  • size 直径大小

cv2提供了在图像中显示keypoints的函数

cv2.drawKeypoints(image,keypoints,outimage,color,flags)

  • image - 原始图像,可以是三通道或者单通道
  • keypoints - 特征点向量
  • outImage - 特征点绘制的画布图像,可以是原图像
  • color - 绘制点的颜色信息,默认随机彩色
  • flages - 特征点的绘制模式(选择特征点的某些信息绘制):
    DEFAULT:
    只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
    DRAW_OVER_OUTIMG:
    函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就 是一个初始化好了的,size与type都是已经初始化好的变量
    NOT_DRAW_SINGLE_POINTS:
    单点的特征点不被绘制
    DRAW_RICH_KEYPOINTS:
    绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size和方向,是最能显示特征的一种绘制方式。

专利问题

cv2.xfeatures2d.SIFT_create() 函数具有专利,需要设置cv2版本为3.3.1

作者:其实是个驴
参考:
https://blog.csdn.net/lingyunxianhe/article/details/79063547
https://blog.csdn.net/ei1990/article/details/78289898