![]() |
zxhproj v 2.2
zxhproj
|
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