SIFT(尺度不变特征变换)
Sift(尺度不变特征变换),全称是Scale Invariant Feature Transform
Sift提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。
Sfit的应用范围包括物体辨别、机器人地图感知与导航、影像拼接、3D模型建立、手势识别、影像追踪等。
Sift特征的特点:
- 对视角变化、噪声等也存在一定程度的稳定性;
- 独特性,信息量丰富,适用于在海量特征数据中进行快速,准确的匹配;
- 多量性,即使少数几个物体也可以产生大量的Sfit特征向量;
注意SIFT有专利!
SIFT特征提取和匹配具体步骤
- 生成高斯差分金字塔(DOG金字塔),尺度空间构建
- 空间极值点检测(关键点的初步查探)
- 稳定关键点的精确定位
- 稳定关键点方向信息分配
- 关键点描述
- 特征点匹配
—概念—
尺度空间,即,试图在图像领域中模拟人眼观察物体的概念与方法。
图像金字塔--》高斯金字塔--》DOG金字塔--》尺度空间
高斯金字塔:
- 在同一组内,不同层图像的尺寸是一样的,后一层图像的
高斯平滑因子σ是前一层图像平滑因子的k倍; - 在不同组间,后一组第一个图像是前一组倒数第三个图像
的二分之一采样,图像大小是前一组的一半
DOG金字塔-高斯差分金字塔
差分金字塔,DOG(Difference of Gaussian)金字塔是在高斯金字塔的基础上构建起来的,其实生成高斯金字塔的目的就是为了构建DOG金字塔。
DOG金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层得到的。以此类推,
逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。
概括为DOG金字塔的第o组第l层图像是由高斯金字塔的第o组第l+1层减第o组第l层得到的
尺度空间极值检测
特征点是由DOG空间的局部极值点组成的。为了寻找DoG的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。
如下图,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点
获得S层的极值点–》DOG就得有S+2层–》高斯金字塔得有L=S+3层
代码:
# -*- coding: utf-8 -*-
'''@Time: 2024/5/19 16:20
'''
import cv2
import numpy as np
img = cv2.imread("../lenna.png")
gray = cv2.imread("../lenna.png",0)
sift = cv2.xfeatures2d.SIFT_create()
keypoints,descriptor = sift.detectAndCompute(gray,None)
img = cv2.drawKeypoints(image=img,outImage=img,keypoints=keypoints,
flags=cv2.DrawMatchesFlags_DRAW_RICH_KEYPOINTS,
color=(51,163,236))
cv2.imshow('sift_keypoints',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看出:关键点的尺度越大,越是轮廓(比如脸部),尺度越小,越是细节(比如头发,帽檐)。