zxhproj v 2.2
zxhproj
|
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