当前位置: 首页 > 编程日记 > 正文

图像配准的方法

转自:http://blog.sina.com.cn/s/blog_4b9b714a0100d5k5.html

 图像配准的方法

基于特征的图像配准

基于特征的图像配准首先提取图像信息的特征,然后以这些特征为模型进行配准。特征提取的结果是一含有特征的表和对图像的描述,每个特征由一组属性表示,对属性的进一步描述包括边缘的定向和弧度、区域的大小等。局部特征之间存在着相互关系,如几何关系、辐射度量关系、拓扑关系等。可以用这些局部特征之间的关系描述全局特征。通常基于局部特征配准大多都是基于点、线或边缘的,而全局特征的配准则是利用局部特征之间的关系进行配准的方法。

由于图像的特征点比图像的像素点要少很多,因此大大减少了配准过程的计算量,但特征提取方法的计算代价通常较大,不便于实时应用。特征点的配准度量值对位置的变化比较敏感,可以大大提高配准的精确程度。对于纹理较少的图像区域提取的特征的密度通常比较稀少,局部特征的提取就比较困难。特征点的提取过程可以减少噪声的影响,对灰度变化、图像形变和遮挡等都有较好的适应能力。因此,在图像配准领域得到了广泛应用。基于特征的图像配准方法有两个重要环节:特征提取和特征配准。

2  基于互信息的图像配准

医学图像配准技术从基于特征的配准方法发展到基于统计的配准方法有其突破性的意义。与基于特征的配准方法相比,基于统计的配准方法的突出优点为鲁棒性好、配准精度高、人工干预少。基于统计的配准方法通常是指最大互信息的图像配准方法。

基于互信息的图像配准是用两幅图像的联合概率分布与完全独立时的概率分布的广义距离来估计互信息,并作为多模态医学图像配准的测度。当两幅基于共同的解剖结构的图像达到最佳配准时,它们的对应像素的灰度互信息应为最大。由于基于互信息的配准对噪声比较敏感,首先,通过滤波和分割等方法对图像进行预处理。然后进行采样、变换、插值、优化从而达到配准的目的。

基于互信息的配准技术属于基于像素相似性的方法。它基于图像中所有的像素进行配准,基于互信息的图像配准引入了信息论中的概念,如熵、边缘熵、联合熵和互信息等,可使配准精度达到亚像素级的高精度。    

基于互信息只依赖于图像本身的信息,不需要对图像进行特征点提取和组织分类等预处理,是一种自动而有效的配准算法。该算法可靠,对图像中的几何失真、灰度不均匀和数据的缺失等不敏感。不依赖于任何成像设备,可应用于多模态医学图像配准。基于互信息的图像配准也有其缺点,它运算量大,对噪声敏感,要求待配准图像间联合概率分布函数必须是严格正性的。

【例1】计算两幅图像的互信息。

function mi = MI(a,b)

%Caculate MI of a and b in the region of the overlap part

%计算重叠部分

[Ma,Na] = size(a);

[Mb,Nb] = size(b);

M=min(Ma,Mb);

N=min(Na,Nb);

%初始化直方图数组

hab = zeros(256,256);

ha = zeros(1,256);

hb = zeros(1,256);

%归一化

if max(max(a))~=min(min(a))

a = (a-min(min(a)))/(max(max(a))-min(min(a)));

else

a = zeros(M,N);

end

if max(max(b))-min(min(b))

b = (b-min(min(b)))/(max(max(b))-min(min(b)));

else

b = zeros(M,N);

end

a = double(int16(a*255))+1;

b = double(int16(b*255))+1;

%统计直方图

for i=1:M

for j=1:N

indexx = a(i,j);

indexy = b(i,j) ;

hab(indexx,indexy) = hab(indexx,indexy)+1;%联合直方图

ha(indexx) = ha(indexx)+1;%a图直方图

hb(indexy) = hb(indexy)+1;%b图直方图

end

end

%计算联合信息熵

hsum = sum(sum(hab));

index = find(hab~=0);

p = hab/hsum;

Hab = sum(sum(-p(index).*log(p(index))));

%计算a图信息熵

hsum = sum(sum(ha));

index = find(ha~=0);

p = ha/hsum;

Ha = sum(sum(-p(index).*log(p(index))));

%计算b图信息熵

hsum = sum(sum(hb));

index = find(hb~=0);

p = hb/hsum;

Hb = sum(sum(-p(index).*log(p(index))));

%计算a和b的互信息

mi = Ha+Hb-Hab;

%计算a和b的归一化互信息

%mi = hab/(Ha+Hb);

3  医学图像配准

目前,图像配准技术在医学领域应用得相当广泛。医学图像配准具有很重要的临床应用价值。对各种使用相同或者不同的成像手段所获得的医学图像进行配准不仅可以应用于医疗诊断,也可以应用于手术计划的制定、治疗计划的制定、病理情况的跟踪和治疗效果的评价等各个方面。

