目录
注:转载请标明原文出处链接:https://xiongyiming.blog.csdn.net/article/details/93656603
成像匹配的核心问题是将同一目标在不同时间、不同分辨率、不同光照、不同位姿情况下所成的像相对应。传统的匹配算法往往是直接提取角点或边缘,对环境的适应能力较差,急需提出一种鲁棒性强、能够适应不同光照、不同位姿等情况下能够有效识别目标的方法。
1999年British Columbia大学David G.Lowe教授总结了现有的基于不变量技术的特征检测方法,并正式提出了一种基于尺度空间的、对图像缩放、旋转甚至仿射变换保持不变性的图像局部特征描述算子-SIFT(Scale Invariant Feature Transform,尺度不变特征变换),这种算法在2004年被加以完善。
下面对SIFT进行详细说明。
注:博文主要参考 SIFT算法详解及应用PPT.以及David G.Lowe论文。
1 SIFT简介
1.1 SIFT应用
目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:
(1) 目标的旋转、缩放和平移(RST)
(2) 图像仿射/投影变换(视点viewpoint)
(3) 光照影响(illumination)
(4) 目标遮挡(occlusion)
(5) 杂物场景(clutter)
(6) 噪声
将一幅图像(变换)为一个局部特征向量集;特征向量具有平移、缩放和旋转不变性映射,同时对光照变化、仿射及投影变换也有一定不变性。
SIFT算法目前在军事、工业和民用方面都得到了不同程度的应用,其应用已经渗透了很多领域,典型的应用有物体识别、机器人定位与导航、图像拼接、三维建模、手势识别、视频跟踪、笔记鉴定、指纹与人脸识别、犯罪现场特征提取等。
下图所示为SIFI的几种应用:
1.2 SIFT特点
(1) SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
(2) 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
(3) 多量性,即使少数的几个物体也可以产生大量SIFT特征向量;
(4) 经过优化的SIFT算法可满足一定的速度需求;
(5) 可扩展性,可以很方便的与其他形式的特征向量进行联合。
2 SIFT算法步骤
2.1 算法简述
SIFT算法的实质可以归为在不同尺度空间上查找特征点(关键点)的问题。
SIFT算法实现物体识别主要有三大工序:
1、提取关键点;
2、对关键点附加详细的信息(局部特征)也就是所谓的描述器;
3、通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。
2.2 关键点检测
2.2.1 什么是SIFT关键点?
这些点是一些十分突出的点不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点,既然两幅图像中有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有相互对应的匹配点。
关键点:在不同尺度空间的图像下检测出的具有方向信息的局部极值点。根据归纳,我们可以看出特征点具有的三个特征:尺度、方向和大小。
2.2.2 什么是尺度空间(scale space)?
我们要精确表示的物体都是通过一定的尺度来反映的。现实世界的物体也总是通过不同尺度的观察而得到不同的变化。
尺度空间理论最早在1962年提出,其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。
尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。尺度越大图像越模糊。
根据文献《Scale-space theory: A basic tool for analysing structures at different scales》我们可知,高斯核是唯一可以产生多尺度空间的核,一个图像的尺度空间 定义为原始图像
一个可变尺度的2维高斯函数
卷积运算。
高斯函数 为:
尺度空间 为:
注:尺度是自然存在的,不是人为创造的!高斯卷积只是表现尺度空间的一种形式。
2.2.3 高斯模糊
高斯模糊是在Adobe Photoshop等图像处理软件中广泛使用的处理效果,通常用它来减小图像噪声以及降低细节层次。这种模糊技术生成的图像的视觉效果是好像经过一个半透明的屏幕观察图像,如下图所示:
其中,r为模糊半径,
在减小图像尺寸的场合经常使用高斯模糊。在进行欠采样的时,通常在采样之前对图像进行低通滤波处理。这样就可以保证在采样图像中不会出现虚假的高频信息。在实际应用中,在计算高斯函数的离散近似时,在大概 距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。通常,图像处理程序只需要计算
即可。
2.2.4 高斯金字塔
高斯金子塔的构建过程可分为两步:
(1)对图像做高斯平滑;
(2)对图像做降采样。
关于图像高斯金字塔Python实验可参见博客:https://blog.csdn.net/zaishuiyifangxym/article/details/90167880
为了让尺度体现其连续性,在简单下采样的基础上加上了高斯滤波。一幅图像可以产生几组 (octave) 图像,一组图像包括几层 (interval) 图像。
高斯图像金字塔共 o 组、s 层,则有:
其中, 表示尺度空间坐标;s 表示sub-level层坐标;
表示初始尺度;S表示每组层数(一般为3~5)。
高斯金字塔的初始尺度当图像通过相机拍摄时,相机的镜头已经对图像进行了一次初始的模糊,所以根据高斯模糊的性质:
其中, 表示第0层尺度,
表示被相机镜头模糊后的尺度。
高斯金字塔的组数:,其中,M、N 分别为图像的行数和列数。
高斯金字塔的组内尺度与组间尺度:
组内尺度:指同一组(octave)内的尺度关系,组内相邻层尺度化简为:
组间尺度:指不同组直接的尺度关系,相邻组的尺度可化为:
由此可见,相邻两组的同一层尺度为2倍的关系。
最后可将组内和组间尺度归为:
其中,,
表示金字塔组数,
表示每一组的层数
上一组图像的底层是由前一组图像的倒数第二层图像隔点采样生成的。这样可以保持尺度的连续性。
通过研究Lowe教授的论文发现,所有特征点的检测都是基于了尺度不变的特性,特征点的检测占据了论文的大部分的篇章,具有十分重要的意义!
Lindeberg在文献《Scale-space theory: A basic tool for analysing structures at different scales》指出尺度规范化的LoG算子具有真正的尺度不变性。
LoG算子即(Laplacion of Gaussian),可以由高斯函数梯度算子GoG构建
尺度规范化的GoG算子:
尺度规范化的LoG算子:
LoG算子与高斯核函数的关系:
通过推导可以看出,LoG算子与高斯核函数的差有直接关系,由此引入一种新的算子DoG(Difference of Gaussians),即高斯差分算子。
DoG(Difference of Gaussian)函数为:
DoG在计算上只需相邻尺度高斯平滑后图像相减,因此简化了计算。
DoG高斯差分金字塔
根据DoG算子,我们要构建DoG金字塔
我们可以通过高斯差分图像看出图像上的像素值变化情况 (如果没有变化,也就没有特征。特征必须是变化尽可能多的点)。DoG图像描绘的是目标的轮廓。
在Lowe的论文中,将第0层的初始尺度定为1.6,图片的初始尺度定为0.5,则图像金字塔第0层的实际尺度为
在检测极值点前对原始图像的高斯平滑以致图像丢失高频信息,所以Lowe建议在建立尺度空间前首先对原始图像长宽扩展一倍,以保留原始图像信息,增加特征点数量。
当对图像长宽扩展一倍时,便构建了-1层,该层尺度为
注:图像插值时,选用的插值函数可以是多种多样的。
2.2.5 DoG局部极值检测
DoG的局部极值点
关键点是由DoG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。
中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了3幅图像,高斯金字塔有每组S+3层图像。DoG金字塔每组有S+2层图像。下图为不同尺度不同层间极值检测示意图。
注:只牺牲了-1组的第0层和第组的最高层
关键点精确定位
由于DoG值对噪声和边缘较敏感,因此,在上面DoG尺度空间中检测到局部极值点还要经过进一步的检验才能精确定位为特征点。为了提高关键点的稳定性,需要对尺度空间DoG函数进行曲线拟合。利用DoG函数在尺度空间的Taylor展开式:
设,极值点为
在计算过程中,分别对图像的行、列及尺度三个量进行了修正,其修正结果如下:
求解得到:
其中, 为修正值。
在Lowe的程序中,对坐标进行了五次修正,将修正后的结果代入式
上式去除那些对比度较低的不稳定极值点。Lowe的试验显示,所有取值小于0.04的极值点均可抛弃 (像素灰度值范围[0,1] )。
去除边缘响应
仅仅去除低对比度的极值点对于极值点的对于特征点稳定性是远远不够的。DoG函数在图像边缘有较强的边缘响应,因此我们还需要排除边缘响应。
DoG函数的(欠佳的)峰值点在横跨边缘的方向有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率可以通过计算在该点位置尺度的2×2的Hessian矩阵得到,导数由采样点相邻差来估计:
其中, 表示DOG金字塔中某一尺度的图像
方向求导两次。
D 的主曲率和 H 的特征值成正比,为了避免直接的计算这些特征值,而只是考虑它们的之间的比率。令为最大特征值 ,
为最小的特征值,则:
其中, 在两特征值相等时达最小,随
的增长而增长。Lowe论文中建议
=10。
2.2.6 关键点方向分配
通过尺度不变性求极值点,可以使其具有缩放不变的性质,利用关键点邻域像素的梯度方向分布特性,我们可以为每个关键点指定方向参数方向,从而使描述子对图像旋转具有不变性。我们通过求每个极值点的梯度来为极值点赋予方向。
像素点的梯度表示:
梯度幅值:
梯度方向:
方向直方图的生成
确定关键点的方向采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。
关于方向直方图的几点说明:
(1) 直方图以每10度方向为一个柱,共36个柱,柱所代表的方向为像素点梯度方向,柱的长短代表了梯度幅值;
(2) 根据Lowe的建议,直方图统计半径采用3×1.5×σ ;
(3) 在直方图统计时,每相邻三个像素点采用高斯加权,根据Lowe的建议,模板采用 [0.25,0.5,0.25] ,并连续加权两次。
关键点的主方向与辅方向
关键点主方向:极值点周围区域梯度直方图的主峰值,也是特征点方向;
关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值80%能量的峰值时,则将这个方向认为是该关键点的辅方向。
这可以增强匹配的鲁棒性,Lowe的论文指出大概有15%关键点具有多方向,但这些点对匹配的稳定性至为关键。
方向分配实现步骤:
(1) 确定计算关键点直方图的高斯函数权重函数参数 ;
(2) 生成含有36柱的方向直方图,梯度直方图范围0~360度,其中每10度一个柱。由半径为图像区域生成;
(3) 对方向直方图进行两次平滑;
(4) 求取关键点方向(可能是多个方向);
(5) 对方向直方图的Taylor展开式进行二次曲线拟合,精确关键点方向;
图像的关键点已检测完毕,每个关键点有三个信息: 位置、尺度和方向. 同时也就使关键点具备平移、缩放和旋转不变性。
2.2.7 关键点描述
描述的目的:在关键点计算后,用一组向量将这个关键点描述出来,这个描述子不但包括关键点,也包括关键点周围对其有贡献的像素点。用来作为目标匹配的依据,也可使关键点具有更多的不变特性,如光照变化、3D视点变化等。
描述的思路:通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。
下图是一个SIFT描述子事例。其中描述子由2×2×8维向量表征,也即是2×2个8方向的方向直方图组成。左图的种子点由8×8单元组成。每一个小格都代表了特征点邻域所在的尺度空间的一个像素,箭头方向代表了像素梯度方向,箭头长度代表该像素的幅值。然后在4×4的窗口内计算8个方向的梯度方向直方图。绘制每个梯度方向的累加可形成一个种子点,如下图的右图所示:一个特征点由4个种子点的信息所组成。
Lowe实验结果表明:描述子采用4×4×8=128维向量表征,综合效果最优(不变性与独特性)。
128维关键点描述子生成步骤:
(1) 确定计算描述子所需的图像区域
描述子梯度方向直方图由关键点所在尺度的模糊图像计算产生。图像区域的半径通过下式计算:
其中, 是关键点所在组(octave)的组内尺度,
=4。
(2) 将坐标移至关键点主方向
那么旋转角度后新坐标为:
(3) 在图像半径区域内对每个像素点求其梯度幅值和方向,然后对每个梯度幅值乘以高斯权重参数,生成方向直方图。
其中, 表示该点与关键点的列距离,
该点与关键点的行距离,
等于描述子窗口宽度
×直方图列数(取4)的一半;
(4) 在窗口宽度为2×2的区域内计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点。然后再在下一个2×2的区域内进行直方图统计,形成下一个种子点,共生成16个种子点;
(5) 描述子向量元素门限化及门限化后的描述子向量规范化。
描述子向量元素门限化:方向直方图每个方向上梯度幅值限制在一定门限值以下(门限一般0.2)。
描述子向量元素规范化:
其中, 为得到的128描述子向量,
为规范化后的向量。
关键点描述子向量的规范化正是可去除满足此模型的光照影响。对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以也能去除。
2.2.8 关键点匹配
分别对原始图 (参考图,reference image) 和目标图像 (观测图,observation image) 建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。
选用穷举匹配的方法依次计算欧氏距离:
原图像中关键点描述子:
目标图像中关键点描述子:
任意两描述子相似性度量:
要得到配对的关键点描述子, 需满足:
关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太多,一般都采用一种叫kd树的数据结构来完成搜索。搜索的内容是以目标图像的关键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻近的原图像特征点。
关键点匹配并不能标志着算法的结束,因为在匹配的过程中存在着大量的错配点。具体方法这里不再赘述。
3 Matlab实验
SIFT 算法Matlab代码链接:https://download.csdn.net/download/zaishuiyifangxym/11258714
函数用法
(1) 提取SIFT描述子:
[image, descrips, locs] = sift('scene.pgm');
其中,参数:
image:输入图像矩阵;
descrips:规范化的特征描述子(n×128维;每行元素平方和为1)
locs:关键点(n×4;每行1、2个元素为关键点坐标,第3个元素为关键点的尺度,第4个元素为关键点的角度[单位:弧度])
具体过程:
1)Matlab读入图片并存为tmp.pgm;
2)调用可执行文件生sift成特征描述文件tmp.key:
第1行:第1个元素为特征点个数,第2个元素为特征描述子维数
第2行:关键点locs
第3~9行:第1个关键点的128维特征
3)将tmp.key读入为Matlab的矩阵并进行规范化。
(2) 显示关键点:
showkeys(image, locs);
其中:箭头方向代表关键点方向,长度代表尺度scale(显示时放大了6倍);
(3) 特征点匹配:
match('scene.pgm','book.pgm');
调用sift生成关键点特征描述子,通过计算两幅图片两两关键点对应特征向量的夹角(越小越相似)。
匹配规则:若A图中关键点a与B图最相似关键点为b1,次相似关键点为b2,并且a与b1的夹角小于distRatio(0.6)倍的a与b2的夹角,则a与b1匹配,否者a不与B图中任何点匹配。
(A) 提取关键点并显示
Matlab 主函数代码:
[image, descrips, locs] = sift('./image/ZXP1.jpg'); % 1 提取sift描述子
showkeys(image, locs); % 2 在图片上显示特征点
运行结果:
(B) 特征点匹配
Matlab 主函数代码:
reference_image='./image/ZXP1.jpg';
observation_image='./image/ZXP2.jpg';
match(reference_image,observation_image);
运行结果:
4 小结
SIFT关键点在不同尺度空间的图像下检测出的具有方向信息的局部极值点。特征点具有的三个特征:尺度、方向和大小。
SIFT算法关键点检测主要以下几个步骤:
1) 高斯金字塔;
2) DoG的局部极值点;
3) 关键点方向分配:求每个极值点的梯度来为极值点赋予大小和方向;
4) 关键点描述:128维向量。
参考资料
[1] LoweD G. Distinctive image features from scale-invariant keypoints [J]. International Journal of Computer Vision, 2004, 60(2): 91-110.
[2] Lindeberg T. Scale-space theory: A basic tool for analysing structures at different scales[C]//Journal of applied statistics. 1994.
[3] SIFT算法详解及应用PPT.