zxhproj v 2.2
zxhproj
|
00001 00002 /*========================================================================= 00003 00004 Program: ZXH Registration Software 00005 Author: Xiahai Zhuang 00006 Module: $RCSfle: zxhMetricMIFFD.h $ 00007 Language: C++ 00008 Date: $Date: From 2008-10 $ 00009 Version: $Revision: 2.0 $ 00010 revision: 00011 =========================================================================*/ 00012 #ifndef zxhMetricMIFFD_h 00013 #define zxhMetricMIFFD_h 00014 00015 #include "zxh.h" 00016 #include "zxhMetricFFDBase.h" 00017 #include "zxhTransformFFD.h" 00018 #include "zxhMetricMIConstraint.h" 00019 #include <math.h> 00027 00028 class zxhMetricMIFFD : public zxhMetricMIConstraint, 00029 public zxhMetricFFDBase // interface for FFD 00030 { 00031 public: 00033 zxhMetricMIFFD(void); 00035 ~zxhMetricMIFFD(void); 00036 00038 virtual std::string GetMetricType() {return zxhMetricMIConstraint::GetMetricType()+"_"+zxhMetricFFDBase::GetMetricType(); } ; 00039 00041 virtual zxhMetricBase* Clone( zxhMetricBase * & pRet ); 00042 00044 virtual int ComputeConstanceForFFDGradient() ; 00046 virtual int GetValue( zxhlfloat & fvalue ) ; 00047 00049 virtual int GetValueByFFDGrid(zxhlfloat&fValue, int aiCtrPnt[ImageDimensionMax]); 00050 00052 virtual int GetDiffByFFDGrid(float * afPD, // output partial differentiation 00053 zxhTransformFFDBase * pFFDGrid, 00054 int * aiCtrPnt, 00055 zxhTransformFFDBase * pDifferential ); 00057 virtual int GetDiffByFFDGridOnFFDPhysicalVector(float * afPD, // output partial differentiation 00058 zxhTransformFFDBase * pFFDGrid, 00059 int * aiCtrPnt, 00060 zxhTransformFFDBase * pDifferential, 00061 float * vector) ; 00062 00063 protected: 00065 virtual int GetFiniteDiffByFFDGrid(float * afPD, // output partial differentiation 00066 zxhTransformFFDBase * pFFDGrid, 00067 int * aiCtrPnt, 00068 zxhTransformFFDBase * pDifferential ); 00070 virtual int GetFiniteDiffByFFDGridOnVector(float * afPD, // output partial differentiation 00071 zxhTransformFFDBase * pFFDGrid, 00072 int * aiCtrPnt, 00073 zxhTransformFFDBase * pDifferential, 00074 float * vector); 00075 00077 // Compute histogram region outside of local support of ctrpnt: EvaluateMMIpositionWeightedHistogram 00078 // compute the difference: zxhMetricFFDBase::GetDiffByFFDGrid( afPD,pFFDGrid,aiCtrPnt,pDifferential ); 00079 virtual int GetDiffByFFDGridForMMI( float * afPD, // output partial differentiation 00080 zxhTransformFFDBase * pFFDGrid, 00081 int * aiCtrPnt, 00082 zxhTransformFFDBase * pDifferential ); 00088 virtual int ComputeHistogramFromPDF4DFFD(zxhlfloat*&afPDF,zxhlfloat&fTotalFreq, 00089 float xfTestFrom,float xfTestTo,float yfTestFrom,float yfTestTo, 00090 float zfTestFrom,float zfTestTo,float tfTestFrom,float tfTestTo ) ; 00091 00098 virtual int ComputeHistogramForControlPoint( zxhlfloat*&afPDF,zxhlfloat&fTotalFreq, int aiCtrPnt[ImageDimensionMax] ) ; 00100 virtual void SetFFDMetricBase() {m_pMetricBase=this;}; 00101 private: 00102 // for: Zhuang, et al.: Spatially Encoded Mutual Information for Nonrigid Registration. IEEE Transactions on Medical Imaging. 00103 // this was just for publication validation using cost function SUM(MIs) or MAG(MIs) 00104 00106 int GetDiffByFFDGridForSMIG1( float * afPD, // output partial differentiation 00107 zxhTransformFFDBase * pFFDGrid, 00108 int * aiCtrPnt, 00109 zxhTransformFFDBase * pDifferential ); 00111 int SMIRecomputeMMIimage(); 00113 zxhlfloat SMIGetSsValueByFFDGrid(int aiCtrPnt[ImageDimensionMax]); 00114 00115 }; 00116 00117 #endif 00118 00119 00120 00121