zxhproj v 2.2
zxhproj

zxhTransformAffine.h

00001 
00002 /*=========================================================================
00003 
00004   Program:   ZXH Registration Software
00005   Author:    Xiahai Zhuang
00006   Module:    $RCSfle: zxhTransformAffine.h    $
00007   Language:  C++
00008   Date:      $Date: From  2004-01 $
00009   Version:   $Revision: 1.0, 2.0 $
00010 
00011   Update log: 8th April 2007 add skew angle xy yx yz zy zx xz for 3D transformation,
00012               2011-03-20 checked
00013                     Y = Mskew x {Mscale x Mrotate x (X-Center) + Translate + Center} = K x {S x R x (X-C) + L + C}
00014 
00015 =========================================================================*/
00016 
00017 #ifndef zxhTransformAffine_h
00018 #define zxhTransformAffine_h
00019 
00045 
00046 #include "zxhTransformBase.h"
00047 #include "zxhGradientBase.h"
00048 #include "zxhImageData.h"
00049 #include <string>
00050 
00051 class zxhTransformAffine : public zxhTransformBase, public zxhGradientBase
00052 {
00053     /*zxhushort     m_iDimension;
00054     zxhImageData*   m_pImageTest;
00055     zxhImageData*   m_pImageRef;*/
00056 public:
00058     zxhTransformAffine();
00060     virtual ~zxhTransformAffine();
00061 
00063     virtual bool    SetTransformFromFile(const char* pFile);
00065     virtual bool    SetTransformFromStream(std::ifstream& ifs);
00067     virtual bool    SetTransformIdentity();
00070     virtual bool    SetTransformAlignByCentre(int iCentre);
00072     virtual bool    SetTransformAlignByCentre(std::string sCentre)
00073     {
00074         if(strcmp(sCentre.c_str(),"centre")==0) return SetTransformAlignByCentre(2);
00075         if(strcmp(sCentre.c_str(),"gcentre")==0) return SetTransformAlignByCentre(3);
00076         return false;
00077     } 
00078 
00080     virtual std::string GetPrintString();
00081 
00083     virtual std::string GetTransformType(){return "AFF";}
00084 
00086     virtual zxhTransformBase*   Clone(zxhTransformBase*&pRet);
00087  
00089     float *     GetRotation()       {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetRotationValue\n";return m_afRotate;}
00091     float *     GetCenter()         {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetCenterValue\n";return m_afCenter;}
00093     float *     GetScaling()        {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetScalingValue\n";return m_afScaling;}
00095     float *     GetTranslation()    {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetTranslationValue\n";return m_afTranslate;}
00097     float *     GetSkewxy()         {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetSkewValue\n";return m_afSkewxy;};
00099     float *     GetSkewyz()         {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetSkewValue\n";return m_afSkewyz;};
00101     float *     GetSkewzx()         {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetSkewValue\n";return m_afSkewzx;};
00103     void    GetRotationValue( float rotation[ImageDimensionMax] );
00105     void    GetCenterValue( float center[ImageDimensionMax] );
00107     void    GetTranslationValue( float tranlsation[ImageDimensionMax] );
00109     void    GetScalingValue( float scaling[ImageDimensionMax] );
00111     void    GetSkewValue( float skewxy[2], float skewyz[2], float skewxz[2] );
00113     void        SetRotation(float afRotate[ImageDimensionMax]);
00115     void        SetCenter(float afCenter[ImageDimensionMax]);
00117     void        SetScaling(float afScaling[ImageDimensionMax]);
00119     void        SetTranslation(float afTranslate[ImageDimensionMax]);
00121     void        SetSkewxy(float afSkewxy[2]);
00123     void        SetSkewyz(float afSkewyz[2]);
00125     void        SetSkewzx(float afSkewzx[2]);
00126 
00128     virtual void    TransformWorldToWorld(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]);
00130     virtual void    InverseTransformWorld(float fVectorToWorld[ImageDimensionMax],float fVectorFromWorld[ImageDimensionMax]);
00131 
00133     virtual bool    GetJacobianMatrixWorld(float fWorld[ImageDimensionMax],float pJacobian[ImageDimensionMax*ImageDimensionMax]) ;
00135     virtual bool    GetJacobianMatrix(float fVector[ImageDimensionMax],float pJacobian[ImageDimensionMax*ImageDimensionMax])
00136     {return GetJacobianMatrixWorld(fVector, pJacobian);};
00138     virtual zxhTransformAffine & operator = (const zxhTransformAffine b);
00140     virtual bool    SetTransformPara(float f);
00142     virtual bool    GetAdd(zxhTransformBase*,zxhTransformBase*);
00144     virtual bool    Add(zxhTransformBase*) ;
00146     virtual bool    GetSubtract(zxhTransformBase*,zxhTransformBase*) ;
00148     virtual bool    Subtract(zxhTransformBase*) ;
00150     virtual bool    GetMultiply(zxhTransformBase*,float);
00152     virtual bool    Multiply(float) ;
00154     virtual bool    GetMultiplyByPara(zxhTransformBase*,zxhTransformBase*) ;
00156     virtual bool    MultiplyByPara(zxhTransformBase*) ;
00158     virtual bool    GetCompareByPara(zxhTransformBase*,float f=0) ;
00160     virtual bool    CompareByPara(float f=0) ;
00161 
00163     virtual float   GetMagnitudeAsVector(void); 
00165     virtual float   GetMaxAbsValueFromParameters(void) ;
00167     virtual float   GetPointMutiplyAsVector(zxhTransformBase*);
00168 
00171     virtual void    UpdateMatrix();
00173     virtual void    UpdateInvertMatrix();
00175     virtual int     GetNoParameters()       {return 22;};
00179     virtual bool    SetParameterValue( int index, float f ) ;
00181     virtual float GetParameters(int index) ;
00183     virtual int GetDegreeOfFreedom () ;
00185     virtual int GetDOFWithValue( float f ) ;
00187     virtual float   GetMaxLocalMagnitudeAndNormalisation( bool bNormalisationByLocalMagnitude);
00189     virtual bool    AdvanceStep(zxhTransformBase*p, float f=1)  ;
00191     virtual float * GetMatrixPointer()          { return &m_afMatrix[0][0] ; } ;
00193     virtual float * GetInvertMatrixPointer()    { return &m_afInvertMatrix[0][0]; };
00194 
00195 protected:
00196     //  m_bScalingFirst=true, then scaling,rotate by center,translate
00197     //bool      m_bScalingFirst;
00198 
00200     float   m_afRotate[ImageDimensionMax];
00202     float   m_afTranslate[ImageDimensionMax];
00204     float   m_afCenter[ImageDimensionMax];
00206     float   m_afScaling[ImageDimensionMax];
00210     float   m_afSkewxy[2];
00213     float   m_afSkewyz[2];
00216     float   m_afSkewzx[2];
00218     float   m_afMatrix[4][4];
00220     float   m_afInvertMatrix[4][4];
00221 
00222 
00224 
00225 public:
00229     virtual bool    ComputeMetricGradient
00230         (
00231         zxhMetricBase*pMetric,
00232         zxhTransformBase*pInfluence=0
00233         );
00241 
00242     virtual void    InitialGradientDifferentialStep(zxhTransformAffine*pGrad,
00243                 float TranslateScale, float RotateScale, float ScalingScale, float factor=1);
00245     virtual void    InitialGradientDifferentialStep(zxhTransformAffine*pGrad, 
00246                 float TranslateScale[], float RotateScale[], float ScalingScale[],
00247                 float SkewScale, float factor=1);
00248     /*
00249     virtual void    SetUnitGradientOptimisation( bool b = true )    { m_bUnitGradient = b ; } ;
00251     virtual bool    GetUnitGradientOptimisation()                   { return m_bUnitGradient ; } ;
00253     virtual float   GetEstimateSubjectSize()                            { return m_fEstimateSubjectSize;};
00255     virtual void    SetEstimateSubjectSize(float f)                 { m_fEstimateSubjectSize = f;};
00257     virtual float   GetMaxDisplacementOfSubject() ;
00260     //bool  m_bUnitGradient ;
00262     //float m_fEstimateSubjectSize ;*/
00263 };
00264 
00265 #endif
 All Classes Namespaces Functions Variables Typedefs