SIFT概述
- SIFT的全称是 Scale Invariant Feature Transform(尺度不变特征变换),是由加拿大教授David G.Lowe在1999年在
- 会议文章中提出,2004年发表在IJCV上, 是计算机视觉界近二十年来引用率最高的文章之一
- SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种稳定的局部特征
- SIFT的特征提取方面对计算机视觉近年来的发展影响深远,特别是几乎影响到了后续所有的角点提取和匹配算法
尺度空间:
在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。
尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中,更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。
高斯金字塔:
尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两部分:
1. 对图像做不同尺度的高斯模糊;
2. 对图像做降采样(隔点采样)。
图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。
SIFT的优点:
- 稳定性: 对旋转、尺度缩放、亮度变化等保持不变性,是一种稳定的局部特征;
- 独特性: 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配;
- 多量性: 即使是很少几个物体也可以产生大量的SIFT特征;
- 高速性: 改进的SIFT匹配算法甚至可以达到实时性;
- 扩展性: 可以很方便的与其他的特征向量进行联合 。
SIFT的缺点
SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在:
1. 实时性不高。
2. 有时特征点较少。
3. 对边缘光滑的目标无法准确提取特征点。
Python实现:
import cv2 as cv
import numpy as np
# 1.使用SIFT算子检测角点
# 读取图像并旋转90度
img = cv.imread("left03.jpg")
img1 = np.rot90(img)
# 创建检测算子,提取描述子
sift = cv.xfeatures2d_SIFT.create(100)
kp1, dst1 = sift.detectAndCompute(img, None)
kp2, dst2 = sift.detectAndCompute(img1, None)
# BFMatcher类的创建
bf = cv.BFMatcher.create(cv.NORM_L2)
# 描述子匹配
matches = bf.knnMatch(dst1, dst2, k=2)
# 筛选比较好的匹配点
good = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good.append([m])
# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv.drawMatchesKnn(img, kp1, img1, kp2, good, flags=2, outImg=None)
cv.imshow('drawMatchesKnn', img3)
cv.waitKey()
cv.destroyAllWindows()
实现效果: