一、SIFT算法简介

0 引言
图像配准是对不同时间、不同角度或不同传感器获取的同一场景两幅或多幅图像进行空间对准的过程。图像配准技术广泛应用于遥感、医学图像分析、机器视觉和场景分类等多个领域。现有配准方法根据其在配准过程中采用的图像信息差异, 大致分为3类:基于特征的图像配准、基于灰度信息的图像配准和基于变换域的图像配准。其中基于特征的图像配准方法因其计算量较低, 对位置变化较敏感, 同时降低了噪声、遮挡、光照和图像变形的影响, 成为当前主流的配准方法。

随着基于特征的图像配准方法的快速发展, Lowe在1999年的计算机视觉国际会议上首次提出了尺度不变特征变换 (Scale Invariant Features Transform, SIFT) 算法, 并在2004年对该方法进一步完善。SIFT算法由于在图像平移、旋转、缩放、视角变换和光照变化等因素下具有很好的效果, 因而受到广泛重视。基于此, 本文对基于SIFT算法的图像配准方法进行了综述, 总结其特点、存在问题, 展望了发展趋势, 同时介绍了常用的点特征图像配准效果评价指标。

1 SIFT算法基本步骤
SIFT图像配准算法基本步骤如下: (1) 特征点提取; (2) 生成特征描述子; (3) 特征点匹配。其中特征点提取主要包括生成高斯差分 (Difference of Gaussian, DOG) 尺度空间、寻找局部极值点、特征点筛选、确定特征点方向;特征点匹配主要包括根据描述子相似性进行匹配、匹配对比值提纯、RANSAC方法剔除离群匹配对。

2 特征点提取
采用SIFT算法进行特征点提取步骤如图1所示。
【图像配准】基于matlab SIFT图像配准【含Matlab源码 148期】_极值
式中, k视为一个常数, 是两个相邻尺度图像的尺度比。
【图像配准】基于matlab SIFT图像配准【含Matlab源码 148期】_极值_02
图1 基于SIFT的图像配准算法流程
(2) 寻找局部极值点。生成DOG尺度空间后, 将每一个采样点进行扫描操作, 将其与周围26个像素点进行比较, 判断其是否为极值点。以这种方式找到的局部极值点就是图像的粗略特征点 (关键点) 。

(3) 特征点筛选。选取完图像的粗略特征点之后, 利用差值算法确定关键点的位置与尺度, 然后剔除对比度低的极值点, 并用Hessian矩阵除去由高斯差分运算造成的边缘响应干扰, 以此优化特征点检测结果。

(4) 确定特征点方向。特征向量除了具有该向量的坐标值 (平面位置和尺度) 外, 还要根据特征点邻域像素的梯度方向确定其方向值。高斯平滑图像L在点 (x, y) 处梯度的模值m (x, y) 和方向θ (x, y) 可分别由公式 (4) 和公式 (5) 表示。
【图像配准】基于matlab SIFT图像配准【含Matlab源码 148期】_极值_03
3 生成局部描述子
以特征点为中心取16×16像素大小区域, 将此区域均分为4×4的子块, 统计每个子块8个方向的梯度方向直方图, 便可得到一个种子点。每个特征点由4×4个种子点构成, 且每个种子点有8个方向, 因此组成了4×4×8=128维的特征向量, 该向量具备旋转不变性、尺度不变性等。为保证向量具有一定的光照不变性, 还需对其进行归一化处理。

4 特征点匹配
SIFT匹配算法是根据特征描述子之间的欧氏距离判断其相似性的, 欧氏距离越小相似度越高, 反之则越低。此外, 为减少错误匹配, 提高匹配准确率, 还会采用比值提纯法对匹配结果提纯。在比值提纯后, 一般还会用随机抽样一致性 (Random Sample Consensus, RANSAC) 算法剔除离群匹配对, 以进一步提高匹配精度。

二、部分源代码

close all;clear all;clc;
 
im1=imread('testdata\x1.jpg');
im2=imread('testdata\x2.jpg');
 
gray1=zoo_x2gray(im1);
gray2=zoo_x2gray(im2);
 
[des1,loc1]=zoo_sift(gray1);
[des2,loc2]=zoo_sift(gray2);
 
figure;zoo_drawPoints(im1,loc1,im2,loc2);
 
Num=3;
Thresh=0.85;
 
match=zoo_BidirectionalMatch(des1,des2,Num,Thresh);
 
clear des1 des2
loc1=loc1(match(:,1),:);
loc2=loc2(match(:,2),:);
 
figure;zoo_linePoints(im1,loc1,im2,loc2);
 
agl=zoo_getRotAgl(loc1,loc2);
 
figure;zoo_drawRotAglHist(agl);
 
opt=zoo_optIndex(agl);
loc1=loc1(opt,:);
loc2=loc2(opt,:);
 
figure;zoo_linePoints(im1,loc1,im2,loc2);
 
T=zoo_getTransMat(gray1,loc1,gray2,loc2);
im=zoo_imRegist(im1,im2,T);
 
figure,imshow(im);

三、运行结果

【图像配准】基于matlab SIFT图像配准【含Matlab源码 148期】_极值_04
【图像配准】基于matlab SIFT图像配准【含Matlab源码 148期】_特征点_05

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]黄海波,李晓玲,熊文怡,聂祥飞.基于SIFT算法的图像配准综述[J].软件导刊. 2019,18(01)