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 #ifndef __cmtkImagePairSymmetricNonrigidRegistrationFunctionalTemplate_h_included_
00034 #define __cmtkImagePairSymmetricNonrigidRegistrationFunctionalTemplate_h_included_
00035
00036 #include <cmtkconfig.h>
00037
00038 #include "cmtkImagePairSymmetricNonrigidRegistrationFunctionalTemplate.h"
00039
00040 #include <Base/cmtkFunctional.h>
00041 #include <Base/cmtkMacros.h>
00042
00043 #include <Registration/cmtkImagePairNonrigidRegistrationFunctionalTemplate.h>
00044
00045 namespace
00046 cmtk
00047 {
00048
00051
00053 template<class VM, class W>
00054 class ImagePairSymmetricNonrigidRegistrationFunctionalTemplate :
00056 public ImagePairSymmetricNonrigidRegistrationFunctional
00057 {
00058 public:
00060 typedef ImagePairSymmetricNonrigidRegistrationFunctionalTemplate<VM,W> Self;
00061
00063 typedef SmartPointer<Self> SmartPtr;
00064
00066 typedef ImagePairSymmetricNonrigidRegistrationFunctional Superclass;
00067
00069 ImagePairNonrigidRegistrationFunctionalTemplate<VM> FwdFunctional;
00070
00072 ImagePairNonrigidRegistrationFunctionalTemplate<VM> BwdFunctional;
00073
00075 ImagePairSymmetricNonrigidRegistrationFunctionalTemplate( UniformVolume::SmartPtr& reference, UniformVolume::SmartPtr& floating, const Interpolators::InterpolationEnum interpolation )
00076 : FwdFunctional( reference, floating, interpolation ),
00077 BwdFunctional( floating, reference, interpolation )
00078 {}
00079
00081 virtual void SetInverseConsistencyWeight( const typename Self::ReturnType inverseConsistencyWeight )
00082 {
00083 this->FwdFunctional.SetInverseConsistencyWeight( inverseConsistencyWeight );
00084 this->BwdFunctional.SetInverseConsistencyWeight( inverseConsistencyWeight );
00085 }
00086
00088 virtual void SetAdaptiveFixParameters( const bool adaptiveFixParameters )
00089 {
00090 this->FwdFunctional.SetAdaptiveFixParameters( adaptiveFixParameters );
00091 this->BwdFunctional.SetAdaptiveFixParameters( adaptiveFixParameters );
00092 }
00093
00095 virtual void SetAdaptiveFixThreshFactor( const typename Self::ReturnType threshFactor )
00096 {
00097 this->FwdFunctional.SetAdaptiveFixThreshFactor( threshFactor );
00098 this->BwdFunctional.SetAdaptiveFixThreshFactor( threshFactor );
00099 }
00100
00102 virtual void SetJacobianConstraintWeight( const typename Self::ReturnType jacobianConstraintWeight )
00103 {
00104 this->FwdFunctional.SetJacobianConstraintWeight( jacobianConstraintWeight );
00105 this->BwdFunctional.SetJacobianConstraintWeight( jacobianConstraintWeight );
00106 }
00107
00109 virtual void SetGridEnergyWeight( const typename Self::ReturnType gridEnergyWeight )
00110 {
00111 this->FwdFunctional.SetGridEnergyWeight( gridEnergyWeight );
00112 this->BwdFunctional.SetGridEnergyWeight( gridEnergyWeight );
00113 }
00114
00116 virtual void SetWarpXform( SplineWarpXform::SmartPtr& warpFwd, SplineWarpXform::SmartPtr& warpBwd );
00117
00119 virtual void GetParamVector ( CoordinateVector& v )
00120 {
00121 CoordinateVector vFwd, vBwd;
00122 this->FwdFunctional.GetParamVector( vFwd );
00123 this->BwdFunctional.GetParamVector( vBwd );
00124
00125 v.SetDim( vFwd.Dim + vBwd.Dim );
00126 v.CopyToOffset( vFwd );
00127 v.CopyToOffset( vBwd, vFwd.Dim );
00128 }
00129
00131 virtual typename Self::ReturnType EvaluateWithGradient( CoordinateVector& v, CoordinateVector& g, const Types::Coordinate step = 1 );
00132
00134 virtual typename Self::ReturnType EvaluateAt ( CoordinateVector& v )
00135 {
00136 CoordinateVector vFwd( this->FwdFunctional.ParamVectorDim(), v.Elements, false );
00137 CoordinateVector vBwd( this->BwdFunctional.ParamVectorDim(), v.Elements+this->FwdFunctional.ParamVectorDim(), false );
00138 return this->FwdFunctional.EvaluateAt( vFwd ) + this->BwdFunctional.EvaluateAt( vBwd );
00139 }
00140
00141 virtual typename Self::ReturnType Evaluate ()
00142 {
00143 return this->FwdFunctional.Evaluate() + this->BwdFunctional.Evaluate();
00144 }
00145
00147 virtual Types::Coordinate GetParamStep( const size_t idx, const Types::Coordinate mmStep = 1 ) const
00148 {
00149 if ( idx < this->FwdFunctional.ParamVectorDim() )
00150 return this->FwdFunctional.GetParamStep( idx, mmStep );
00151 else
00152 return this->BwdFunctional.GetParamStep( idx - this->FwdFunctional.ParamVectorDim(), mmStep );
00153 }
00154
00156 virtual size_t ParamVectorDim() const
00157 {
00158 return this->FwdFunctional.ParamVectorDim() + this->BwdFunctional.ParamVectorDim();
00159 }
00160
00162 virtual size_t VariableParamVectorDim() const
00163 {
00164 return this->FwdFunctional.VariableParamVectorDim() + this->BwdFunctional.VariableParamVectorDim();
00165 }
00166 };
00167
00169
00170 }
00171
00172 #endif // #ifndef __cmtkImagePairSymmetricNonrigidRegistrationFunctionalTemplate_h_included_