局部特征SIFT算法描述(附python实例代码)
基于尺度空间不变的特征,是用于图像处理领域的一种描述。可在图像中检测出关键点,是一种 局部特征描述子。
实质
在不同的尺度空间上查找关键点,并计算出关键点的方向。
特点
- 具有良好的不变性
旋转、尺度缩放、平移、亮度变化
对视角变化、仿射变换和噪声也有一定程度的稳定性 - 独特性好,信息量丰富
适用于在海量特征数据库中进行快速、准确的匹配 - 多量性
即使少数物体也可以产生大量SIFT特征 - 计算快
经优化的SIFT匹配算法甚至可以达到实时性
尺度空间
使用不同o 的LOG对图片进行滤波
使用LOG,则后续计算量较大,故使用DOG来代替LOG,用差分代替微分。
高斯金字塔
高斯金字塔就是在传统金字塔的基础上,图像的金字塔模型是指将原始图像不断降阶采样,对每一层用不同的参数σ做高斯模糊,使得每一层金字塔有多张高斯模糊图像,这样一组图像是一个octave。
高斯金字塔的构建分为两步:
(1)对图像做高斯平滑;
(2)对图像做降采样。
octave(i+1)的第一张(从下往上数)图像是由octave(i)中的倒数第三张图像降采样得到
SIFT特征计算步骤
- 在DoG尺度空间中获取极值点,即关键点
LoG尺度空间和DoG尺度空间 - 对关键点处理
位置插值(获得精确的关键点)
去除边缘点 - 关键点的方向估计
- 关键点描述子的生成
区域坐标旋转
计算采样区域的直方图
SIFT——计算高斯差分(DoG)空间
DoG函数
DoG高斯差分金字塔
DoG局部极值检测
判断极值点:以X为检测点,其周围的点,除了同层所包围的8个点外,还有上一层的9个点与下一层的9个点(考虑26个点)
SIFT——特征点(又叫关键点)方向估计
本算法采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点确定关键点方向。
- 在尺度上计算梯度直方图
8方向――以特征点为中心、以3×为半径 - 直方图的峰值方向代表了关键点的主方向,方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。
- 为了匹配的稳定性,将超过最高值80%的方向,称为辅方向。
为了保证特征矢量具有旋转不变性,需要以特征点为中心,将特征点附近邻域内的图像旋转一个方向角0。即将原图像x轴转到与主方向相同的方向。
SIFT——计算特征点描述子
对于每一个关键点,都拥有位置、尺度以及方向三个信息。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。
在旋转后的坐标上采样16x16的像素窗
完整代码如下
import numpy as np
import cv2 as cv
img = cv.imread('H:/pictures/')
gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)
img=cv.drawKeypoints(gray,kp,img)
cv.imshow("SIFT", img)
cv.imwrite('',img)
cv.waitKey(0)
cv.destroyAllWindows()
THE END