zxhproj v 2.2
zxhproj
|
00001 00002 /*========================================================================= 00003 00004 Program: ZXH Registration Software 00005 Author: Xiahai Zhuang 00006 Module: $RCSfle: zxhTransformBase.h $ 00007 Language: C++ 00008 Date: $Date: From 2004-01 $ 00009 Version: $Revision: 1.0, 2.0 $ 00010 00011 =========================================================================*/ 00012 00013 #ifndef zxhTransformBase_H 00014 #define zxhTransformBase_H 00015 00016 //#include "zxhMetricBase.h" 00017 #include "zxhImageData.h" 00018 #include <string.h> 00019 #include <stdio.h> 00020 00021 //class zxhTransformGradientBase 00022 //{ 00023 //public: 00024 // /// construction 00025 // zxhTransformGradientBase(){}; 00026 // /// deconstruct 00027 // virtual ~zxhTransformGradientBase(){}; 00028 //}; 00029 00052 00053 class zxhTransformBase //: public zxhTransformGradientBase 00054 { 00055 public: 00057 zxhTransformBase(); 00059 virtual ~zxhTransformBase(); 00060 00062 virtual bool SetImage(zxhImageData*pTest,zxhImageData*pRef); 00063 00065 virtual zxhImageData* GetTestImage() {return m_pImageTest;}; 00067 virtual zxhImageData* GetRefImage() {return m_pImageRef;}; 00068 00070 virtual int GetDimension() {return m_iDimension;}; 00071 00073 virtual bool SetDimension(int i) {m_iDimension=i;return true;}; 00074 00076 virtual std::string GetTransformType(){return "TFM";};//AFF,FFD,FFDMI,FLD 00077 00079 virtual zxhTransformBase* Clone(zxhTransformBase*&pRet); 00080 00081 // abtract function 00082 00088 virtual bool TransformPointTo(float fVectorFrom[ImageDimensionMax],float fVectorTo[ImageDimensionMax]) 00089 { 00090 this->TransformPointToWorld(fVectorFrom,fVectorTo); 00091 this->AdjustWorldToRefImage(fVectorTo); 00092 if( m_pImageRef ) return ! m_pImageRef->InsideImage( fVectorTo ); 00093 return false ; 00094 }; 00096 virtual void TransformPointToWorld(float fVectorFrom[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]) 00097 { 00098 float fv[]={fVectorFrom[0],fVectorFrom[1],fVectorFrom[2],fVectorFrom[3]}; 00099 this->AdjustTestImageToWorld(fv); 00100 this->TransformWorldToWorld( fv, fVectorToWorld ); 00101 }; 00103 virtual void TransformWorldToWorld(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax])=0; 00104 00106 virtual void InverseTransformWorld( float fVectorToWorld[ImageDimensionMax],float fVectorFromWorld[ImageDimensionMax]) 00107 {std::cerr<<"error: inverse transform world has not be implemented.\n" ; return ;}; 00108 00110 //virtual bool GetJacobianMatrix(float fVector[ImageDimensionMax],float* xJacobian[ImageDimensionMax]){return false;}; 00112 virtual bool GetJacobianMatrix(float fVector[ImageDimensionMax],float pJacobian[ImageDimensionMax*ImageDimensionMax]); 00114 virtual bool GetJacobianMatrixWorld(float fWorld[ImageDimensionMax],float pJacobian[ImageDimensionMax*ImageDimensionMax]); 00115 00117 virtual void TransformIntensityGradientVectorTo( float fVectorFrom[ImageDimensionMax],float fVectorTo[ImageDimensionMax],float* fWorldFrom ) ; 00118 00120 virtual void InverseTransformIntensityGradientVector( float fVectorRef[ImageDimensionMax],float fInverseVectorTest[ImageDimensionMax],float* fWorldTest ) ; 00121 00122 00124 virtual bool SetTransformPara(float); 00126 virtual bool GetAdd(zxhTransformBase*,zxhTransformBase*); 00128 virtual bool Add(zxhTransformBase*); 00130 virtual bool GetSubtract(zxhTransformBase*,zxhTransformBase*); 00132 virtual bool Subtract(zxhTransformBase*); 00134 virtual bool GetMultiply(zxhTransformBase*,float); 00136 virtual bool Multiply(float); 00138 virtual bool GetMultiplyByPara(zxhTransformBase*,zxhTransformBase*); 00140 virtual bool MultiplyByPara(zxhTransformBase*); 00141 00143 virtual float GetMagnitudeAsVector(); 00144 00145 00147 /* *** validate results on FFDs: 00148 /* 1) [X] using assume each control point has own support local regions to avoid turbulent changes--> reduce accuracy 00149 /* 2) [X] using a global maximal mag from all CPs for normalization, a big turbulent changes dominant the optimization length 00150 * --> reduce robustness in registration where large deformation fields are needed 00151 * ****************************************/ 00152 virtual float GetMaxLocalMagnitudeAndNormalisation( bool bNormalisationByLocalMagnitude ) 00153 { 00154 float fmag = GetMagnitudeAsVector(); 00155 if( fmag>0 ) this->Multiply(1/fmag) ; 00156 return fmag ; 00157 }; 00158 /*virtual void SetNormalisationByLocalMagnitude( bool b ) 00159 { m_bNormalisationByLocalMagnitude = b ; } 00160 virtual bool GetNormalisationByLocalMagnitude() 00161 { return m_bNormalisationByLocalMagnitude ; }*/ 00162 ; 00164 virtual float GetMaxAbsValueFromParameters() ; 00165 00167 virtual float GetPointMutiplyAsVector(zxhTransformBase*) ; 00168 00170 virtual bool SetTransformIdentity()=0; 00172 virtual bool SetTransformFromStream(std::ifstream & ifs); 00174 virtual bool SetTransformFromFile(const char* pFile); 00176 virtual std::string GetTransformFileName() { return m_strFileName ; } ; 00177 00180 virtual std::string GetPrintString(); 00181 00183 virtual bool SaveTransform2Disc( std::string sFileNameWithoutExt ) ; 00184 00187 virtual float Guarantee1To1(void) { return -1 ; }; 00189 virtual void SetGuarantee1To1Effected(bool b=true) {m_bEffect1to1 = b;}; 00191 virtual bool AdvanceStep(zxhTransformBase*p, float f=1) 00192 { zxhTransformBase *pf=0 ; p->Clone( pf ) ; pf->GetMultiply(p,f) ; 00193 bool b=this->Add(pf) ; delete pf ; return b ; 00194 }; 00195 00200 inline void AdjustTestImageToWorld(float afTest[]) 00201 { 00202 if(m_pImageTest) 00203 m_pImageTest->ImageToWorld(afTest) ; 00204 else 00205 { std::cerr<<"error: no set transform images to AdjustTestToworld\n" ; exit(1); }; 00206 } 00208 inline void AdjustWorldToRefImage(float afRef[]) 00209 { 00210 if(m_pImageRef) 00211 m_pImageRef->WorldToImage(afRef); 00212 else 00213 { std::cerr<<"error: no set transform images to AdjustToRefGrid\n" ; exit(1); } ; 00214 } ; 00215 00218 //virtual bool GetTransformationDerivativeByParameter(float g[4], int index, float Worldx[]); 00220 virtual int GetNoParameters()=0; 00222 virtual float GetParameters(int index)=0 ; 00226 virtual bool SetParameterValue( int index, float f ) = 0 ; 00228 virtual int GetDegreeOfFreedom () {return GetNoParameters() ; }; 00230 virtual int GetDOFWithValue( float f ) 00231 { 00232 int idof=0 , no=GetNoParameters(); 00233 for( int index=0; index<no; ++index ) 00234 if( GetParameters(index) >= f ) idof++ ; 00235 return idof ; 00236 }; 00238 virtual int GetActiveDof() { return GetDOFWithValue(ZXH_FloatPrecision) ;}; 00239 protected: 00241 const static unsigned int static_buffer_size_of_base=1024; 00242 00244 int m_iDimension; 00245 00247 bool m_bEffect1to1; 00248 00250 zxhImageData* m_pImageTest; 00252 zxhImageData* m_pImageRef; 00254 std::string m_strFileName ; 00255 00256 } ; 00257 00258 namespace zxh{ 00260 bool TransformWorld2WorldByCollection( zxhTransformBase*pListTransform[], int nTransform, 00261 int dimension,const float fWorldFrom[ImageDimensionMax],float fWorldTo[ImageDimensionMax]); 00262 00264 bool IsAffTransform(zxhTransformBase *pTrans); 00266 bool IsAffineMatrix(zxhTransformBase *pTrans); 00268 bool IsFFDTransform(zxhTransformBase*pTrans); 00270 bool IsFFDTransform(std::string type); 00272 enum ZXH_TransformType{TransformTypeRigid=0, TransformTypeScale=1, TransformTypeAffine=2, TransformTypeFFD=3, 00273 TransformTypeSkew=5, 00274 TransformTypeLocalAffine=10}; 00275 00276 } 00277 #endif //