一、SIFT配准简介

SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
1 SIFT算法特点:
(1)具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。
(2)区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配
(3)多量性,就算只有单个物体,也能产生大量特征向量
(4)高速性,能够快速的进行特征向量匹配
(5)可扩展性,能够与其它形式的特征向量进行联合

2 SIFT算法实质
在不同的尺度空间上查找关键点,并计算出关键点的方向。

3 SIFT算法实现特征匹配主要有以下三个流程:
(1)提取关键点:关键点是一些十分突出的不会因光照、尺度、旋转等因素而消失的点,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。此步骤是搜索所有尺度空间上的图像位置。通过高斯微分函数来识别潜在的具有尺度和旋转不变的兴趣点。
(2)定位关键点并确定特征方向:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。然后基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
(3)通过各关键点的特征向量,进行两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。

4 尺度空间
(1)概念
尺度空间即试图在图像领域中模拟人眼观察物体的概念与方法。例如:观察一颗树,关键在于我们想要观察是树叶子还是整棵树:如果是一整棵树(相当于大尺度情况下观察),那么就应该去除图像的细节部分。如果是树叶(小尺度情况下观察),那么就该观察局部细节特征。
SIFT算法在构建尺度空间时候采取高斯核函数进行滤波,使原始图像保存最多的细节特征,经过高斯滤波后细节特征逐渐减少来模拟大尺度情况下的特征表示。
利用高斯核函数进行滤波的主要原因有两个:
a 高斯核函数是唯一的尺度不变核函数。
b DoG核函数可以近似为LoG函数,这样可以使特征提取更加简单。同时,David. Lowe作者在论文中提出将原始图像进行2倍上采样后滤波能够保留更多的信息便于后续特征提取与匹配。其实尺度空间图像生成就是当前图像与不同尺度核参数σ进行卷积运算后产生的图像。
(2)表示
L(x, y, σ) ,定义为原始图像 I(x, y)与一个可变尺度的2维高斯函数G(x, y, σ) 卷积运算。

5 高斯金字塔的构建
(1)概念
尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两步:
a 对图像做高斯平滑;
b 对图像做降采样。

图像的金字塔模型是指将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n层。为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如上图所示,将图像金字塔每层的一张图像使用不同参数做高斯模糊,Octave表示一幅图像可产生的图像组数,Interval表示一组图像包括的图像层数。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。
(2)表示
高斯图像金字塔共o组、s层,则有

6 DOG空间极值检测
(1)DOG函数

(2)DoG高斯差分金字塔
a 对应DOG算子,需构建DOG金字塔。
可以通过高斯差分图像看出图像上的像素值变化情况。(如果没有变化,也就没有特征。特征必须是变化尽可能多的点。)DOG图像描绘的是目标的轮廓。

b DOG局部极值检测
特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如下图,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

b 去除边缘效应
在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。候选特征点的DoG函数D(x)的主曲率与2×2Hessian矩阵H的特征值成正比。


7 关键点方向分配
(1)通过尺度不变性求极值点,需要利用图像的局部特征为给每一个关键点分配一个基准方向,使描述子对图像旋转具有不变性。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:

(2)本算法采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点确定关键点方向。在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向。梯度直方图将0~360度的方向范围分为36个柱,其中每柱10度。如下图所示,直方图的峰值方向代表了关键点的主方向,方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。

8 关键点描述
对于每一个关键点,都拥有位置、尺度以及方向三个信息。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。

Lowe实验结果表明:描述子采用4×4×8=128维向量表征,综合效果最优(不变性与独特性)。

9 关键点匹配
(1)分别对模板图(参考图,reference image)和实时图(观测图,
observation image)建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。
(3)匹配可采取穷举法完成,但所花费的时间太多。所以一般采用kd树的数据结构来完成搜索。搜索的内容是以目标图像的关键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻近的原图像特征点。
Kd树如下如所示,是个平衡二叉树

10 总结
SIFT特征具有稳定性和不变性,在图像处理和计算机视觉领域有着很重要的作用,其本身也是非常复杂的,由于接触SIFT不是很久,对其中的相关知识了解还很不足,经多方查阅参考,写得此文,内容还不够详尽,望多多见谅。以下是SIFT算法的粗略总结。
(1)DoG尺度空间的极值检测。
(2)删除不稳定的极值点。
(3)确定特征点的主方向
(4)生成特征点的描述子进行关键点匹配。

二、源代码

