zxhproj v 2.2
zxhproj

zxhOptimizerGradient.h

00001 
00002 /*=========================================================================
00003 
00004   Program:   ZXH Registration Software
00005   Author:    Xiahai Zhuang
00006   Module:    $RCSfle: zxhOptimizerBase.h    $
00007   Language:  C++
00008   Date:      $Date: From  2004-01 $
00009   Version:   $Revision: 1.0, 2.0 $
00010 
00011 =========================================================================*/
00012 
00013 #ifndef zxhOptimizerGradient_h
00014 #define zxhOptimizerGradient_h
00015 
00016 #define SetGradient2Transform(GradientObject,TransformObject) \
00017     { \
00018     if( zxh::IsAffTransform( TransformObject ) ) \
00019         GradientObject = (zxhTransformAffine*) TransformObject ; \
00020     else if ( zxh::IsFFDTransform( TransformObject ) ) \
00021         GradientObject = (zxhTransformFFD*) TransformObject ; \
00022     else if ( strcmp(TransformObject->GetTransformType().c_str(),"MRG") == 0 ) \
00023         GradientObject = (zxhGradientMultiRigid*) TransformObject ; \
00024     else if ( strcmp(TransformObject->GetTransformType().c_str(),"FLD") == 0 ) \
00025         GradientObject = (zxhTransformFieldGradient*) TransformObject ; \
00026     }
00027 #define SetTransform2Gradient(TransformObject,GradientObject,TransformType) \
00028     { \
00029     if( zxh::IsAffTransform( TransformType ) ) \
00030         TransformObject = (zxhTransformAffine*) GradientObject ; \
00031     else if ( zxh::IsFFDTransform( TransformType ) ) \
00032         TransformObject = (zxhTransformFFD*) GradientObject ; \
00033     else if ( strcmp( TransformType->GetTransformType().c_str(),"MRG")==0 ) \
00034         TransformObject = (zxhGradientMultiRigid*) GradientObject ; \
00035     else if ( strcmp( TransformType->GetTransformType().c_str(),"FLD")==0 ) \
00036         TransformObject = (zxhTransformFieldGradient*) GradientObject ; \
00037     }
00038 #include "zxhOptimizerBase.h"
00039 #include "zxhGradientBase.h"
00040 #include "zxhTransformFFDBase.h"
00041 #include "zxhTransformFields.h"
00042 #include "zxhGradientMultiRigid.h"
00043 #include "zxhTransformFieldGradient.h"
00044 
00052 
00053 class zxhOptimizerGradient : public zxhOptimizerBase
00054 {
00055 public:
00057     zxhOptimizerGradient(void);
00059     ~zxhOptimizerGradient(void);
00060 
00062     virtual void    SetTransform(zxhTransformBase*p);
00064     virtual void    SetGradientClassUsingObjectType(zxhTransformBase*pClassObject);
00065 
00066 
00068     virtual std::string GetPrintString();
00070     virtual bool        SetOptimizerFromStream(std::ifstream & ifs);
00071 
00073     virtual zxhOptimizerBase*   Clone(zxhOptimizerBase* &pRet);
00074 
00076     virtual void    SetRegularRate(float f)         {m_fRegularRate=f;}
00078     virtual float   GetRegularRate(void)            {return m_fRegularRate;};
00080     virtual void    SetSearchLength(float f)        {m_fSearchLength=f;}
00082     virtual float   GetSearchLength(void)           {return m_fSearchLength;}
00084     virtual void    SetRegularMinStepLength(float f){m_fRegularMinStepLength=f;};
00086     virtual float   GetRegularMinStepLength(void)   {return m_fRegularMinStepLength;}
00088     virtual void    SetRegriddingPortion(float f)       {m_fRegriddingPortion=f;};
00090     virtual float   GetRegriddingPortion(void)          {return m_fRegriddingPortion;};
00091 
00093     virtual void Run();
00095     virtual float AdvanceAlongGradient(zxhTransformBase*pGradientInfCur) ;
00099     virtual void SetSearchOptimalAlongGradient( int i )                     { m_iSearchOptimalAlongGradient = i ; } ;
00103     virtual int  GetSearchOptimalAlongGradient( )                           { return m_iSearchOptimalAlongGradient; } ;
00105     virtual void SetMaxLineSearchStep(int n)                                {m_nMaxLineSearchStep=n;};
00107     virtual int  GetMaxLineSearchStep()                                     {return m_nMaxLineSearchStep;};
00112     virtual bool AdjustParameters( bool forceconcatenation = false ) ;
00114     virtual bool ConcatenateTransforms() ;
00116     virtual bool ConcatenateFinalTransforms() { return ConcatenateTransforms();};
00118     virtual bool ConcatenateTransformsNUpdate();
00119 
00120 protected:
00122     zxhGradientBase     *m_pGradient;
00123 
00125     float               m_fRegularRate;
00126 
00128     float               m_fSearchLength;
00129 
00131     float               m_fRegularMinStepLength;
00132 
00134     float               m_fRegriddingPortion;
00138     int                 m_iSearchOptimalAlongGradient ;
00140     int                 m_nMaxLineSearchStep ;
00141 
00143     virtual float   ComputeAndUpdateConjugateDirection( zxhTransformBase*gk_1,zxhTransformBase*gk,zxhTransformBase*dk_1,zxhTransformBase*dk ) ;
00144 
00145 
00146 private:
00149     void    ConcatenateTransformsSetConcatenatedFieldForDim2Reg( zxhTransformFields* field )
00150     {
00151         if( m_pStructRegistration->m_iRegistrationDimension==2 && field->GetDimension() >= 3 )
00152         {
00153             zxhImageDataT<float> *pField = field->GetTransformFieldImages() ;
00154             const int *size = pField[0].GetImageSize();
00155             for( int it=0; it<size[3]; ++it )
00156             for( int iz=0; iz<size[2]; ++iz )
00157             for( int iy=0; iy<size[1]; ++iy )
00158             for( int ix=0; ix<size[0]; ++ix )
00159             {
00160                 pField[0].SetPixelByGreyscale( ix,iy,iz,it, pField[0].GetPixelGreyscale(ix,iy,0,0) ) ;
00161                 pField[1].SetPixelByGreyscale( ix,iy,iz,it, pField[1].GetPixelGreyscale(ix,iy,0,0) ) ;
00162                 pField[2].SetPixelByGreyscale( ix,iy,iz,it, 0 ) ;
00163             }
00164             /*int * size = p->GetCtrGridSize() ;
00165             int nonzero=-1 ;
00166             for(int iz=0; iz<size[2]; ++iz )
00167             {
00168                 for( int iy=0; iy<size[1]; ++iy )
00169                 for( int ix=0; ix<size[0]; ++ix )
00170                 {
00171                     if( p->GetCtrPntsWithoutCheck(ix,iy,iz,0)[0]!=0 || p->GetCtrPntsWithoutCheck(ix,iy,iz,0)[1]!=0 )
00172                         nonzero=iz ;
00173                     p->GetCtrPntsWithoutCheck(ix,iy,iz,0)[2]=0;
00174                 }
00175                 if( nonzero != -1 )
00176                     break;
00177             }
00178             if (nonzero == -1 ) return ;
00179             for( int iz=0; iz<size[2]; ++iz )
00180             for( int iy=0; iy<size[1]; ++iy )
00181             for( int ix=0; ix<size[0]; ++ix )
00182             {
00183                 p->GetCtrPntsWithoutCheck(ix,iy,iz,0)[0]=p->GetCtrPntsWithoutCheck(ix,iy,nonzero,0)[0];
00184                 p->GetCtrPntsWithoutCheck(ix,iy,iz,0)[1]=p->GetCtrPntsWithoutCheck(ix,iy,nonzero,0)[1];
00185                 p->GetCtrPntsWithoutCheck(ix,iy,iz,0)[2]=0;
00186             }*/
00187         }
00188     }
00189 };
00190 #endif
00191 
00192 
 All Classes Namespaces Functions Variables Typedefs