zxhproj v 2.2
zxhproj

zxhTransformBase.h

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 //
 All Classes Namespaces Functions Variables Typedefs