学习笔记 图像特征提取----SIFT算法原理
本文参考唐宇迪opencv项目实战课
zddhub的博客
论文:Scale Invariant Feature Transform(SIFT) 长达56页:)
1 概述
SIFT算法(Scale Invariant Feature Transform)平移不变性图像特征匹配算法。
SIFT算法的特点
- SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性
- 信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配
- 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量
- 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求
- 可扩展性,可以很方便的与其他形式的特征向量进行联合
SIFT算法在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
中SIFT算法的步骤
- 图像的尺度空间
- 多分辨率金字塔
- 高斯差分金字塔
- 关键点精确定位
- 消除边界影响
- 特征点的主方向
- 生成特征描述
2 算法步骤
2.1 图像的尺度空间
在一定的范围内无论物体是大还是小,人眼都能将其分辨出来。SIFT算法目的是是计算机对于物体在不同的尺度下又一个统一的认知。也就是说在对物体的旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
于是就要考虑图像在不同尺度下的特点。
通过高斯滤波实现尺度空间的获取
正态分布的标准差越大,则高斯滤波后的图像越模糊。
二维高斯曲面如图所示:
高斯模板是中心对称的。每个像素的值都是周围相邻像素值的加权平均。
这里高斯模糊并不是直接调用时域下的高斯滤波函数gussian = cv2.GaussianBlur(img, (5, 5), 1)
而是可以更改标准差的值,以改变图像模糊的程度。
from PIL import Image, ImageFont
from PIL import ImageFilter
import cv2
im = Image.open('ggg.jpg')
im = im.filter