zxhproj v 2.2
zxhproj
|
00001 00002 /*========================================================================= 00003 00004 Program: ZXH Registration Software 00005 Author: Xiahai Zhuang 00006 Module: $RCSfle: zxhTransformIterateInverse.h $ 00007 Language: C++ 00008 Date: $Date: From 2008-01 $ 00009 Version: $Revision: 2.0 $ 00010 00011 =========================================================================*/ 00012 00013 #ifndef zxhTransformIterateInverse_H 00014 #define zxhTransformIterateInverse_H 00015 00016 #include "zxhTransformFields.h" 00017 #include "zxhImageData.h" 00018 #include <string.h> 00019 #include <stdio.h> 00020 00028 #ifndef m_staticMinimalSpace 00029 #define m_staticMinimalSpace 0.01f 00030 #endif 00031 #ifndef m_staticMinimalSampling 00032 #define m_staticMinimalSampling 1 // it's so weird that 2 works worse than 1 00033 #endif 00034 00035 class zxhTransformIterateInverse : public zxhTransformFields 00036 { 00037 public: 00039 zxhTransformIterateInverse(); 00041 virtual ~zxhTransformIterateInverse(); 00042 00044 virtual void SetTransform( zxhTransformBase*p ) {m_pTransform=p;} ; 00046 virtual void NewInverseTransformImages( int dim, const int*size, const float*spacing, const zxhImageInfo*pimageinfo ) 00047 { NewTransformImages( dim, size, spacing, pimageinfo ) ; } ; 00049 virtual void SetRoi( int dim, int *from, int* to ) 00050 { 00051 this->SetDimension( dim ); 00052 for( int id=0; id<dim; ++id ) 00053 m_aiRoi[0][id]=from[id], m_aiRoi[1][id]=to[id] ; 00054 } ; 00056 //virtual bool ComputeInverseTransform( float fPercentage=0.2 ) ; 00058 virtual bool ComputeInverseByDistanceInterpolate(); 00060 virtual bool Evaluate() 00061 { return ComputeInverseByDistanceInterpolate() ; } 00063 virtual void SetJacWeighting( float f ) { m_fJacWeighting=f; }; 00065 virtual float GetJacWeighting() { return m_fJacWeighting;}; 00067 virtual void TransformWorldToWorld(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]); 00068 00069 protected: 00070 /*std::string m_strTransformFiles[ImageDimensionMax]; from fields 00071 zxhImageGiplT<float> m_pimgTransformFields[ImageDimensionMax]; 00072 zxhImageModelingLinearT<float,float> m_pmodelTransformFields[ImageDimensionMax];*/ 00074 zxhTransformBase *m_pTransform; 00076 int m_aiRoi[2][ImageDimensionMax] ; 00078 float m_fIterateLength ; // 0:l:1 00080 float m_fExponent ; 00082 int m_iFillRange[2] ; 00084 float m_fJacWeighting ; 00087 virtual bool ForwardTransformToRefGrid( int* roiFrom, int* roiTo, 00088 zxhImageDataT<float>* imgFindInverseDis, 00089 zxhImageDataT<float>* imgFindInverseCoX, 00090 zxhImageDataT<float>* imgFindInverseCoY, 00091 zxhImageDataT<float>* imgFindInverseCoZ ) ; 00093 virtual int FillInFindInverse( zxhImageDataT<float>* imgFindInverseDis, 00094 zxhImageDataT<float>* imgFindInverseCoX, 00095 zxhImageDataT<float>* imgFindInverseCoY, 00096 zxhImageDataT<float>* imgFindInverseCoZ ); 00100 virtual void DistanceWeightInterpolateByNeighbours( zxhImageDataT<float>* imgFindInverseDis, 00101 zxhImageDataT<float>* imgFindInverseCoX, 00102 zxhImageDataT<float>* imgFindInverseCoY, 00103 zxhImageDataT<float>* imgFindInverseCoZ ); 00105 virtual void ComputeJacxyzForwardVoxel( float*Jacxyz, zxhTransformBase* pTransform, float *phyco, float *phycoTo, float*spacing) ; 00107 virtual void MapToGrid8Neighbour( float* WorldFrom, float*WorldTo, float* gridcoTo, int i, int j, int k, zxhImageDataT<float>*pImgTemp, 00108 zxhImageDataT<float>* imgFindInverseDis, 00109 zxhImageDataT<float>* imgFindInverseCoX, 00110 zxhImageDataT<float>* imgFindInverseCoY, 00111 zxhImageDataT<float>* imgFindInverseCoZ ) ; 00112 virtual void ComputeSamplingSpacing(float * JacSpacing, float * Jacxyz, float * spacing) 00113 {ComputeSamplingSpacingByMaximalPoints(JacSpacing, Jacxyz, spacing);} 00115 virtual void ComputeSamplingSpacingByProduct(float * JacSpacing, float * Jacxyz, float * spacing); 00117 virtual void ComputeSamplingSpacingByMaximalPoints(float * JacSpacing, float * Jacxyz, float * spacing); 00119 virtual void DistanceWeightInterpolationOct( float afInterpolateResult[], float * afInterpolateSource, float *afDisSquared ); 00120 }; 00121 #endif // 00122 00123