基于互信息的图像配准.doc
《基于互信息的图像配准.doc》由会员分享,可在线阅读,更多相关《基于互信息的图像配准.doc(17页珍藏版)》请在冰点文库上搜索。
信息论大作业
基于互信息的图像配准
班级:
09030901
学号:
2009302311
姓名:
益琛
同组成员:
陈升富黎照
1.引言
随着医学、计算机技术及生物工程技术的发展,医学影像学为临床诊断提供了多种模态的医学图像,不同的医学图像提供了相关脏器的不同信息:
CT(ComputedTomography,电子计算机X射线断层扫描)和MRI(Magneticresonanceimaging,核磁共振成像)以较高的空间分辨率提供了脏器的解剖结构信息。
在实际临床应用中,单一模态的图像往往不能提供医生所需要的足够的信息,通常需要将不同模态的图像融合在一起,得到更丰富的信息,以便了解病变组织或器官的综合信息,从而做出准确的诊断或制订出合适的治疗方案。
而图像配准是图像融合的重要前提,图像配准是指对一幅图像进行一定的几何变换而映射到另一幅图像中,使得两幅图像中的相关点达到空间上的一致。
图像配准主要有两大类方法,基于灰度的方法和基于特征的方法。
基于灰度的配准方法直接利用图像的灰度数据进行配准,从而避免了因分割而带来的误差,因而具有精度较高、鲁棒性强、不需要预处理而能实现自动配准的特点。
在基于灰度的配准方法中,基于互信息的方法包括互信息和归一化互信息方法,它们已经被广泛使用并具有最高的精度。
本文使用的是基于互信息的配准方法。
2.图像配准技术
2.1图像配准技术的数学定义数字图像可以用一个二维矩阵来表示,如果用、分别表示待配准图像和参考图像在点(x,y)处的灰度值,那么图像、的配准关系可表示为:
(1)
其中f代表二维的空间几何变换函数;g表示一维的灰度变换函数。
配准的主要任务是寻找最佳的空间变换关系f与灰度变换关系g,使两幅图像实现最佳对准。
其中,空间几何变换是灰度变换的前提,是实现精准配准的关键环节。
2.2几何变换
空间变换主要解决图像平面上像素的重新定位问题,式
(1)中的空间几何变换函数f可用空间变换模型进行描述,常用的空间变换模型有刚体变换、仿射变换、投影变换和非线性变换。
刚体变换使得一幅图像中任意两点间的距离变换到另一幅图像中后仍然保持不变;仿射变换使得一幅图像中的直线经过变换后仍保持直线,并且平行线仍保持平行;投影变换是从三维图像到二维平面的投影;非线性变换把一条直线变换为一条曲线,一般用代数多项式来表示。
仿射变换是最常用的一种空间变换形式,可以实现图像的平移、旋转、按比例缩放等操作,我们在实验中使用的是此变换模型。
仿射变换可以用矩阵形式表示:
当分别取值为、、将依次对图像进行平移、旋转、按比例缩放操作。
2.3插值技术
浮动图的像素点经过空间变换后,参考图中对应点的坐标一般来说不是整数,必须通过插值方法计算该点的灰度值。
常用的插值算法有最近邻插值算法、双线性插值算法和部分体积插值算法。
为了尽可能避免基于互信息配准的局部最优问题,本文采用改进PV插值算法。
PV插值法是一种专门针对两幅图像的联合直方图的更新而设计的插值技术,它并不是真正意义上的插值方法,因为通过此方法并不能计算出反向变换点的灰度值。
PV插值法的计算过程如图1.图中的(x)为反向变换得到的一个浮点数点,其四个最近邻像素点分别为。
设参考图像为r(x),浮动图像为f(x),则它们的联合图方图函数如下。
i=1,2,3,4
1-dx
dx
dy
1-dy
2.4优化算法
2.4.1常用的优化算法有:
牛顿法、最速下降法、模拟退火法、遗传算法、单纯形法、模式搜索法、Powell法等搜索算法。
Powell法不需要对目标函数进行求导计算,具有收敛速度快、精度高、可靠性好等优点,是目前解无约束最优化问题十分有效的直接法,应用相当广泛,所以我们在实验中采用该算法。
Powell算法实现如下:
(1)给定允许误差,初始点和n个线性无关的方向,置k=1.
(2)置,,从出发,依次沿方向进行一维搜索,得到点。
再从出发,沿方向作一维搜索点,得到点。
(3)若,则停止搜索,得到点;否则,置
返回步骤
(2).
2.4.2Powell算法中的一维搜索算法——brent方法。
Brent法思路:
开始时利用黄金分割法确定一个较小的包含极小点的不确定区间,然后利用抛物线法获得一个极小点,若此极小点落在此不确定区间,则利用该极小点继续进行二次插值;否则放弃该点,改用黄金分割法搜索。
算法中密切关注a,b,u,v,w,x这六个点,其中a,b表示包含极小点的不确定区间;u表示最新搜索到的极小点;w表示上一次搜索到的极小点;v表示上一次的w值;x表示当前已搜到的最佳极小点。
算法实现步骤如下(设目标函数为f(x)):
(1)给定初始区间,精度要求,黄金分割系数
(2)计算,置;计算,置;置上一次迭代步长。
(3)计算当前区间中点,若,则停止搜索,的极小值,否则转(4)。
(4)令,若,则采用黄金分割法,转(8)。
(5)若,则采用黄金分割法,转(8)。
(6)过三点构造抛物线函数,计算
(7)若在之外,则用黄金分割法重新求极小点,转步骤(8);若u相对于的改变量大于上一次的改变量,则转步骤(8);若或,则用代替前面的改变量。
(8)按黄金分割法确定点,且u在区间和中长度较大的一个;若u相对于x的改变量小于,则用代替前面的改变量。
(9)计算,按照各自的定义更新。
置,转步骤(3)。
3基于互信息的图像配准方法
3.1互信息的计算
互信息是信息理论中的一个基本概念,通常用于描述两个系统间的统计相关性,或者是一个系统中所包含的另一个系统中信息的多少,它可以用熵来描述:
(2)
其中,和分别是系统A和B的熵,是它们的联合熵,依次定义如下:
(3)
(4)
(5)
其中和分别是系统A和B完全独立时的的概率分布。
是系统A和B的联合概率分布。
令图像A和B的互信息为,将式(3),(4),(5),分别代入式
(2),即可得到图像互信息的计算公式:
3.2配准方法
首先根据两幅图像的基本情况预设一个初始参数,其中为裁剪
旋转角的图像2行的第一个索引。
为裁剪旋转角的图像2列的第一个索引,为旋转的角度,为比例因子。
然后按照给定的初始参数对图像2进行变换,并计算图像1和图像2的互信息,然后利用最优化
工具箱中的fminsearch函数在附近寻找使图像1和图像2互信息最大的
点,直至搜索到满足精度要求的参数;最后输出配准参数。
4.图像配准的实现
4.1配准流程
首先对参考图像和浮动图像按照给定的初始点使用PV插值法统计联合直方图并计算互信息值;然后利用POWELL算法依据最大互信息理论判断所得参数是否最优,若不是,则继续搜索较优参数,在搜索时会不断重复“空间几何变换(affine)-统计联合直方图(PV插值法)-计算互信息值-最优化判断”的过程,直至搜索到满足精度要求的参数;最后输出配准参数。
输入参考图像
输入浮动图像
设置初始点和初始搜素方向
空间几何变换
计算互信息值
最优化
否
是
输出配准参数
4.2.所用到的M文件及其源代码
4.2.1.ImageRegistration.m
functionvarargout=ImageRegistration(varargin)
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',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
addpath(pwd);
functionImageRegistration_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
guidata(hObject,handles);
functionvarargout=ImageRegistration_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionpushbutton1_Callback(hObject,eventdata,handles)
globalI;
%%%调用OpenImage.m读入参考图像并获取文件名、图像大小%%%
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.bmp'},'Ñ¡ÔñͼƬ');
str=[pathnamefilename];
I=imread(str);
axes(handles.axes1);
imshow(I);
handles.data=I;
guidata(hObject,handles);
figure
(1);
imshow(handles.data);
functionpushbutton3_Callback(hObject,eventdata,handles)
handles.Old_I=handles.data;
handles.Old_J=handles.data2;
[I,J]=GLPF(handles);
handles.data=I;
handles.data2=J;
guidata(hObject,handles);
tic
RegistrationParameters=Powell(handles);
toc
ElapsedTime=toc;
handles.RegistrationParameters=RegistrationParameters;
y=RegistrationParameters
(1);
x=RegistrationParameters
(2);
ang=RegistrationParameters(3);
MI_Value=RegistrationParameters(4);
RegistrationResult=sprintf('X,Y,Angle=[%.5f][%.5f][%.5f]',x,y,ang);
MI_Value=sprintf('MI_Value=[%.4f]',MI_Value);
ElapsedTime=sprintf('ElapsedTime=[%.3f]',ElapsedTime);
axes(handles.axes3)
[RegistrationImage]=Register(handles);
imshow(RegistrationImage)
set(handles.text1,'string',RegistrationResult);
set(handles.text2,'string',MI_Value);
set(handles.text3,'string',ElapsedTime);
functionpushbutton2_Callback(hObject,eventdata,handles)
globalJ;
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.bmp'},'Ñ¡ÔñͼƬ');
str=[pathnamefilename];
J=imread(str);
axes(handles.axes2);
imshow(J);
handles.data2=J;
guidata(hObject,handles);
figure
(2);
imshow(handles.data2);
4.2.2Powell.m
function[RegistrationParameters]=Powell(handles)
e=0.1;
X0=[000];
D=[100;010;001];
num=0;
while(num<200)
num=num+1;
d1=D(1,:
);%d1Ϊ¾ØÕóDµÄµÚÒ»ÐУ¬³õʼËÑË÷·½Ïò
[X1,fX1]=OneDimSearch(X0,d1,handles);
d2=D(2,:
);%d2Ϊ¾ØÕóDµÄµÚ¶þÐУ¬³õʼËÑË÷·½Ïò
[X2,fX2]=OneDimSearch(X1,d2,handles);
d3=D(3,:
);%d3Ϊ¾ØÕóDµÄµÚÈýÐУ¬³õʼËÑË÷·½Ïò£¬ÈýάËÑË÷¹ÊÓÐÈý¸ö·½Ïò
[X3,fX3]=OneDimSearch(X2,d3,handles);
fX0=PV(X0
(1),X0
(2),-X0(3),handles);
Diff=[fX1-fX0fX2-fX1fX3-fX2];
[maxDiff,m]=max(Diff);%maxº¯ÊýµÄÓ÷¨£¬·µ»ØmaxdiffΪÏòÁ¿DiffµÄ×î´óÔªËØ£¬mΪ×î´óÔªËصÄÐòºÅ
d4=X3-X0;
temp1=X3-X0;
Conditon1=sum(temp1.*temp1);
ifConditon1<=e
break
end
[X4,fX4,landa]=OneDimSearch(X0,d4,handles);
X0=X4;
temp2=X4-X3;
Conditon2=sum(temp2.*temp2);
ifConditon2<=e
X3=X4;
break
end
temp3=sqrt((fX4-fX0)/(maxDiff+eps));
if(abs(landa)>temp3)
D(4,:
)=d4;
fori=m:
3
D(i,:
)=D(i+1,:
);
end
end
end
RegistrationParameters
(1)=-X3
(1);
RegistrationParameters
(2)=-X3
(2);
RegistrationParameters(3)=-X3(3);
RegistrationParameters(4)=fX3;
function[Y,fY,landa]=OneDimSearch(X,direction,handles)
%һάËÑË÷²ÉÓÃbrent·½·¨
a=-5;b=5;
Epsilon=0.0001;
cgold=0.381966;
IterTimes=200;
ifa>b
temp=a;
a=b;
b=temp;
end
v=a+cgold*(b-a);
w=v;
x=v;
e=0.0;
fx=Fx(x,X,direction);
fv=fx;
fw=fx;
foriter=1:
IterTimes
xm=0.5*(a+b);
ifabs(x-xm)<=Epsilon*2-0.5*(b-a)
break
end
ifabs(e)>Epsilon
r=(x-w)*(fx-fv);
q=(x-v)*(fx-fw);
p=(x-v)*(q-(x-w)*r;
q=2*(q-r);
ifq>0
p=-p;
end
q=abs(q);
etemp=e;
e=d;
ifnot
(abs(p)>=abs(0.5*q*etemp)||p<=q*(a-x)||p>=q*(b-x))
d=p/q;
u=x+d;
ifu-ad=MySign(Epsilon,xm-x);
end
else
ifx>=xm
e=a-x;
else
e=b-x;
end
d=cgold*e;
end
else
ifx>=xm;
e=a-x;
else
e=b-x;
end
d=cgold*e;
end
ifabs(d)>=Epsilon
u=x+d;
else
u=x+MySign(Epsilon,d);
end
fu=Fx(u,X,direction);
iffu<=fx
ifu>=x
a=x;
else
b=x;
end
v=w;
fv=fw;
w=x;
fw=fx;
x=u;
fx=fu;
else
ifua=u;
else
b=u;
end
iffu<=fw||w==x
v=w;
fv=fw;
w=u;
fw=fu;
else
iffu<=fv||v==x||v==w
v=u;
fv=fu;
end
end
end
end
landa=x;
Y=X+x*direction;
fY=Fx(x,X,direction);
function[mySign]=MySign(a,b)
ifb>0
Result=abs(a);
else
Resulr=abs(a);
end
mySign=Result;
function[fx]=Fx(x,X,direction,handles)
fx=-PV(X
(1)+direction
(1)*x,X
(2)+direction
(2)*x,-(X(3)+direction(3)*x),handles);
4.2.3PV.m
function[mi]=PV(x,y,ang,handles)
a=handles.data;
a=double(a);
b=handles.data2;
b=double(b);
[M,N]=size(a);
hab=zeros(256,256);
ha=zeros(1,256);
hb=zeros(1,256);
ifmax(max(a))~=min(min(a))
a=(a-min(min(a)))/(max(max(a))-min(min(a)));
else
a=zeros(M,N);
end
ifmax(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;
[width,height]=size(b);
u=(width-1)/2;
v=(height-1)/2;
rad=pi/180*ang;
t1=[100;010;xy1];
t2=[100;010;-u-v1];
t3=[cos(rad)-sin(rad)0;sin(rad)cos(rad)0;001];
t4=[100;010;uv1];
T=t2*t3*t4*t1;
tform=maketform('affine',T);
coordinate_x=zeros(width,height);
coordinate_y=zeros(width,height);
fori=1:
width
forj=1:
height
coordinate_x(i,j)=i;
end
end
fori=1:
width
forj=1:
height
coordinate_y(i,j)=j;
end
end
[wz]=tforminv(tform,coordinate_x,coordinate_y);
fori=1:
width
forj=1:
height
source_x=w(i,j);
s