zxhproj v 2.2
zxhproj

zxhTransformLocalAffines.h

00001 
00002 /*=========================================================================
00003 
00004   Program:   ZXH Registration Software
00005   Author:    Xiahai Zhuang
00006   Module:    $RCSfle: zxhTransformLocalAffines.h    $
00007   Language:  C++
00008   Date:      $Date: From  2008-01 $
00009   Version:   $Revision: 2.0 $
00010 
00011   Update log:
00012 
00013 
00014 =========================================================================*/
00015 
00016 #ifndef zxhTransformLocalAffines_h
00017 #define zxhTransformLocalAffines_h
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00041 
00042 
00045 
00046 #include "zxhTransformBase.h"
00047 #include "zxhGradientBase.h"
00048 #include "zxhTransformMultipleAffines.h"
00049 #include "zxhImageData.h"
00050 #include "zxhImageModelingLinear.h"
00051 #include "zxhMetricMILocalAffines.h"
00052 #include "zxhMetricPhaseLocalAffines.h"
00053 #include <string>
00054 
00055 class zxhMetricNV ;
00056 class zxhMetricMILocalAffines ;
00057 class zxhMetricPhaseLocalAffines;
00058 class zxhTransformLocalAffines : public zxhTransformMultipleAffines
00059 {
00060 public:
00062     zxhTransformLocalAffines();
00064     virtual ~zxhTransformLocalAffines();
00065 
00067     virtual bool    SetTransformFromStream(std::ifstream& ifs);
00069 
00070     virtual std::string GetPrintString();
00071 
00073     virtual std::string GetTransformType()                          {return "AFFS";} ;
00074 
00076     virtual zxhTransformBase*   Clone(zxhTransformBase*&pRet);
00077 
00080     virtual bool    PreComputeDistance2WeightAndSetModel();
00081 
00084     virtual void    TransformWorldToWorld(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax])
00085     {
00086         float rx[] = { fVectorFromWorld[0], fVectorFromWorld[1], fVectorFromWorld[2], fVectorFromWorld[3] };
00087         LocalTransformWorldToWorld( fVectorFromWorld, rx ) ;
00088         zxhTransformAffine::TransformWorldToWorld( rx, fVectorToWorld );
00089     }
00092     virtual void    LocalTransformPointToWorld(float fVectorFrom[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]);
00097     virtual void    LocalTransformWorldToWorld(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]);
00099     virtual void    LocalTransformWorldToWorldByDisplace(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]);
00101     virtual void    LocalTransformWorldToWorldByAffine(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]);
00102 
00104     virtual bool    GetJacobianMatrixWorld(float fWorld[ImageDimensionMax],float pJacobian[ImageDimensionMax*ImageDimensionMax]);
00106     virtual bool    GetLocalAffineJacobianMatrixByWorld(float fWorld[ImageDimensionMax], float pJacobian[ImageDimensionMax*ImageDimensionMax]);
00108     virtual bool    GetLocalAffineJacobianMatrixByWorldForByDisplace(float fWorld[ImageDimensionMax], float pJacobian[ImageDimensionMax*ImageDimensionMax]);
00109 
00111     virtual float   GetMinLocalAffineJacobian( float wFrom[], float wTo[], float wIntval[], zxhImageData*pMaskTest=0, zxhImageData*pMaskRef=0 ) ;
00113     virtual float   GetMinLocalAffineJacobianOnTestImage( zxhImageData*pImageTest, float tFrom[], float tTo[], float tIntval[], zxhImageData*pMaskTest=0, zxhImageData*pMaskRef=0 ) ;
00114 
00115 
00116     /*  /////////////// setting of local regions ///////////////////////   */
00118     virtual void SetLocalRegions( zxhImageData*p );
00120     virtual zxhImageData* GetLocalRegions( )                        {return m_aLocalRegions ;};
00122     virtual bool    SetFileNameOfLocalRegions( std::string *s ) {for(int il=0;il<m_nNoLocalAffines;++il) m_astrFileNameOfLocalRegions[il]=s[il];m_bSetFileNameOfLocalRegions=true ;return true;};
00124     virtual const std::string * GetFileNameOfLocalRegions()     {return m_astrFileNameOfLocalRegions;};
00126     virtual bool    HasSetFileNameOfLocalRegions()                  {return m_bSetFileNameOfLocalRegions;};
00128     virtual bool SetLocalRegionsFromPreSetFileNames( );
00129     /*  /////////////// end setting of local regions ///////////////////////   */
00130 
00131 
00136     //virtual int ForwardMaskDilatedOverlap3D( float fDilate=0 ) ;//3D
00137     
00139     virtual void SetWorldRoi( float *wfrom, float *wto, int dimension )
00140     {
00141         m_iDimension = dimension ;
00142         for( int i=0; i<m_iDimension; ++i )
00143             m_afWorldRoi[0][i]=wfrom[i], m_afWorldRoi[1][i]=wto[i] ;
00144         m_bSetWorldRoi = true ;
00145     }
00147     virtual bool GetWorldRoi( float wfrom[], float wto[] ) ;
00149     virtual bool    WithinInterpolateRegionWorld( const float World[] ) ;
00151     virtual void    SetInterpolateByDisplacement(bool b)                {m_bInterpolateByDisplacement=b;};
00153     virtual bool    GetInterpolateByDisplacement()                      {return m_bInterpolateByDisplacement ;};
00154 
00155 protected: //for methods
00156     inline  float   ComputeWeightFromDistance(float dis)
00157     {
00158         if( ZXH_LocalAffineExponent==1 ) return 1/dis;  
00159         if( ZXH_LocalAffineExponent==2 ) return 1/(dis*dis);
00160         return exp(-ZXH_LocalAffineExponent*log(dis));  
00161     }; 
00162     inline  float   ComputeDerivativeByDistance( float dis )
00163     { 
00164         if( ZXH_LocalAffineExponent==1 ) return -1/(dis*dis); 
00165         if( ZXH_LocalAffineExponent==2 ) return -2/(dis*dis*dis); 
00166         return -ZXH_LocalAffineExponent*exp((-ZXH_LocalAffineExponent-1)*log(dis));  
00167     }; 
00168     inline  float   ComputeWeightFromDistanceBoundary(float dis)
00169     {return ZXH_LocalAffineFacetWeighting*ComputeWeightFromDistance(dis);} 
00170 
00172     void    LocalTransformWorldToWorldOutlier(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]) ;
00174     float   ComputeRoiBoundaryWeightByWorld( const float fWorld[] )
00175     {
00176         float w = 0 ;
00177         for( int i=0; i<m_iDimension; ++i )
00178         {
00179             w += this->ComputeWeightFromDistanceBoundary( zxh::absf(fWorld[i] - m_afWorldRoi[0][i]) ) ;
00180             w += this->ComputeWeightFromDistanceBoundary( zxh::absf(m_afWorldRoi[1][i] - fWorld[i]) ) ;
00181         }
00182         return w ;
00183     }
00185     void    ComputeDerivativeWeightOfRoiBoundary( float NablaRoiW[], float co[], float fWorld[] )
00186     {
00187         for( int i=0; i<m_iDimension; ++i )
00188         { // \partial RoiD/ \paritial xi = 0 when 
00189             NablaRoiW[i] =  ZXH_LocalAffineFacetWeighting*this->ComputeDerivativeByDistance( zxh::absf(fWorld[i] - m_afWorldRoi[0][i]) ) ;//Dd/Dx=1
00190             NablaRoiW[i] -= ZXH_LocalAffineFacetWeighting*this->ComputeDerivativeByDistance( zxh::absf(m_afWorldRoi[1][i] - fWorld[i]) ) ;//Dd/Dx=(-1)
00191         }
00192     }
00194     void    PreComputeDistanceImageForLocalRegions();
00196     void    SetModelWeight();
00197 protected:
00199     zxhImageData            *m_aLocalRegions ;
00201     std::string     m_astrFileNameOfLocalRegions[ZXH_LocalAffineMaxNumber] ;
00203     bool            m_bSetFileNameOfLocalRegions ;
00205     zxhImageData    m_aimgLoadLocalImagesFromPreSetFileNames[ZXH_LocalAffineMaxNumber] ;
00206 
00207 
00209     zxhImageDataT<float>    m_aLocalDistance2Weight[ZXH_LocalAffineMaxNumber];
00210     
00211 
00212     zxhImageDataT<float>    m_roiDistance2Weight ;// ---NOT in use m_aWeighting[nLocalAffine] point to boundary weight, and else 
00213     
00215     zxhImageModelingLinearT<float,float> m_aModelDistance2Weight[ZXH_LocalAffineMaxNumber+1];
00218     float       m_afWorldRoi[2][ImageDimensionMax] ;
00220     bool        m_bSetWorldRoi ;
00221 
00223     bool        m_bInterpolateByDisplacement ;
00224 
00226 public:
00228     virtual void    SetIRBReg(bool b)               { m_bIRBReg=b; } ;
00230     virtual bool    GetIRBReg()                     { return m_bIRBReg; };
00232     virtual bool    ComputeGradientBasedIRBReg
00233         (
00234         zxhMetricMILocalAffines*pMetric,
00235         zxhTransformLocalAffines*pInfluence=0
00236         );
00238     virtual bool    ComputeGradientBasedAccReg
00239         (
00240         zxhMetricMILocalAffines*pMetric,
00241         zxhTransformLocalAffines*pInfluence=0
00242         ); 
00246     virtual bool    ComputeMetricGradient
00247         (
00248         zxhMetricBase*pMetric,
00249         zxhTransformBase*pInfluence=0
00250         );
00251      
00252 protected:
00254     bool    m_bIRBReg ;
00255 };
00256 
00257 #endif
00258 
00259 
 All Classes Namespaces Functions Variables Typedefs