下面给出一个具体的图像配准的例子来形象说明配准的应用。

(1) 读取图像数据。因为源图像以矩阵形式存在一个二进制的文件里,用fread可将其读取到变量矩阵中。将读取文件编制成一个子函数(RTIread.m)。源代码如下:

function imMatrix=RTIread(FILENAME,SIZE)

%RTIread Read the image matrix from binary "Registration Test Image" file.

% imMatrix=RTIread(FILENAME,SIZE) opens the file FILENAME, and reads the

% number of elements specified by SIZE.

%

% FILENAME is a string containing the name of the file to be opened.

% Valid entries for SIZE are:

% N read N elements into a column vector.

% inf read to the end of the file.

% [M,N] read elements to fill an M-by-N matrix, in column order.

% N can be inf, but M can't.

%

% It returns the image matrix.

fid=fopen(FILENAME,'r');

imMatrix=fread(fid,SIZE,'uint8=>uint8');

fclose(fid);

这里选取了两张256×256的图片,文件名为sag1.tif和sag2.tif。

 

运行以下代码读取图像矩阵:

base=RTIread('sag1.tif',[256,256]);

input=RTIread(sag2.tif,[256,256]);

(2) 选取匹配点。根据预定的配准方法,选定足够的匹配点对。运行下列代码:

cpselect(input,base); %please select 15 points for test.

 

注意:

这里允许选择15个点进行测试。

操作很简单,只需注意选点要均匀布开,以增加其代表性。选定完毕,再选择File→Save Points to Workspace命令将数据保存到工作区中。Workspace立刻多出两个N×2的数组(其中N为选定的匹配点对数),分别为input_points和base_points。

(3) 利用十字相关法调整选定了的匹配点。如果对上面一个步骤的选点工作不满意,可以进行这一步。如果感觉尚可,则跳过这一步,以减小运算量。

运行代码:

input_points_corr = cpcorr(input_points,base_points,input,base);

%优化选择点的作用

input_points_corr为优化后在输入图片的对应匹配点。

(4) 计算变换公式的参数。利用cp2tform选定变换类型(配准方法),计算变换参数。以下只需选定一种即可。

% (1) not Fine-tune points

Tlinear = cp2tform(input_points,base_points,'linear conformal');

Taffine = cp2tform(input_points,base_points,'affine');

Tprojective = cp2tform(input_points,base_points,'projective');

Tpolynomial2 = cp2tform(input_points,base_points,'polynomial',2);

Tpolynomial3 = cp2tform(input_points,base_points,'polynomial',3);

Tpolynomial4 = cp2tform(input_points,base_points,'polynomial',4);

Tpiecewise = cp2tform(input_points,base_points,'piecewise linear');

Tlwm = cp2tform(input_points,base_points,'lwm');

% (2)Fine-tune points

fTlinear = cp2tform(input_points_corr,base_points,'linear conformal');

fTaffine = cp2tform(input_points_corr,base_points,'affine');

fTprojective = cp2tform(input_points_corr,base_points,'projective');

fTpolynomial2 = cp2tform(input_points_corr,base_points,'polynomial',2);

fTpolynomial3 = cp2tform(input_points_corr,base_points,'polynomial',3);

fTpolynomial4 = cp2tform(input_points_corr,base_points,'polynomial',4);

fTpiecewise = cp2tform(input_points_corr,base_points,'piecewise linear');

fTlwm = cp2tform(input_points_corr,base_points,'lwm');

(5) 变换图像。

% Transform the unregistered image to bring it into alignment.

title('image registration polynomial method');

subplot(2,2,1);

imshow(base);

title('Base image');

subplot(2,2,2);

imshow(input);

title('Input image');

subplot(2,2,3);

imshow(imtransform(input,Tpolynomial2));

title('registered image');

subplot(2,2,4);

imshow(imtransform(input,fTpolynomial2));

title('registered image(fine-tune points)');

 

小结:

(1) 选择适当的方法来建立转换参数,并非算法越复杂越好,应参考成像因素(退化因素)。

(2) 利用cpselect选择匹配点,cpselect可以返回一个GUI句柄。在使用中,应当尽量选择恰当的匹配区域,这样能够得到较好的效果。

上面的这个例子典型地说明了图像配准的步骤:提取图像特征,根据特征对进行几何变换,执行整个变换。

相关文章:

微软发布Visual Studio 2017 15.8

2019独角兽企业重金招聘Python工程师标准>>> 对于C#/VB/C项目,在Git分支检出和分支切换操作后不再需要重新加载解决方案,这加快了操作的完成。15.8支持新推出的F# 4.5,这无疑将会受到F#开发人员的欢迎。此外,用于F#项目…

