第十二节尺度不变特征(SIFT)

Posted zyly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二节尺度不变特征(SIFT)相关的知识,希望对你有一定的参考价值。

上一节中,我们介绍了Harris特征用于检测,角点在图像旋转的情况下也可以检测到,但是如果减小(或者增加)图像的大小,可能会丢失图像的某些部分,甚至有可能增加角点的数量。这样的损失现象需要一种与图像比例无关的角点检测方法来解决。尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)可以解决这个问题。我们需要一个函数(或变换)来检测特征(或进行特征变换),并且该函数会对不同的图像尺度(尺度不变特征变换)输出相同的结果。需要注意的是,SIFT并不检测关键点(关键点可以由Different of Gaussians检测),但是SIFT会通过一个特征向量来描述关键点周围区域的情况。

SIFT具有一下特征:

  • 图像的局部特征,对旋转、尺度缩放、亮度变化等保持不变性,对视角变换、仿射变化、噪声也保持一定程度的稳定性;
  • 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配;
  • 多量性,即使是很少几个物体也可以产生大量的SIFT特征;
  • 高速性,经优化的SIFT匹配算法甚至可以达到实时性;
  • 扩展性,可以很方妙的与其他的特征想了进行联合。

一 使用DoG和SIFT进行特征提取和描述

我们先用OpenCV库函数演示一下DoG和SIFT特征提取的效果,然后再来讲述一下SIFT的原理。

我们先来介绍一下Different of Gaussians(DoG),DoG是对同一图象使用不同高斯滤波器所得到的结果。DoG操作的最终结果会得到感兴趣的区域(关键点),这将通过SIFT来进行说明。

我们来看看如何通过SIFT得到充满角点和特征的图像:

‘‘‘
SIFT特征
‘‘‘
import cv2
import numpy as np

img = cv2.imread(./image/cali.bmp)
img = cv2.resize(img,dsize=(600,400))
#转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#创建一个SIFT对象
sift = cv2.xfeatures2d.SIFT_create()
#SIFT对象会使用DoG检测关键点,并且对每个关键点周围的区域计算特征向量。该函数返回关键点的信息和描述符
keypoints,descriptor = sift.detectAndCompute(gray,None)
#在图像上绘制关键点
img = cv2.drawKeypoints(image=img,outImage=img,keypoints = keypoints,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,color=(51,163,236))
#显示图像
cv2.imshow(sift_keypoints,img)
cv2.waitKey(0)
cv2.destroyAllWindows()

技术分享图片

 

二 SIFT算法原理

1、SIFT特征检测的步骤

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

2、尺度空间

 

 

参考文摘:

SIFT特征详解

以上是关于第十二节尺度不变特征(SIFT)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程 300篇241. 尺度不变特征变换(SIFT)

尺度不变特征变换(SIFT)特征提取分析

matlab 尺度不变特征变换sift 图片匹配算法

对于尺度不变的特征提取,SURF 和 SIFT 是不是有任何快速的替代方案?

尺度不变特征变换(Scale-invariant feature transform,SIFT)

SIFT3D(3D尺度不变特征变换)算法