zxhproj v 2.2
zxhproj
|
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