文章目录
-
- **一、SIFT算法特点:**
- **二、SIFT算法实质**
- **三、SIFT算法流程***
- **四、关键点检测相关的概念**
- 1.什么是特征点
- 2.什么是尺度空间
- **五、高斯金字塔**
- **1、概念**
- **2.表示**
- **六、DOG空间极值检测**
- **1、DOG函数**
- **2.DoG高斯差分金字塔**
- **七、关键点方向分配**
- **1.像素点的梯度表示**
- **2.方向直方图的生成**
- **3.关键点的主方向与辅方向**
- **七、关键点描述**
- **八、关键点匹配**
- **九、实验**
- **1.对17张图片进行SIFT特征提取,并展示**
- **2.任意两张图片SIFT特征匹配**
- **3.给定一张输入的图片,在数据集内部进行检索,输出与其匹配最多的三张图片**
- **4.局部描述子匹配&可视化连接的图片**
- **5.基于SIFT特征提取的RANSAC剔除错误匹配**
- **十.实验总结**
一、SIFT算法特点:
1、具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。
2、区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配
3、多量性,就算只有单个物体,也能产生大量特征向量
4、高速性,能够快速的进行特征向量匹配
5、可扩展性,能够与其它形式的特征向量进行联合
二、SIFT算法实质
在不同的尺度空间上查找关键点,并计算出关键点的方向。
*
三、SIFT算法流程*
1、提取关键点:关键点是一些十分突出的不会因光照、尺度、旋转等因素而消失的点,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。此步骤是搜索所有尺度空间上的图像位置。通过高斯微分函数来识别潜在的具有尺度和旋转不变的兴趣点。
2、定位关键点并确定特征方向:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。然后基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
3. 通过各关键点的特征向量,进行两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。
**
四、关键点检测相关的概念
**
1.什么是特征点
这些点是一些十分突出的点不会因光照、尺度、旋转等因素的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。既然两幅图像中 有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有 相互对应的匹配点。
**
2.什么是尺度空间
尺度空间理论最早于1962年提出,其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的空间表示。 从而实现边缘、角点检测和不同分辨率上的特征提取,以 满足特征点的尺度不变性。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标 在视网膜上的形成过程。尺度越大图像越模糊。SIFT算法在构建尺度空间时候采取高斯核函数进行滤波,使原始图像保存最多的细节特征,经过高斯滤波后细节特征逐渐减少来模拟大尺度情况下的特征表示。
利用高斯核函数进行滤波的主要原因有两个:
(1)高斯核函数是唯一的尺度不变核函数。
(2)DoG核函数可以近似为LoG函数,这样可以使特征提取更加简单。同时,David. Lowe作者在论文中提出将原始图像进行2倍上采样后滤波能够保留更多的信息便于后续特征提取与匹配。其实尺度空间图像生成就是当前图像与不同尺度核参数σ进行卷积运算后产生的图像。
SIFT算法在构建尺度空间时候采取高斯核函数进行滤波,使原始图像保存最多的细节特征,经过高斯滤波后细节特征逐渐减少来模拟大尺度情况下的特征表示。
利用高斯核函数进行滤波的主要原因有两个:
(1)高斯核函数是唯一的尺度不变核函数。
(2)DoG核函数可以近似为LoG函数,这样可以使特征提取更加简单。同时,David. Lowe作者在论文中提出将原始图像进行2倍上采样后滤波能够保留更多的信息便于后续特征提取与匹配。其实尺度空间图像生成就是当前图像与不同尺度核参数σ进行卷积运算后产生的图像。
2、表示
L(x, y, σ) ,定义为原始图像 I(x, y)与一个可变尺度的2维高斯函数G(x, y, σ) 卷积运算。
*表示卷积运算,(x,y)代表图像的像素位置。是尺度空间因子,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。
**
五、高斯金字塔
**
1、概念
**
尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两步:
(1)对图像做高斯平滑;
(2)对图像做降采样。
图像的金字塔模型是指将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n层。为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如上图所示,将图像金字塔每层的一张图像使用不同参数做高斯模糊,Octave表示一幅图像可产生的图像组数,Interval表示一组图像包括的图像层数。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。
**
2.表示
高斯图像金字塔共o组、s层,则有
σ——尺度空间坐标; s——sub-level层坐标; σ0——初始尺度; S——每组层数(一般为3~5)
最后可将组内和组间尺度 归为:
i——金字塔组数 n——每一组的层数
**
六、DOG空间极值检测
**
1、DOG函数
2.DoG高斯差分金字塔
(1)对应DOG算子,需构建DOG金字塔
可以通过高斯差分图 像看出图像上的像素 值变化情况。如果 没有变化,也就没有特征。特征必须是变化尽可能多的点。 DOG图像描绘的是目 标的轮廓。
*(2)DOG局部极值检测
DoG的局部极值点 特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点, 每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域 的相邻点大或者小。中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个 点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
(3)去除边缘响应
由于DoG函数在图像边缘有较强的边缘响应,因此需要排除边缘响应。 DoG函数的峰值点在边缘方向有较大的主曲率,而在垂直边缘的方向有 较小的主曲率。主曲率可以通过计算在该点位置尺度的2×2的Hessian矩 阵得到,导数由采样点相邻差来估计:
Dxx 表示DOG金字塔中某一尺度的图像x方向求导两次
D的主曲率和H的特征值成正比。令 α ,β为特征值,则
该值在两特征值相等时达最小。Lowe论文中建议阈值T为1.2,即
时保留关键点,反之剔除
七、关键点方向分配
通过尺度不变性求极值点,可以使其具有缩放不变的性质。而利 用关键点邻域像素的梯度方向分布特性,可以为每个关键点指定方向参数 方向,从而使描述子对图像旋转具有不变性。
通过求每个极值点的梯度来为极值点赋予方向。
**
1.像素点的梯度表示
梯度幅值:
梯度方向:
2.方向直方图的生成
确定关键点的方向采用梯度直方图统计法,统计以关键点为原 点,一定区域内的图像像素点对关键点方向生成所作的贡献。
3.关键点的主方向与辅方向
关键点主方向:极值点周围区域梯度直方图的主峰值也是特征点方向 • 关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值 80%能量的峰值时,则将这个方向认为是该关键点的辅方向。 这可以增强匹配的鲁棒性,Lowe的论文指出大概有15%关键点具有 多方向,但这些点对匹配的稳定性至为关键。
七、关键点描述
对于每一个关键点,都拥有位置、尺度以及方向三个信息。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
Lowe实验结果 表明:描述子 采用4×4×8= 128维向量表征, 综合效果最优 (不变性与独 特性)。
八、关键点匹配
关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太多,一 般都采用kd树的数据结构来完成搜索。搜索的内容是以目标图像的关 键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻 近的原图像特征点。 Kd树是一个平衡二叉树
九、实验
1.对17张图片进行SIFT特征提取,并展示
(1)代码
# coding=UTF-8
from PIL import Image
from numpy import *
from pylab import *
import os
def process_image(imagename, resultname, params="--edge-thresh 10 --peak-thresh 5"):
""" Process an image and save the results in a file. """
if imagename[-3:] != 'pgm':
# create a pgm file
im = Image.open(imagename).convert('L') # .convert('L') 将RGB图像转为灰度模式,灰度值范围[0,255]
im.save('tmp.pgm') # 将灰度值图像信息保存在.pgm文件中
imagename = 'tmp.pgm'
cmmd = str(r"C:\Users\86133\PycharmProjects\untitled\sift.exe " + imagename + " --output=" + resultname +
" " + params)
os.system(cmmd) # 执行sift可执行程序,生成resultname(test.sift)文件
print 'processed', imagename, 'to', resultname
def read_features_from_file(filename):
""" Read feature properties and return in matrix form. """
f = loadtxt(filename)
return f[:, :4], f[:, 4:] # feature locations, descriptors
def plot_features(im, locs, circle=True):
""" Show image with features. input: im (image as array),
locs (row, col, scale, orientation of each feature). """
def draw_circle(c, r):
t = arange(0, 1.01, .01) * 2 * pi
x = r * cos(t) + c[0]
y = r * sin(t) + c[1]
plot(x, y, 'b', linewidth=2)
imshow(im)
if circle:
for p in locs:
draw_circle(p[:2], p[2])
else:
plot(locs[:, 0], locs[:, 1], 'ob')
axis('off')
if __name__ == '__main__':
imname = ('D:\computervision-picture\school4.jpg') # 待处理图像路径
im = Image.open(imname)
process_image(imname, 'test.sift')
l1, d1 = read_features_from_file('test.sift') # l1为兴趣点坐标、尺度和方位角度 l2是对应描述符的128 维向
figure()
gray()
plot_features(im, l1, circle=True)
title('sift-features')
show()
(2)运行结果