function varargout = ImageRegistration(varargin)
% IMAGEREGISTRATION MATLAB code for ImageRegistration.fig
%      IMAGEREGISTRATION, by itself, creates a new IMAGEREGISTRATION or raises the existing
%      singleton*.
%
%      H = IMAGEREGISTRATION returns the handle to a new IMAGEREGISTRATION or the handle to
%      the existing singleton*.
%
%      IMAGEREGISTRATION('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in IMAGEREGISTRATION.M with the given input arguments.
%
%      IMAGEREGISTRATION('Property','Value',...) creates a new IMAGEREGISTRATION or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before ImageRegistration_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to ImageRegistration_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
%  % Edit the above text to modify the response to help ImageRegistration%  % Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @ImageRegistration_OpeningFcn, ...'gui_OutputFcn',  @ImageRegistration_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDITaddpath(pwd);
% --- Executes just before ImageRegistration is made visible.
function ImageRegistration_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to ImageRegistration (see VARARGIN)5% Choose default command line output for ImageRegistration
handles.output = hObject;% 消除axes坐标轴
set(handles.axes1,'Xtick',[],'Ytick',[]);
set(handles.axes1,'Xcolor',[1 1 1],'Ycolor',[1 1 1]);
set(handles.axes2,'Xtick',[],'Ytick',[]);
set(handles.axes2,'Xcolor',[1 1 1],'Ycolor',[1 1 1]);
set(handles.axes3,'Xtick',[],'Ytick',[]);
set(handles.axes3,'Xcolor',[1 1 1],'Ycolor',[1 1 1]);
set(handles.axes4,'Xtick',[],'Ytick',[]);
set(handles.axes4,'Xcolor',[1 1 1],'Ycolor',[1 1 1]);
set(handles.axes5,'Xtick',[],'Ytick',[]);
set(handles.axes5,'Xcolor',[1 1 1],'Ycolor',[1 1 1]);% Update handles structure
guidata(hObject, handles);% UIWAIT makes ImageRegistration wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = ImageRegistration_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
clc%%%%%%%%%%%%%%%调用OpenImage.m读入参考图像并获取文件名、图像大小%%%global Image_I;Image_I.FileInformation.IsImage=0;while Image_I.FileInformation.IsImage==0Image_I1=OpenImage;if Image_I.flag ==1
%        delete(Image_I.figure1);break;endendif Image_I.flag==0delete(Image_I.figure1);handles.ImsizeI=Image_I.FileInformation.imsize;handles.filenameI=Image_I.FileInformation.filename;handles.names_dispI=Image_I.FileInformation.names_disp;set(handles.text1,'String',handles.names_dispI);guidata(hObject,handles);%%%%%%%%%%%%显示参考图像axes(handles.axes1)I=imread(handles.filenameI);imshow(I)end
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)clc%%%%%%%%调用OpenImage.m读入浮动图像并获取文件名、图像大小global Image_I;Image_I.FileInformation.IsImage=0;while Image_I.FileInformation.IsImage==0Image_J=OpenImage;if Image_I.flag ==1
%        delete(Image_I.figure1);break;endendif Image_I.flag==0delete(Image_I.figure1);handles.ImsizeJ=Image_I.FileInformation.imsize;handles.filenameJ=Image_I.FileInformation.filename;handles.names_dispJ=Image_I.FileInformation.names_disp;set(handles.text2,'String',handles.names_dispJ);guidata(hObject,handles);%%%%%%%%显示浮动图像%%%%%%%%%%%%%%%%%%%%axes(handles.axes2);J=imread(handles.filenameJ);imshow(J)end% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)clc;%%%%%%%%%%%%%%检测是否已输入参考图像与浮动图像axesIbox=get(handles.axes1,'box');axesJbox=get(handles.axes2,'box');if strcmp(axesIbox,'off')||strcmp(axesJbox,'off')errordlg('Please select Image for Registration','Error');error('No Image!');end%%%%%%%%%%%%%检测参考图像与浮动图像大小是否相同handles.isSameSizeIJ=strcmp(handles.ImsizeI,handles.ImsizeJ);if handles.isSameSizeIJ~=1errordlg('Please Select the Same Size Image','Error');error('Image Size doesn''t match!');end%%%%%%%%%%%%读入并复制图像,一副用于配准过程,另一幅用于配准后输出BaseImage=imread(handles.filenameI);RegisterImage=imread(handles.filenameJ);% 实现图像配准tic[img0,diff] = imMosaic(BaseImage,RegisterImage,1);tocElapsedTime=toc;ElapsedTime=sprintf('Elapsed Time=[%.3f]',ElapsedTime);% 显示配准后的结果axes(handles.axes3);imshow(img0);% 显示差分的结果axes(handles.axes4)imshow(diff);% 设置阈值消除配准不精确的点
if numel(size(diff))>2diff1 = rgb2gray(diff);
elsediff1 = diff;
end

