zxhproj v 2.2
zxhproj
|
00001 00002 /*========================================================================= 00003 00004 Program: ZXH Registration Software 00005 Author: Xiahai Zhuang 00006 Module: $RCSfle: zxhMetricMIConstraint.h $ 00007 Language: C++ 00008 Date: $Date: From 2004-01 $ 00009 Version: $Revision: 1.0, 2.0 $ 00010 00011 =========================================================================*/ 00012 #ifndef zxhMetricMIConstraint_h 00013 #define zxhMetricMIConstraint_h 00014 00015 #include "zxh.h" 00016 #include "zxhMetricMI.h" 00017 #include "zxhTransformFFDBase.h" 00018 #include <math.h> 00026 00027 class zxhMetricMIConstraint : 00028 public zxhMetricMI 00029 { 00030 public: 00032 zxhMetricMIConstraint(void); 00034 ~zxhMetricMIConstraint(void); 00035 00037 virtual std::string GetMetricType() {return zxhMetricMI::GetMetricType()+"_CNST_"; } ; 00038 00040 virtual zxhMetricBase* Clone( zxhMetricBase * & pRet ); 00042 virtual int GetValue(zxhlfloat&fValue); 00043 00044 /* Zhu07 and Rohlfing03 impressibility term: 00045 Gaussian ( (V-Vref)/(1/120Vref), 0, 1) and 1/N\sumLog(|J|) , but we threshold on Gaussian(\sigma,u,\sigma)*/ 00047 virtual zxhlfloat GetSumImpressibilityTerm(zxhlfloat Orig, zxhlfloat After ) ; 00049 virtual zxhlfloat GetVolumeFromRef( zxhTransformBase * pTrans, 00050 float xfWorldFrom,float xfWorldTo,float yfWorldFrom,float yfWorldTo, 00051 float zfWorldFrom,float zfWorldTo,float tfWorldFrom,float tfWorldTo ) ; 00052 00054 virtual void SetWeightingVolumeFromRef(float f) {m_fWeightingVolumeFromRef=f;}; 00056 virtual float GetWeightingVolumeFromRef() {return m_fWeightingVolumeFromRef;}; 00058 virtual void SetVolumeFromRefOrigin( float f ) {m_fVolumeFromRefOrigin = f;}; 00060 virtual float GetVolumeFromRefOrigin() {return m_fVolumeFromRefOrigin;}; 00062 virtual void SetStandardDeviationRef( float f ) {m_fStandardDeviation = f;}; 00064 virtual float GetStandardDeviationRef( ) {return m_fStandardDeviation;}; 00066 virtual void SetMaskImageForRefVolume( zxhImageData* p ) {m_pMaskImageForRefVolume=p;}; 00068 virtual zxhImageData* GetMaskImageForRefVolume() {return m_pMaskImageForRefVolume;}; 00069 /* compute the volume change based on Jacobian */ 00071 virtual inline float GetWeightedLocalVolumeChanges(float fVolumeChanges) 00072 { 00073 float gau = exp(zxh::abs(log(fVolumeChanges)))-1 ; 00074 if( gau < m_fStandardDeviationTest ) 00075 return 0 ; 00076 if( gau < m_fStandardDeviationTest*2 ) 00077 return -gau/m_fStandardDeviationTest ; 00078 return -gau*gau/(m_fStandardDeviationTest*m_fStandardDeviationTest); 00079 } 00081 virtual float GetWeightedVolumeChangesFromTest( float &fNumVolumeCounted, 00082 zxhTransformBase * pTrans,zxhTransformBase * pRegriddingTrans, 00083 zxhImageData * pMaskTest, 00084 float xfWorldFrom,float xfWorldTo,float yfWorldFrom,float yfWorldTo, 00085 float zfWorldFrom,float zfWorldTo,float tfWorldFrom,float tfWorldTo ) ; 00087 virtual void SetWeightingVolumeFromTest(float f) {m_fWeightingVolumeFromTest=f;}; 00089 virtual float GetWeightingVolumeFromTest() {return m_fWeightingVolumeFromTest;}; 00091 virtual void SetStandardDeviationTest(float f) {m_fStandardDeviationTest=f;}; 00093 virtual float GetStandardDeviationTest() {return m_fStandardDeviationTest;}; 00095 virtual void SetRegriddingdTransform(zxhTransformBase*p) {m_pRegriddingdTransform =p;}; 00097 virtual zxhTransformBase* GetRegriddingdTransform() {return m_pRegriddingdTransform;}; 00099 virtual void SetMaskImageForTestVolume( zxhImageData*p ) {m_pMaskImageForTestVolume=p;}; 00101 virtual zxhImageData* GetMaskImageForTestVolume() {return m_pMaskImageForTestVolume;}; 00102 00104 virtual int ComputeConstanceForGradient() ; 00105 00106 protected: 00108 float m_fWeightingVolumeFromRef ; 00110 float m_fStandardDeviation ; 00112 float m_fVolumeFromRefOrigin ; 00114 float m_fVolumeFromRefCurrentTransform ; 00116 zxhImageData* m_pMaskImageForRefVolume ; 00118 float m_fWeightingVolumeFromTest ; 00120 float m_fStandardDeviationTest ; 00122 zxhTransformBase *m_pRegriddingdTransform ; 00124 float m_fVolumeFromTestCurrentTransform ; 00126 float m_fNumVolumeFromTestCurrentTransform ; 00128 zxhImageData* m_pMaskImageForTestVolume ; 00129 }; 00130 00131 #endif 00132 00133 00134 00135