第十二节尺度不变特征(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)
对于尺度不变的特征提取,SURF 和 SIFT 是不是有任何快速的替代方案?