1. 图像尺度空间
人眼很容易就能分辨出物体的大小,但对于计算机却很难,要让机器对物体在不同尺度下有一个统一的认知,就需要考虑图像在不同尺度下的特点。
尺度空间的获取通常使用高斯模糊实现



不同σ的高斯函数决定了图像的平滑程度,σ越大,图像越模糊
2. 分辨率金字塔
多分辨率金字塔

高斯差分金字塔 DOG

DOG定义公式

DOG空间极值检测
为了寻找尺度空间的极值点,每个像素点要和其图像区域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于或小于所有相邻点时,该点就是极值点。
如下图所示,位于中间的检测点要和其所在图像的3x3领域8个像素点,以及相临的上下两层的3x3领域18个像素点,共计26个点逐一进行比对。

3. 特征关键点定位
候选关键点是DOG空间的局部极值点,且均是离散的,对尺度空间DOG函数进行曲线拟合,计算极值点,以此实现关键点的精确定位。

消除边界响应

特征点的主方向

每个特征点可以得到三个信息(x, y, σ, θ),即位置、尺度、方向,具有多个方向的关键点可以被复制成多份,然后将方向值分别赋值给复制后的特征点,一个特征点就产 生了多个坐标、尺度相等,但方向不同的特征点。
4. 生成特征描述
在完成关键点的梯度计算后,使用直方图统计临域内像素的梯度和方向

为了保证特征矢量的旋转不变性,要以特征点为中心,在附近临域内将坐标轴旋转θ度,即将坐标轴旋转为特征点的主方向。

以旋转之后的主方向为中心取8x8的窗口,求每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,再通过高斯窗口对其进行加权运算,最后在每个4x4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,每个特征点由4个种子点组成,每个种子点有8个方向的向量信息。

相关论文建议对每个关键点使用4x4共16个种子点来描述,这样一个关键点就会产生128维的sift向量。

5. 演示
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('ysg.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 获取特征点
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None)
img = cv2.drawKeypoints(gray, kp, img)
plt.imshow(img, 'gray')
plt.show()
# 计算特征
kp, des = sift.compute(gray, kp)
np.array(kp).shape
(232,)
des.shape
(232, 128)
des[0]
array([ 3., 23., 10., 3., 36., 59., 20., 0., 124., 15., 1.,
1., 68., 55., 16., 7., 170., 59., 0., 0., 1., 1.,
0., 1., 30., 6., 1., 2., 35., 3., 0., 0., 15.,
68., 22., 4., 24., 6., 0., 0., 109., 16., 2., 3.,
104., 41., 10., 14., 170., 42., 0., 0., 5., 3., 4.,
26., 54., 9., 1., 0., 26., 6., 0., 0., 77., 14.,
0., 0., 5., 5., 3., 13., 80., 4., 0., 0., 19.,
24., 135., 155., 170., 6., 0., 0., 1., 2., 62., 170.,
38., 13., 3., 0., 4., 3., 0., 4., 40., 6., 0.,
0., 4., 2., 0., 4., 66., 3., 0., 0., 0., 0.,
25., 60., 9., 0., 0., 0., 0., 0., 20., 45., 4.,
2., 0., 0., 0., 0., 0., 2.], dtype=float32)
评论 (0)