Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "cmtkImagePairSymmetricNonrigidRegistrationFunctional.h"
00034
00035 #include <Registration/cmtkImagePairSymmetricNonrigidRegistrationFunctionalTemplate.h>
00036 #include <Registration/cmtkImagePairSimilarityMeasureCR.h>
00037 #include <Registration/cmtkImagePairSimilarityMeasureMSD.h>
00038 #include <Registration/cmtkImagePairSimilarityMeasureNCC.h>
00039 #include <Registration/cmtkImagePairSimilarityMeasureNMI.h>
00040 #include <Registration/cmtkImagePairSimilarityMeasureMI.h>
00041
00042 #include <Base/cmtkInterpolator.h>
00043 #include <Base/cmtkUniformVolume.h>
00044 #include <Base/cmtkSplineWarpXform.h>
00045
00046 namespace
00047 cmtk
00048 {
00049
00052
00053 template<class VM, class W>
00054 void
00055 ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<VM,W>::SetWarpXform
00056 ( SplineWarpXform::SmartPtr& warpFwd, SplineWarpXform::SmartPtr& warpBwd )
00057 {
00058 this->FwdFunctional.SetWarpXform( warpFwd );
00059 this->FwdFunctional.SetInverseTransformation( warpBwd );
00060
00061 this->BwdFunctional.SetWarpXform( warpBwd );
00062 this->BwdFunctional.SetInverseTransformation( warpFwd );
00063 }
00064
00065 template<class VM, class W>
00066 typename ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<VM,W>::ReturnType
00067 ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<VM,W>
00068 ::EvaluateWithGradient( CoordinateVector& v, CoordinateVector& g, const Types::Coordinate step )
00069 {
00070 CoordinateVector vFwd( this->FwdFunctional.ParamVectorDim(), v.Elements, false );
00071 CoordinateVector gFwd( this->FwdFunctional.ParamVectorDim(), g.Elements, false );
00072
00073 CoordinateVector vBwd( this->BwdFunctional.ParamVectorDim(), v.Elements+this->FwdFunctional.ParamVectorDim(), false );
00074 CoordinateVector gBwd( this->BwdFunctional.ParamVectorDim(), g.Elements+this->FwdFunctional.ParamVectorDim(), false );
00075
00076 const typename Self::ReturnType result =
00077 this->FwdFunctional.EvaluateWithGradient( vFwd, gFwd, step ) + this->BwdFunctional.EvaluateWithGradient( vBwd, gBwd, step );
00078 return result;
00079 }
00080
00081 ImagePairSymmetricNonrigidRegistrationFunctional*
00082 ImagePairSymmetricNonrigidRegistrationFunctional
00083 ::Create( const int metric,
00084 UniformVolume::SmartPtr& refVolume,
00085 UniformVolume::SmartPtr& fltVolume,
00086 const Interpolators::InterpolationEnum interpolation )
00087 {
00088 switch ( metric )
00089 {
00090 case 0:
00091 return new ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<ImagePairSimilarityMeasureNMI,SplineWarpXform>( refVolume, fltVolume, interpolation );
00092 case 1:
00093 return new ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<ImagePairSimilarityMeasureMI,SplineWarpXform>( refVolume, fltVolume, interpolation );
00094 case 2:
00095 return new ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<ImagePairSimilarityMeasureCR,SplineWarpXform>( refVolume, fltVolume, interpolation );
00096 case 3:
00097 return NULL;
00098 case 4:
00099 return new ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<ImagePairSimilarityMeasureMSD,SplineWarpXform>( refVolume, fltVolume, interpolation );
00100 case 5:
00101 return new ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<ImagePairSimilarityMeasureNCC,SplineWarpXform>( refVolume, fltVolume, interpolation );
00102 default:
00103 return NULL;
00104 }
00105
00106 return NULL;
00107 }
00108
00109 }