zxhproj v 2.2
zxhproj

zxhMetricNV.h

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 
 All Classes Namespaces Functions Variables Typedefs