gusucode.com > 基于互信息的图像配准matlab源码程序 > 基于互信息的图像配准matlab源码程序/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;  
 norm=X3-X0;
 Y=sum( norm.*norm );
 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);
              
              norm=X3-X0;
              Y=sum( norm.*norm );
       %%%%%%
  end
  OUT(1)=X3(2); 
  OUT(2)=X3(1); 
  OUT(3)=-X3(3); 
  OUT(4)=fX3;