zxhproj v 2.2
zxhproj

zxhRegistrationStruct.h

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