zxhproj v 2.2
zxhproj

zxhMetricMIConstraint.h

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