www.gusucode.com > 配准结果检验程序 gobad.m对图像进行“平移”和“旋转” > peizhun/POWELL.m
function [OUT]=POWELL(handles) F= handles.I; R= handles.J; % reference image len=10; %方向矢量矩阵存放d1,d2,d3三个方向矢量 D=[1 0 0; 0 1 0; 0 0 1]; %从起始点X0出发,沿方向d3进行搜索,得到最大值fZ,对应点为Z。 X0=[0 0 0]; d3=D(3,:); [Z,fZ,step]=oneDimSearch(R,F,X0,d3,len,handles); %从Z出发,沿方向d1进行搜索,得到最大值fX1,对应点为X1。 d1=D(1,:); [X1,fX1,step]=oneDimSearch(R,F,Z,d1,len,handles); %从X1出发,沿方向d2进行搜索,得到最大值fX2,对应点为X2。 d2=D(2,:); [X2,fX2,step]=oneDimSearch(R,F,X1,d2,len,handles); %从X2出发,沿方向d3进行搜索,得到最大值fX3,对应点为X3。 d3=D(3,:); [X3,fX3,step]=oneDimSearch(R,F,X2,d3,len,handles); Cha=[fZ-fX1 fX1-fX2 fX2-fX3]; [maxCha,j0]=max(Cha); e=9; FANSHU=X3-X0; Y=sum( FANSHU.*FANSHU ); aaa=0; while( Y>e ) aaa=aaa+1; % d为这一轮产生的新方向向量 d=X3-Z; %从点X3出发沿d进行一轮搜索,得到最大值fZ1,对应点Z1以及到达极值点的步长landa。 [Z1,fZ1,landa]=oneDimSearch(R,F,X3,d,len,handles); temp=sqrt( (fX3-fZ1)/maxCha ); %判断是否替换方向向量 if( abs(landa) <= temp ) %共轭性没有得到增强,不替换方向向量,重新进行搜索,不过X0换成Zk1,即起始点换成Zk1。 X0=Z1; else %共轭性得到增强,替换选定的方向向量d_j0。d_j0=d_j0+1,....,d_n=d。并用X3替换X0。然后从Zk1出发重新进行搜索 D(4,:)=d; for i=j0:3 D(i,:)=D(i+1,:); end X0=Z1; end %%%%%% %从起始点X0(已被Z1替代)出发,沿方向d3进行搜索,得到最大值fZ,对应点为Z。 d3=D(3,:); [Z,fZ,step]=oneDimSearch(R,F,X0,d3,len,handles); %从Z出发,沿方向d1进行搜索,得到最大值fX1,对应点为X1。 d1=D(1,:); [X1,fX1,step]=oneDimSearch(R,F,Z,d1,len,handles); %从X1出发,沿方向d2进行搜索,得到最大值fX2,对应点为X2。 d2=D(2,:); [X2,fX2,step]=oneDimSearch(R,F,X1,d2,len,handles); %从X2出发,沿方向d3进行搜索,得到最大值fX3,对应点为X3。 d3=D(3,:); [X3,fX3,step]=oneDimSearch(R,F,X2,d3,len,handles); Cha=[fZ-fX1 fX1-fX2 fX2-fX3]; [maxCha,j0]=max(Cha); FANSHU=X3-X0; Y=sum( FANSHU.*FANSHU ); %%%%%% end OUT(1)=X3(2); OUT(2)=X3(1); OUT(3)=-X3(3); OUT(4)=fX3;