推荐系统产品与算法概述 | 深度

作者丨gongyouliu转载自大数据与人工智能(ID:gh_b8b5b02c348b)作者在《推荐系统的工程实现》(点击蓝字可回顾)这篇文章的第五部分“推荐系统范式”中讲到工业级推荐系统有非个性化范式、完全个性化范式、群组个性化范式、标的物关…

【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...

本篇主要介绍Cocos2dx项目开发过程中或者说项目务必遇到的一些知识点(ps.貌似Himi博客写的都是务必的 :tx: Himi认为写别人没写的才更容易吸引人不是~) OK,不多说废话,第一个介绍的是修改项目配置让你的Android项目支…

matlab图像处理命令(一)

转自:http://blog.csdn.net/langyuewu/archive/2009/05/02/4144120.aspx(非原处) 1.applylut 功能: 在二进制图像中利用lookup表进行边沿操作. 语法: A applylut(BW,lut) 举例 lut makelut(sum(x(:)) 4,2); BW1 imread(text.tif); BW2 applylut(BW1,lut); imsh…

MYSQL 查询数据排序数据和分组数据

在mysql查询过程中,可以对数据进行过滤,也可以对数据进行排序,可以对数据分组,下面分别讲述排序数据和分组数据例子。1,数据的排序 使用 ORDER BYselect * from where id10 order by id (正序,倒序)正序 AS…

Oracle RAC系列之:利用srvctl管理RAC数据库

