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 __cmtkElasticRegistration_h_included_
00034 #define __cmtkElasticRegistration_h_included_
00035
00036 #include <cmtkconfig.h>
00037
00038 #include <Registration/cmtkVoxelRegistration.h>
00039 #include <Base/cmtkSplineWarpXform.h>
00040 #include <Base/cmtkMatchedLandmarkList.h>
00041
00042 #include <string.h>
00043
00044 namespace
00045 cmtk
00046 {
00047
00050
00057 class ElasticRegistration :
00059 public VoxelRegistration
00060 {
00061 protected:
00063 SplineWarpXform::SmartPtr InitialWarpXform;
00064
00066 SplineWarpXform::SmartPtr InverseWarpXform;
00067
00074 bool ForceSwitchVolumes;
00075
00077 cmtkGetSetMacro(bool,MatchFltToRefHistogram);
00078
00080 cmtkGetSetMacro(int,RefineGrid);
00081
00086 cmtkGetSetMacro(bool,DelayRefineGrid);
00087
00089 cmtkGetSetMacro(Types::Coordinate,GridSpacing);
00090
00097 cmtkGetSetMacro(bool,ExactGridSpacing);
00098
00100 unsigned int IgnoreEdge;
00101
00104 const char* RestrictToAxes;
00105
00107 cmtkGetSetMacro(bool,FastMode);
00108
00110 cmtkGetSetMacro(bool,AdaptiveFixParameters);
00111
00119 cmtkGetSetMacro(float,AdaptiveFixThreshFactor);
00120
00122 cmtkGetSetMacro(float,JacobianConstraintWeight);
00123
00125 cmtkGetSetMacro(float,RigidityConstraintWeight);
00126
00128 cmtkGetSetMacro(UniformVolume::SmartPtr,RigidityConstraintMap);
00129
00131 cmtkGetSetMacro(float,GridEnergyWeight);
00132
00134 cmtkGetSetMacro(float,RelaxWeight);
00135
00141 cmtkGetSetMacro(float,InverseConsistencyWeight);
00142
00144 cmtkGetSetMacro(float,LandmarkErrorWeight);
00145
00147 cmtkGetSetMacro(MatchedLandmarkList::SmartPtr,LandmarkList);
00148
00150 bool m_RelaxToUnfold;
00151
00153 virtual void SetForceOutside( const bool flag = true, const Types::DataItem value = 0 )
00154 {
00155 this->m_ForceOutsideFlag = flag;
00156 this->m_ForceOutsideValue = value;
00157 }
00158
00162 ElasticRegistration();
00163
00167 virtual ~ElasticRegistration() {};
00168
00178 virtual CallbackResult InitRegistration ();
00179
00182 virtual void EnterResolution( CoordinateVector::SmartPtr&, Functional::SmartPtr&, const int, const int );
00183
00190 virtual int DoneResolution( CoordinateVector::SmartPtr&, Functional::SmartPtr&, const int, const int );
00192
00194 SplineWarpXform::SmartPtr GetTransformation() const
00195 {
00196 return SplineWarpXform::SmartPtr::DynamicCastFrom( this->m_Xform );
00197 }
00198
00200 const UniformVolume::SmartPtr GetReformattedFloatingImage( Interpolators::InterpolationEnum interpolator = Interpolators::LINEAR );
00201
00202 private:
00204 int RefinedGridAtLevel;
00205
00207 int RefineGridCount;
00208
00210 typedef VoxelRegistration Superclass;
00211
00213 bool RelaxationStep;
00214
00216 bool RefineDelayed;
00217
00219 bool m_ForceOutsideFlag;
00220
00222 Types::DataItem m_ForceOutsideValue;
00223
00231 const SplineWarpXform::SmartPtr MakeWarpXform( const Vector3D& size, const AffineXform* initialAffine ) const;
00232
00243 Functional* MakeFunctional( UniformVolume::SmartPtr& refVolume, UniformVolume::SmartPtr& fltVolume, UniformVolume::SmartPtr& rigidityMap ) const;
00244 };
00245
00247
00248 }
00249
00250 #endif // __cmtkElasticRegistration_h_included_