zxhproj v 2.2
zxhproj
|
00001 00002 /*========================================================================= 00003 00004 Program: ZXH Registration Software 00005 Author: Xiahai Zhuang 00006 Module: $RCSfle: zxhRegistrationStruct.h $ 00007 Language: C++ 00008 Date: $Date: From 2008-03 $ 00009 Version: $Revision: 2.0 $ 00010 00011 =========================================================================*/ 00012 00013 #ifndef zxhRegistrationStruct_h 00014 #define zxhRegistrationStruct_h 00015 00016 #include <string> 00017 #include <iostream> 00018 #include <fstream> 00019 #include <stdio.h> 00020 #include <stdlib.h> 00021 #include "zxh.h" 00022 #include "zxhImageData.h" 00023 #include "zxhTransformBase.h" 00024 #include "zxhMetricBase.h" 00025 #include "zxhImageModelingLinear.h" 00026 #include "zxhImageModelingBase.h" 00027 #include "zxhImageProcessPhase.h" 00028 00029 #ifndef ZXH_LocalAffinePreSetGDImageDilation 00030 #define ZXH_LocalAffinePreSetGDImageDilation -1 00031 #endif 00032 00033 #ifndef ZXHOTHERIMAGEMAX 00034 #define ZXHOTHERIMAGEMAX 10 00035 #endif 00036 00037 struct zxhStructSEMI 00038 { 00039 float m_afMMILambda[ZXH_MaxRegistrations] ; 00040 float m_fMMIsigma ; 00041 // side length/diameter (mm) of cubic local region/sphere region 00042 float m_fSemiLocalRegionSize[ZXH_MaxRegistrations] ; 00043 enum zxh::TypeSEMIKernelFunction m_iSEMIKernelType ; 00044 }; 00045 #ifndef ZXHMMISAMPLETIMES 00046 #define ZXHMMISAMPLETIMES 1.0 00047 #endif 00048 00049 struct zxhStructMultiImage 00050 { 00051 int NumImage ; 00052 zxhImageData ImageTest[ZXHOTHERIMAGEMAX]; 00053 zxhImageData ImageRef[ZXHOTHERIMAGEMAX]; 00054 float WeightMetric[ZXHOTHERIMAGEMAX] ; 00055 }; 00056 struct zxhStructPhaseReg 00057 { 00058 bool m_bPhaseRegistration ; 00059 float m_fPhaseWeightings[3]; //zxhlfloat [0]wi=1.0/3.0, [1]wf=1.0/3.0, [2]wo=1.0/3.0 ; 00060 // pointer to the phase processer in MetricPhase. Use them to reset the phase update in metric 00061 zxhImageProcessPhaseT<short,float>* m_pPhaseProcessTest ; 00062 zxhImageProcessPhaseT<short,float>* m_pPhaseProcessRef ; 00063 zxhImageData m_CopiesPhaseOrientTest[3]; 00064 zxhImageData m_CopiesPhaseOrientRef[3] ; 00065 zxhImageDataT<float> m_PhaseOrientCurrTest[3]; 00066 zxhImageDataT<float> m_PhaseOrientCurrRef[3] ; 00067 zxhImageModelingBaseT<float,float> m_PhaseOrientModelTest[3] ; 00068 zxhImageModelingBaseT<float,float> m_PhaseOrientModelRef[3] ; 00069 zxhImageModelingBaseT<float,float> *m_apPhaseOrientModelTest[3] ; 00070 zxhImageModelingBaseT<float,float> *m_apPhaseOrientModelRef[3] ; 00071 }; 00072 struct zxhStructFFDReg 00073 { 00074 00075 zxhImageData* m_CopyFFDMaskTestOrig ; 00076 zxhImageData* m_CopyFFDMaskRefOrig ; 00077 zxhImageData* m_CopyRegionForComputeDirectionFFDsNVRefOrig ; 00078 00079 float m_fFFDSpace[ZXH_MaxRegistrations*ImageDimensionMax]; 00080 bool m_bFFDInactiveBorders ; 00081 bool m_abFFDsUsingSubVolume[ZXH_MaxRegistrations]; 00082 float m_afFFDsBendingEnergyWeight[ZXH_MaxRegistrations]; 00083 00084 zxhImageData m_FFDMaskTestCurr ; 00085 float m_fFFDMaskTestDilateLength ; 00086 00087 zxhImageData m_FFDMaskRefCurr ; 00088 float m_afFFDMaskRefDilateLength[ZXH_MaxRegistrations] ; 00089 zxhImageData m_RegionForComputeDirectionFFDsNVRef ; 00090 zxhImageDataF m_DirectionFFDsNVRefCurr ; 00091 zxhImageModelingLinearT<float,float> m_FFDDirectionModelNVRef; 00092 bool m_bFFDShaped ; 00093 float m_fFFDRegriddingPortion ; 00094 00095 }; 00096 struct zxhStructLocalAffineReg 00097 { 00098 // this copies doNOT need to be new/delete 00099 zxhImageData m_CopiesLocalAffineRegions[ZXH_LocalAffineMaxNumber] ; 00100 zxhImageData m_CopiesComputeLocalGradientRegionsMask[ZXH_LocalAffineMaxNumber]; 00101 00102 zxhTransformBase *m_pLocalAffineForwardComposedMatrix[ZXH_LocalAffineMaxNumber]; 00103 int m_iNumLocalAffines ; 00104 int m_iLocalAffineTransType[ZXH_LocalAffineMaxNumber] ; 00105 zxhImageData * m_aLocalAffineRegions ; 00106 float m_fMinDistanceBetweenRegions ; 00107 zxhImageData m_aComputeLocalGradientRegions[ZXH_LocalAffineMaxNumber]; 00108 zxhImageData m_aComputeLocalGradientRegionsMask[ZXH_LocalAffineMaxNumber]; 00109 float m_fDilateLocalGradientRegions[ZXH_LocalAffineMaxNumber]; //mm -1 means pre-set mask image(s) 00110 float m_fThresholdMaxLocalDisplace ; 00111 float m_fWorldFacetsFromTo[2][ImageDimensionMax] ; 00112 //float m_fOverlapRegionDilateLength ; 00113 //float m_fEstimateLocalRegionSize[ZXH_LocalAffineMaxNumber] ; 00114 //int m_iLocalAffinePreOptimiseGlobal ; 00115 //int m_iLocallyOptimiseSteps ; 00116 int m_iLocallyAffineOptimiseType ;// 0 accessory optimise, 1 globally optimise, -1 region based optimse 00117 float m_fLocalAffineSearchLength ; 00118 float m_fLocalAffineDifferentialLength ; 00119 float m_fLocalAffineConcatenateThreshold ; 00120 // sampling for checking jacobian value, default is same as m_fWorldSamplingDistance 00121 float m_fLocalAffineJacobianSampleWorld[ImageDimensionMax] ; 00122 zxhImageData m_LocalAffineRegriddingMaskImage; 00123 zxhTransformBase* m_pLocalAffineGlobalBfRegridding ; 00124 float m_fLocalAffineDiffk ; 00125 float m_fLocalAffineDifft[ImageDimensionMax] ; 00126 float m_fLocalAffineDiffs[ImageDimensionMax] ; 00127 float m_fLocalAffineDiffr[ImageDimensionMax] ; 00128 }; 00132 class zxhRegistrationStruct 00133 { 00134 public: 00136 int m_iInitRegInfoStatus ; 00137 00139 zxhTransformBase* m_CopyInitialTransform ; 00140 // copies test/target image space info 00141 zxhImageData* m_CopyImageTestOrig ; 00142 zxhImageData* m_CopyMaskTestOrig ; 00143 zxhImageData* m_CopyRegionForComputeDirectionFFDsNVTestOrig ; 00144 zxhImageData m_imgWeightShort100TestOrig ; 00145 00146 // copies reference/source image space info 00147 zxhImageData* m_CopyImageRefOrig ; 00148 zxhImageData* m_CopyImageRefGaussian ; 00149 zxhImageData* m_CopyMaskRefOrig ;; 00150 zxhImageData* m_CopyMaskImageForRefVolume ; 00151 zxhImageData m_imgWeightShort100RefOrig ; 00152 00153 // currently also served as forwardcomposed concatenation transformation 00154 // transformation: m_pConcatenatedFowardCompose X m_pTransformCurr X m_pConcatenatedTransformsByRegridding 00155 zxhTransformBase* m_pConcatenatedTransformsByRegridding ; 00156 int m_iStatusForwardConcatenation ; // -1 not, 0 not set, 1 yes 00157 zxhTransformBase* m_pConcatenatedFowardCompose ; 00158 // 00159 bool m_bConstraintCost ; 00160 00162 zxhStructSEMI m_StructSEMI ; 00164 zxhStructPhaseReg m_StructPhaseReg; 00165 00167 zxhMetricBase* m_pMetric ; 00168 zxhTransformBase * m_pTransformCurr ; 00169 zxhTransformBase * m_pDifferentialCurr ; 00170 zxhTransformBase * m_pInfluenceCurr ; 00171 00172 zxhImageData m_imgTestCurr ; // been gaussian according to m_fWorldSamplingDistance 00173 zxhImageData m_imgMaskTestCurr ; 00174 float m_fMaskTestDilateLength ; 00175 00176 zxhImageData m_imgRefCurr ; 00177 zxhImageData m_imgMaskRefCurr ; 00178 float m_fMaskRefDilateLength ; 00179 00180 struct zxhStructMultiImage m_StructMultiImage ; 00181 00182 zxhImageDataT<float> m_imgWeightFloatTest ; 00183 zxhImageDataT<float> m_imgWeightFloatRef ; 00184 zxhImageModelingLinearT<float,float> m_modelWeightTest ; 00185 zxhImageModelingLinearT<float,float> m_modelWeightRef ; 00186 00187 float m_afGaussianSmoothTestImage[ZXH_MaxRegistrations]; 00188 float m_afGaussianSmoothRefImage[ZXH_MaxRegistrations]; 00189 00190 int m_iRegistrationDimension; 00191 std::string m_sLoadTransformFile ; 00192 int m_iRoiCooFromTo[2][ImageDimensionMax] ; 00193 std::string m_sOuputString ; 00194 bool m_bComputeInverse ; 00195 int m_iNumRegistrations ; 00196 int m_iCurrRegistration ; 00197 float m_fWorldSamplingDistance[ImageDimensionMax*ZXH_MaxRegistrations]; 00198 00199 //metric penalty term mask 00200 float m_fWeightingVolumeFromRef ; 00201 zxhImageData m_MaskImageForRefVolume ; 00202 float m_fVolumeFromRefStandardDeviation ; 00203 00204 float m_fWeightingVolumeFromTest ; 00205 zxhImageData m_MaskImageForTestVolume ; 00206 float m_fVolumeFromTestStandardDeviation ; 00207 00208 00210 // rigid=0,rig+scale=1,aff=2, ffd=3, fbs=4, skew=5, grid=6 ; LocalAffines=10 00211 enum zxh::ZXH_TransformType m_iTransType ; 00212 // for affine transformation 00213 //float m_fEstimateSubjectSize ; 00214 int m_iAffinePreSettingType ; 00215 float m_fAffinePreScaling[ImageDimensionMax] ; 00216 float m_fAffinePreRotate[ImageDimensionMax] ; 00217 float m_fAffinePreTranslate[ImageDimensionMax] ; 00218 float m_fAffineDiffk ; 00219 float m_fAffineDifft[ImageDimensionMax] ; 00220 float m_fAffineDiffs[ImageDimensionMax] ; 00221 float m_fAffineDiffr[ImageDimensionMax] ; 00222 // local affines 00223 struct zxhStructLocalAffineReg m_StructLocalAffineReg ; 00224 00225 // FFDs 00226 struct zxhStructFFDReg m_StructFFDReg ; 00227 // 00228 bool m_bDiffeomorphism ; 00229 float m_fConcatenationSampling[ImageDimensionMax]; 00231 float m_afRegularRate[ZXH_MaxRegistrations] ; 00232 float m_fSearchLength[ZXH_MaxRegistrations] ; 00233 int m_iLineSearch[ZXH_MaxRegistrations] ; // 0:un-set, -1: no, 1: yes; 00234 int m_iOptimiseMaxSteps[ZXH_MaxRegistrations] ; 00235 // -1 unset [no], 0 set no, 1 set yes 00236 int m_aiHeartReg[ZXH_MaxRegistrations] ; 00237 //float m_fDiff[ZXH_MaxRegistrations] ;//1 mm 00238 00239 public: //methods 00240 float * GetRegriddingSamplingWorld() 00241 { 00242 if( this->m_fConcatenationSampling[0]!=0 &&this->m_fConcatenationSampling[1]!=0 00243 && this->m_fConcatenationSampling[2]!=0 ) 00244 return & (this->m_fConcatenationSampling[0]) ; 00245 00246 this->m_fConcatenationSampling[0] = 2 ; 00247 this->m_fConcatenationSampling[1] = 2 ; 00248 this->m_fConcatenationSampling[2] = 2 ; 00249 return & (this->m_fConcatenationSampling[0]) ; 00250 } 00251 float * GetForwardConcatenationSamplingWorld() 00252 {return this->GetRegriddingSamplingWorld();} 00253 00254 void FreeRegistrationStruct() ; 00255 void InitRegistrationStruct() ; 00256 00257 // only used in zxhOptimizerGradientLocalMatrix::ConcatenateTransformsNUpdate 00258 // init local region/ overlap correction 00259 // but nothing done to m_aComputeLocalGradientRegionsMask (this step do in InitLocallyAffineRegionsFromCopies) 00260 int InitLocallyMatrixRegionsWithinConcatenationFromCopies( ) ; 00261 00262 00263 /* * 1. setting m_aLocalAffineRegions 00264 * 2. check no overlap between m_aLocalAffineRegions (return number of overlap voxels) 00265 * 3. m_aComputeLocalGradientRegions using m_fDilateLocalGradientRegions 00266 * */ 00267 int InitLocallyAffineRegionsFromCopies(); 00268 int InitLocallyAffineNoneOverlap(); 00269 void ReComputeLocalGradientRegions(); 00270 00273 void BackwardTransformRefCopiesByConcatenatedTransforms(); 00274 00276 void BackwardTransformRefCopiesByConcatenatedTransformsForPhase(); 00277 00279 void ComposeForwardRegridingToOneVariable(); 00280 00285 void RegForwardTransformNScaleGaussianForMultiResolution(); 00286 00291 bool InitWeightImages( char type, zxhTransformBase* pTrans=0) ; 00292 }; 00293 00294 00295 #endif 00296