zxhproj v 2.2
zxhproj

zxhMetricFFDBase.h

00001 
00002 /*=========================================================================
00003 
00004   Program:   ZXH Registration Software
00005   Author:    Xiahai Zhuang
00006   Module:    $RCSfle: zxhMetricFFDBase.h    $
00007   Language:  C++
00008   Date:      $Date: From  2004-01 $
00009   Version:   $Revision: 1.0, 2.0, 2.1 $
00010 
00011 =========================================================================*/
00012 
00013 #ifndef zxhMetricFFDBase_h
00014 #define zxhMetricFFDBase_h
00015 
00016 #include "zxhTransformFFDBase.h"
00017 #include "zxhMetricBase.h"
00018 #include "zxhImageModelingLinear.h"
00019 
00032 
00033 class zxhMetricFFDBase 
00034 {
00035 public:
00037     zxhMetricFFDBase(void);
00039     ~zxhMetricFFDBase(void);
00041     virtual zxhMetricFFDBase*Clone(zxhMetricFFDBase*&p);
00043     virtual std::string GetMetricType() {return "_FFD_"; } ;
00044 
00046     virtual zxhlfloat  GetBendingEnergy(zxhTransformFFDBase*pTrans) ;
00048     virtual bool ComputeCtrPntOnTargetForceForBendingEnergy(zxhTransformFFDBase*pTrans, zxhTransformFFDBase * gradient) ;
00049 
00051   
00056     virtual int GetValueByFFDGrid(zxhlfloat&fValue,int aiCtrPnt[ImageDimensionMax])=0;
00057     
00059     virtual int ComputeConstanceForFFDGradient()=0  ;
00060 
00064     virtual int GetDiffByFFDGrid( float * afPD, // output partial differentiation 
00065                                   zxhTransformFFDBase * pFFDGrid,   
00066                                   int * aiCtrPnt,
00067                                   zxhTransformFFDBase * pDifferential ) ;
00068     
00070     virtual int GetDiffByFFDGridOnFFDPhysicalVector( float * afPD, // output partial differentiation 
00071                                           zxhTransformFFDBase * pFFDGrid,
00072                                           int * aiCtrPnt,
00073                                           zxhTransformFFDBase * pDifferential,
00074                                           float * vector); 
00075 
00077     virtual int GetBendingEnergyDerivative( float * afPD, int * aiCtrPnt)
00078     {
00079         if( m_pCtrPntDerivativeBendingEnergyConst==0 ||
00080             m_pCtrPntDerivativeBendingEnergyConst->GetCtrPntsWithCheck(aiCtrPnt[0], aiCtrPnt[1], aiCtrPnt[2], aiCtrPnt[3])==0)
00081             return -1 ;
00082         for( int id=0; id<m_pCtrPntDerivativeBendingEnergyConst->GetDimension(); ++id )
00083         {
00084             afPD[id] = m_pCtrPntDerivativeBendingEnergyConst->GetCtrPntsWithoutCheck(aiCtrPnt[0], aiCtrPnt[1], aiCtrPnt[2], aiCtrPnt[3])[id];
00085         }
00086         return 1;
00087     };
00088 
00090     virtual void SetPreComputeFFDsCurrPosition( float * afCurrCtrPntWorld, float *afFiniteDiffPosition) ;
00092     virtual void SetWeightFFDBendingEnergy(float f)     {m_fWeightFFDBendingEnergy=f;};
00094     virtual float GetWeightFFDBendingEnergy(void)       {return m_fWeightFFDBendingEnergy;};
00095 
00097     virtual void    SetUsingFFDsSubVolume(bool b)           {m_bFFDsSubVolume=b;};
00099     virtual bool    GetUsingFFDsSubVolume(void)             {return m_bFFDsSubVolume; };
00100 
00102     void GetCtrPntDerivativeConst(zxhTransformFFDBase&ret)  const { zxhTransformBase*p=&ret ; m_pCtrPntDerivativeConst->Clone(p) ; } ;
00104     virtual zxhTransformFFDBase * GetCtrPntDerivativeConst()        {return m_pCtrPntDerivativeConst ; } ;
00105 protected:
00106 
00108     virtual void    GetFFDControlPointSupportVolumeTest(float *afCtrVolumeTest, int aiCtrPnt[] ) ;
00109 
00113     virtual void TransformPointToWorldPlusDisplacementAdvanceByBsplineFFDs( zxhImageDataT<float>* aPreComputeTransformPointToWorld, int dimension,
00114                                                       int x,int y,int z,int t,  float fux,float fuy,float fuz, float *pWorldRef )
00115     {
00116         float v= zxh::BSpline(fux)*zxh::BSpline(fuy)*zxh::BSpline(fuz);
00117 
00118         for( int id=0; id<dimension; ++id )
00119             pWorldRef[id] = aPreComputeTransformPointToWorld[id].GetPixelGreyscaleClosest( x,y,z,t )
00120                          +  v*m_afFiniteDiffPosition[id]; //m_afFiniteDiffPosition has been projected from physical to world coordinate
00121     };
00122     // Mainly for non-MI metric where sample points can be off image-grid
00123     virtual void TransformPointToWorldPlusDisplacementAdvanceByBsplineFFDs( zxhImageDataT<float>* aPreComputeTransformPointToWorld, int dimension,
00124                                          float x,float y,float z,float t,   float fux,float fuy,float fuz, float *pWorldRef )
00125     {
00126         float v=zxh::BSpline(fux)*zxh::BSpline(fuy)*zxh::BSpline(fuz);
00127         zxhImageModelingLinearT<float,float> mod ;
00128         for( int id=0; id<dimension; ++id )
00129         {
00130             mod.SetImage( &aPreComputeTransformPointToWorld[id] ) ;
00131             pWorldRef[id] = mod.GetPixelFloatValueWithCheck( x,y,z,t ) + v*m_afFiniteDiffPosition[id];//m_afFiniteDiffPosition has been projected from physical to world coordinate
00132         }
00133     };
00134 
00136     virtual void DisplacementAdvanceByBsplineFFDsUsingPreComputedWorld( int dimension, float ux,float uy,float uz, float *pAdWorld )
00137     {
00138         float v=zxh::BSpline(ux)*zxh::BSpline(uy)*zxh::BSpline(uz);
00139         for( int id=0; id<dimension; ++id )
00140             pAdWorld[id] = v *m_afFiniteDiffPosition[id];//m_afFiniteDiffPosition has been projected from physical to world coordinate
00141     };
00142 protected:
00144     virtual int AddFiniteDiffPenaltyByFFDGrid(float * afPD, // output partial differentiation
00145                                       zxhTransformFFDBase * pFFDGrid,
00146                                       int * aiCtrPnt,
00147                                       zxhTransformFFDBase * pDifferential );
00151     virtual bool AddAllCtrPntOnTargetForceForBendingEnergy() ;
00152 
00154     virtual void InitMetricFFDConstant()
00155     {
00156         // new the constant variable for storage
00157         if( m_pCtrPntDerivativeConst ) { delete m_pCtrPntDerivativeConst ;m_pCtrPntDerivativeConst=0;};
00158         zxhTransformBase*ptmptrans = m_pCtrPntDerivativeConst ;
00159         m_pCtrPntDerivativeConst = (zxhTransformFFDBase*)((zxhTransformFFDBase*)m_pMetricBase->GetTransform())->zxhTransformFFDBase::Clone( ptmptrans ) ;
00160         m_pCtrPntDerivativeConst->SetTransformPara( 0 ) ;
00161         if( m_pCtrPntDerivativeBendingEnergyConst ){delete m_pCtrPntDerivativeBendingEnergyConst ;m_pCtrPntDerivativeBendingEnergyConst=0;};
00162         ptmptrans = m_pCtrPntDerivativeBendingEnergyConst ;
00163         m_pCtrPntDerivativeBendingEnergyConst = (zxhTransformFFDBase*)((zxhTransformFFDBase*)m_pMetricBase->GetTransform())->zxhTransformFFDBase::Clone( ptmptrans ) ;
00164         m_pCtrPntDerivativeBendingEnergyConst->SetTransformPara( 0 ) ;
00165     }
00166 
00167     /*  variables */
00168 protected:
00170     virtual void    SetFFDMetricBase()=0;
00172     zxhMetricBase*          m_pMetricBase;
00173 
00175     zxhTransformFFDBase*    m_pCtrPntDerivativeConst;
00177     zxhTransformFFDBase*    m_pCtrPntDerivativeBendingEnergyConst;
00179     float   m_fWeightFFDBendingEnergy ;
00180 
00183     float                   m_afCurrFFDsCtrPntWorld[ImageDimensionMax];
00187     float                   m_afFiniteDiffPosition[ImageDimensionMax] ;
00189     bool                    m_bFFDsSubVolume ;
00190 };
00191 
00192 #endif
00193 
 All Classes Namespaces Functions Variables Typedefs