srvctl即Server Control,是Oracle提供的一个命令行工具,用以用于管理Oracle的RAC环境。srvctl在Oracle 9i中被引入,Oracle10g、11g对其功能进行了很大的增强和改进。下面介绍下此命令的简单用法。 一、 查看实例状态(srvctl statu…

matlab图像处理命令(二)

转自:http://blog.163.com/crazyzcs126/blog/static/1297420502010229104452729/ (非原处) 图像增强 1. 直方图均衡化的 Matlab 实现 1.1 imhist 函数 功能:计算和显示图像的色彩直方图 格式:imhist(I,n) imhist(X,map) 说明&#x…

10万人的1000万张图像,微软悄然删除最大公开人脸数据集

作者 | 神经小姐姐转载自HyperAI超神经(ID:HyperAI)前几日,微软静悄悄地删除了一个公开的名人图片数据集。这个本为世界上最大的公开人脸识别数据集,现在已经不能通过微软的渠道访问。这个数据集包含了 10 万张名人面部…

密码学原理学习笔记

攻击的类型: 唯密文攻击(COA):攻击者只知道密文 已知明文攻击(KPA):攻击者知道同一密钥下密文对应的明文。 选择明文攻击(CPA):攻击者可以事先任意选择一定数量的明文,让被攻击的加密算法加密,并得到相应的密文。 选择…

终于申请博客了

今天终于下定决心在51CTO博客安家了。以后要坚持不断的写博客。以此来督促自己不断的学习和总结。把自己所掌握的技术和过往经验总结出来。转载于:https://blog.51cto.com/weijishui/971044

一种二维条码图像处理流程

目前,二维条码主要分两类: (1)、堆叠式二维条码:PDF417、Code 49; (2)、矩阵式二维条码:QR Code、Maxicode、Data Matrix。 本条码类似于Maxicode,处理过程大致为: (1)、图像灰度化&#xff…

vue中 静态文件引用注意事项

(一)assets文件夹与static文件夹的区别区别一:assets文件是src下的,所以最后运行时需要进行打包,而static文件不需要打包就直接放在最终的文件中了区别二:assets中的文件在vue中的template/style下用../这种…

百度AI快车道—企业深度学习实战营,推荐系统主题专场即将开课

身处信息过载的时代,在各大门户网站上,每天会有十万左右的新闻报道产出,京东淘宝等购物平台每小时就有上百万的商品上架出售,在B站、优酷、爱奇艺、搜狐等视频网站上每秒就有几百个小时的视频上线。所有人都正在经历一场信息变革。…

SIFT特征提取算法总结

转自:http://www.jellon.cn/index.php/archives/374 一、综述 Scale-invariant feature transform(简称SIFT)是一种图像特征提取与匹配算法。SIFT算法由David.G.Lowe于1999年提出,2004年完善总结,后来Y.Ke(2004)将其描述子部分用PCA代替直方…

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构,MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型,我们可以从中获取很多有关网站架构方面的知识,看了之后你会发现你原来的想法很可能…

商汤科技举办病理、放疗两大MICCAI国际挑战赛,推动AI医疗落地

近日,商汤科技宣布将联合衡道病理、上海交通大学医学院附属瑞金医院、西京医院、上海市松江区中心医院举办MICCAI 2019消化道病理图像检测与分割国际挑战赛,联合医诺智能科技、浙江省肿瘤医院举办MICCAI 2019放疗规划自动结构勾画国际挑战赛,…

vue实战(1)——解决element-ui中upload组件使用多个时无法绑定对应的元素

解决element-ui中upload组件使用多个时无法绑定对应的元素 以前写的项目关于图片上传的都是单张或几张图片上传(主要是基于vue的element),图片路径都是固定写的,所以遇见过列表中多个上传图片的问题,先看下常用的形式 …

MVVM开发模式MVVM Light Toolkit中使用事件和参数传递

Light中定义了类GalaSoft.MvvmLight.Command.RelayCommand这个类继承了ICommand方法,实现了其中的方法,Action就是一个方法参数// 摘要: // A command whose sole purpose is to relay its functionality to other objects // by invoki…

harris角点检测与ncc匹配

转自:http://zixuanjinan.blog.163.com/blog/static/11543032620097510122831/ file1:-------------------------------------------------------------------------------------- function [y1,y2,r,c]harris(X)% 角点的检测,利用harris 算法% 输出的是…

CVPR 2019超全论文合集新鲜出炉!| 资源帖

整理 | 夕颜出品 | AI科技大本营(ID: rgznai100)实不相瞒,这是一个资源福利帖——CVPR 2019 接收论文超全合集!此前关于 CVPR 2019 论文和合集出过不少,但是这个可能是最全面最丰富的,链接奉上:…

ROS 用 roboware实现节点信息发送和接收

在ros下实现节点编程,实现一个节点发送消息,另一个节点接收。实现方式有多种,可以直接在命令窗口创建工作空间包以及节点,用catkin_make进行编译,添加.bash路径,然后执行rosrun package node_name 。这种…

javah生成JNI头文件

Administratoribm /cygdrive/z/workspace/com.example.hellojni.hellojni/src <---- 从此文件夹执行 javah *************** project root dir ******************* *** source dir *** javah -jni -classpath . com.example.hellojni.HelloJni*** package name *** ** c…

【码书】一本经典且内容全面算法书籍,学算法必备

之前推荐了好几本算法书&#xff0c;有《啊哈&#xff01;算法》&#xff0c;有《算法图解》&#xff0c;有《漫画算法》&#xff0c;也有《我的第一本算法书》&#xff0c;很多粉丝不乐意了&#xff0c;觉得我推荐了这么多算法书籍&#xff0c;竟然没有经典算法书籍《算法导论…

Ubuntu16.04.1 安装Nginx

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证…

linux下jboss的安装配置

闲来无事突然间想到和tomcat相同的java容器jboss&#xff0c;就想测试一下jboss和tomcat性能的差异之处。但是之前只安装过tomcat&#xff0c;想来跟tomcat安装方式应该是相同的都需要jdk的支持。查找资料后进行了安装。一下是我安装jboss的一些步骤&#xff1a;Linux版本&…

RANSAC鲁棒参数估计

转自&#xff1a;http://blog.csdn.net/zhanglei8893/archive/2010/01/23/5249470.aspx RANSAC 是"RANdom SAmple Consensus"的缩写。该算法是用于从一组观测数据中估计数学模型参数的迭代方法&#xff0c;由Fischler and Bolles在1981 提出&#xff0c;它是一种非确…

AlphaGo之父DeepMind再出神作,PrediNet原理详解

作者 | beyondma转载自CSDN博客近期&#xff0c;DeepMind发表论文&#xff0c;称受Marta Garnelo和 Murray Shanahan的论文“Reconciling deep learning with symbolic artificial intelligence: representing objects and relations”启发&#xff0c;他们提出了一种新的架构…

php中file_get_contents如何读取大容量文件

php中file_get_contents如何读取大容量文件 一、总结 一句话总结&#xff1a;使用file_get_contents()进行分段读取&#xff0c;file_get_contents()函数可以分段读取 1、读取大文件是&#xff0c;file_get_contents()函数为什么会发生错误&#xff1f; 发生内存溢出而打开错误…

Vmware虚拟机的复制后无法使用的问题和解决

为什么80%的码农都做不了架构师&#xff1f;>>> 我在自己的机器上用Vmware安装的Ubuntu 12.04系统&#xff0c;并在里面部署了Openstack的开发环境&#xff0c;部署的过程有些复杂&#xff0c;不希望再次重复这个过程&#xff0c;于是就复制整个的虚拟机文件到其他…

Facebook频谱图模型生成比尔·盖茨声音,性能完胜WaveNet、MAESTRO

作者 | James Vincent 等编译 | 夕颜、Monanfei出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;计算机生成语音领域&#xff0c;正在酝酿着和一场革命。Facebook 工程师们设计创建的机器学习模型 MelNet 就是一个启示。下面这段听起来怪异的话像极了比尔盖茨是吧&…