三、运行结果



四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]侯思祖,陈宇,刘雅婷.基于互信息的紫外成像仪中图像配准研究[J].半导体光电. 2020,41(04)

【图像配准】基于matlab GUI SIFT图像配准拼接【含Matlab源码 854期】相关推荐

  1. 【运动学】基于matlab GUI三体运动模拟【含Matlab源码 871期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[运动学]基于matlab GUI三体运动模拟[含Matlab源码 871期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  2. 【音乐播放】基于matlab GUI动感音乐播放【含Matlab源码 778期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[音乐播放]基于matlab GUI动感音乐播放[含Matlab源码 778期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  3. 【雷达通信】基于matlab GUI相控阵雷达方向图【含Matlab源码 1048期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[雷达通信]基于matlab GUI相控阵雷达方向图[含Matlab源码 1048期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  4. 【数据分析】基于matlab GUI齿轮箱振动数据分析【含Matlab源码 2122期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数据分析]基于matlab GUI齿轮箱振动数据分析[含Matlab源码 2122期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  5. 【光学】基于matlab GUI维达尔之眼计算【含Matlab源码 2545期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI维达尔之眼计算[含Matlab源码 2545期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  6. 【光学】基于matlab GUI双孔干涉【含Matlab源码 2119期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI双孔干涉[含Matlab源码 2119期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费 ...

  7. 【光学】基于matlab GUI双缝干涉和牛顿环【含Matlab源码 2165期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI双缝干涉和牛顿环[含Matlab源码 2165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  8. 【数字信号】基于matlab GUI电话按键识别【含Matlab源码 2382期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数字信号]基于matlab GUI电话按键识别[含Matlab源码 2382期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  9. Matlab GUI/APP 浅谈(附计算器源码)

    Matlab GUI/APP 浅谈(附计算器源码) 今天没有什么段子,也没有心灵鸡汤.毒鸡汤啥的,纯粹聊一聊这些年从有关MATLAB GUI/APP开发中悟出的一点道理,顺便把计算器的源代码给大家. ...

  10. 【身份证识别】基于matlab GUI身份证号码识别【含Matlab源码 014期】

    ⛄一.身份证号码识别简介 1 引言 作为居民身份的象征,身份证是居民身份的唯一标识,它已成为生活中必不可少的证件.在火车站.酒吧等公共场所,流动人口大人员复杂,警察需要对公民的身份证进行核对,排除可疑 ...

最新文章

  1. java安装傻瓜_安装Java傻瓜式教程
  2. 微信公众号开发笔记1-获取Access Token
  3. ajax前台传json到后台解析的方法以及注意事项
  4. css属性~(积少成多)
  5. VI全屏文本编辑器的命令总结
  6. c语言 链表_小陈的C语言笔记---链表(详细讲解基本操作和概念)
  7. 如何安装安信可一体化开发环境【转】
  8. Django优化(减少数据库查询次数)---select_related和prefetch_related的使用
  9. 如何把视频转换成mp3格式
  10. GPS之MTK平台代码小结以及gps协议注释
  11. 官方确认:商业银行互联网贷款管理办法将出台!
  12. java poi导出Excel表,合并单元格
  13. MATLAB读dat文件中存储的十六进制数
  14. SpringCloud - Spring Cloud Netflix 之 Zuul网关;路由(十一)
  15. 电磁场理论笔记02:自由空间中的电磁场定律
  16. docker 入门使用
  17. 计算机视觉算法库OpenCV4.5.3+OpenCV_contrib 4.5.3资料精讲
  18. elementui中日期组件,日期图标在右边,有删除图标(完整代码)
  19. 2.CCNA第二天-主机到主机通讯模型
  20. 日历签到html模板,简洁的jQuery日历签到插件

热门文章

  1. Echarts的使用方法
  2. 【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构
  3. 读Windows核心编程-1-错误处理
  4. GitHub项目下载链接
  5. 人生的一切问题,归根结底就是这三点:无知!恐惧!延迟!
  6. 190313每日一句
  7. 永远不要低估自己,love your fear.
  8. Atitit 常用的登录认证法 目录 2. 表单验证 1 3. OAuth 认证 1 4. Web票据模式验证 1 4.1. Token验证 1 4.2. Cookie-Session 认证 1
  9. Atitit 技术成果有哪些 1. 技术成果 1 2. 技术成果分类 2 2.1. 职务技术成果和非职务技术成果 2 2.2. 专利技术成果和非专利技术成果 2 3. 范例代码项目 与代码片段 2
  10. Atitit 项目战略之道 attilax著