zxhproj v 2.2
zxhproj
|
00001 00002 /*========================================================================= 00003 00004 Program: ZXH Registration Software 00005 Module: $RCSfle: zxhMetricNV.h $ 00006 Language: C++ 00007 Date: $Date: From 2004-01 $ 00008 Version: $Revision: 1.0, 2.0 $ 00009 00010 =========================================================================*/ 00011 00012 #ifndef zxhMetricNV_H 00013 #define zxhMetricNV_H 00014 00015 #include "zxhTransformBase.h" 00016 #include "zxhTransformFFDBase.h" 00017 #include "zxhOptimizerBase.h" 00018 #include "zxhImageModelingBase.h" 00019 #include "zxhMetricBase.h" 00020 #include "zxhMetricFFDBase.h" 00021 00033 00034 class zxhMetricNV :public zxhMetricBase, public zxhMetricFFDBase 00035 { 00036 public: 00038 zxhMetricNV() ; 00040 virtual ~zxhMetricNV() ; 00041 00043 virtual std::string GetMetricType() {return "_NV_"+zxhMetricFFDBase::GetMetricType(); } ; 00044 00046 virtual zxhMetricBase* Clone(zxhMetricBase*&pRet) ; 00048 virtual std::string GetPrintString() {return "";}; 00050 virtual bool SetMetricFromStream(std::ifstream & ifs){return false;}; 00051 00053 virtual int GetValue(zxhlfloat& fValue) {return -1;}; 00055 virtual bool SetImage(zxhImageData*pImageTest,zxhImageData*pImageRef) 00056 { 00057 bool b = zxhMetricBase::SetImage( pImageTest, pImageRef ) ; 00058 return (b && ComputeSigmaFromImageIntensity()) ; 00059 }; 00060 00061 00062 /*** compute for FFD registration or for MetricFFDBase interface ***/ 00063 ; 00065 virtual int GetValueByFFDGrid(zxhlfloat&fValue,int aiCtrPnt[ImageDimensionMax]) {return -1;}; 00066 00070 virtual int GetValueFromRegion( zxhlfloat&fValue, 00071 float xfWorldFrom,float xfWorldTo,float yfWorldFrom,float yfWorldTo, 00072 float zfWorldFrom,float zfWorldTo,float tfWorldFrom,float tfWorldTo) {return -1 ;} ; 00073 00077 virtual int ComputeConstanceForFFDGradient() {return -1 ;} ; 00078 00081 virtual int GetDiffByFFDGrid( float * afPD, // output partial differentiation 00082 zxhTransformFFDBase * pFFDGrid, 00083 int * aiCtrPnt, 00084 zxhTransformFFDBase * pDifferential ) {return -1;}; 00086 virtual int GetDiffByFFDGridOnFFDPhysicalVector( float * afPD, // output partial differentiation 00087 zxhTransformFFDBase * pFFDGrid, 00088 int * aiCtrPnt, 00089 zxhTransformFFDBase * pDifferential, 00090 float * vector) 00091 {std::cerr<<"error: zxhMetricNV::GetDiffByFFDGridOnFFDPhysicalVector NOT implemented yet\n"; 00092 return zxhMetricFFDBase::GetDiffByFFDGridOnFFDPhysicalVector(afPD, pFFDGrid, aiCtrPnt, pDifferential, vector); } ; 00093 00095 virtual void SetSingleModality( bool b ) { m_bSingleModalityRegistration=b; } ; 00097 virtual bool GetSingleModality() {return m_bSingleModalityRegistration ; }; 00098 00099 // 00101 zxhImageDataT<float>* testGetLEMvoxelForceImage() { return &m_imgVoxelForces[0];}; 00102 00103 void testSetNoiseLevel( float f ) {m_fStaticNoiseLevel=f;}; 00104 protected: 00106 virtual void SetFFDMetricBase() {m_pMetricBase=this;}; 00108 virtual void InverseTransformIntensityGradientVector(float fVectorRef[ImageDimensionMax],float fInverseVectorTest[ImageDimensionMax],float* fWorldTest ) 00109 { 00110 if( this->m_pForwardComposedTransform == 0 ) 00111 this->m_pTransform->InverseTransformIntensityGradientVector( fVectorRef, fInverseVectorTest, fWorldTest ) ; 00112 else 00113 { 00114 float fWorldMid[] = {fWorldTest[0],fWorldTest[1],fWorldTest[2],fWorldTest[3]} ; 00115 this->m_pForwardComposedTransform->TransformWorldToWorld( fWorldTest, fWorldMid ) ; 00116 this->m_pTransform->InverseTransformIntensityGradientVector( fVectorRef, fInverseVectorTest, fWorldMid ) ; 00117 this->m_pForwardComposedTransform->InverseTransformIntensityGradientVector( fInverseVectorTest, fInverseVectorTest, fWorldTest ); 00118 } 00119 } 00121 virtual void TransformIntensityGradientVectorTo(float fVectorFrom[ImageDimensionMax],float fVectorTo[ImageDimensionMax],float* fWorldFrom ) 00122 { 00123 this->m_pTransform->TransformIntensityGradientVectorTo( fVectorFrom, fVectorTo, fWorldFrom ) ; 00124 if( this->m_pForwardComposedTransform !=0 ) 00125 { 00126 float fWorldMid[] = {fWorldFrom[0],fWorldFrom[1],fWorldFrom[2],fWorldFrom[3]} ; 00127 this->m_pTransform->TransformWorldToWorld( fWorldFrom, fWorldMid ) ; 00128 this->m_pForwardComposedTransform->TransformIntensityGradientVectorTo( fVectorTo, fVectorTo, fWorldMid ) ; 00129 } 00130 } 00132 virtual bool ComputeSigmaFromImageIntensity() {return false;}; 00134 virtual float ComputeConsineThetaAndConfidenceFunction( float gv1[], float gv2[] ) {return -1;}; 00135 00137 zxhImageDataT<float> m_imgVoxelForces[ImageDimensionMax] ; 00139 float m_fSquareSigma[2]; 00140 00141 float m_fStaticNoiseLevel ; 00142 00143 00145 bool m_bSingleModalityRegistration ; 00146 } ; 00147 00148 //const float zxhMetricNV::m_fStaticNoiseLevel = 0.02 ; 00149 00150 typedef zxhMetricNV zxhMetricLEM ; 00151 typedef zxhMetricNV zxhMetricLEMFFD ; 00152 typedef zxhMetricNV zxhMetricCLEM ; 00153 typedef zxhMetricNV zxhMetricCLEMFFD ; 00154 typedef zxhMetricNV zxhMetricNVFFD ; 00155 #endif // 00156 00157 00158 00159 00160 00161