19 #ifndef __itkFEMRegistrationFilter_h
20 #define __itkFEMRegistrationFilter_h
45 #include "vnl/vnl_vector.h"
46 #include "vnl/vnl_math.h"
47 #include "vnl/vnl_vector_fixed.h"
117 template <
class TMovingImage,
class TFixedImage,
class TFemObjectType>
140 itkStaticConstMacro(ImageDimension,
unsigned int,
141 FixedImageType::ImageDimension);
147 enum Sign { positive = 1, negative = -1 };
202 return m_MovingImage;
208 return m_OriginalMovingImage;
212 void SetFixedImage(FixedImageType* T);
224 void SetInputFEMObject(FEMObjectType* F,
unsigned int level = 0);
226 FEMObjectType * GetInputFEMObject(
unsigned int level = 0);
229 void RunRegistration(
void);
232 void IterativeSolve(SolverType *S);
235 void MultiResSolve();
238 void WarpImage(
const MovingImageType * R);
244 return m_WarpedImage;
248 void ComputeJacobian( );
271 void AddLandmark(PointType source, PointType target);
273 void InsertLandmark(
unsigned int i, PointType source, PointType target);
275 void DeleteLandmark(
unsigned int i);
277 void ClearLandmarks();
279 void GetLandmark(
unsigned int i, PointType& source, PointType& target);
288 void EnforceDiffeomorphism(
float thresh, SolverType *S,
bool onlywriteimages);
296 void SetMeshPixelsPerElementAtEachResolution(
unsigned int i,
unsigned int which = 0)
298 m_MeshPixelsPerElementAtEachResolution[which] = i;
305 void SetNumberOfIntegrationPoints(
unsigned int i,
unsigned int which = 0)
307 m_NumberOfIntegrationPoints[which] = i;
315 void SetWidthOfMetricRegion(
unsigned int i,
unsigned int which = 0)
317 m_MetricWidth[which] = i;
320 unsigned int GetWidthOfMetricRegion(
unsigned int which = 0)
322 return m_MetricWidth[which];
329 void SetMaximumIterations(
unsigned int i,
unsigned int which)
331 m_Maxiters[which] = i;
339 itkSetMacro(TimeStep, Float);
340 itkGetMacro(TimeStep, Float);
347 itkSetMacro(Alpha, Float);
348 itkGetMacro(Alpha, Float);
354 itkSetMacro(UseLandmarks,
bool);
355 itkGetMacro(UseLandmarks,
bool);
356 void SetUseLandmarksOff()
358 SetUseLandmarks(
false);
362 void SetUseLandmarksOn()
364 SetUseLandmarks(
true);
370 itkSetMacro(UseMassMatrix,
bool);
371 itkGetMacro(UseMassMatrix,
bool);
377 itkSetMacro(EnergyReductionFactor, Float);
378 itkGetMacro(EnergyReductionFactor, Float);
382 void SetElasticity(
Float i,
unsigned int which = 0)
388 Float GetElasticity(
unsigned int which = 0)
394 void SetRho(
Float r,
unsigned int which = 0)
400 void SetGamma(
Float r,
unsigned int which = 0)
406 void SetDescentDirectionMinimize()
408 m_DescentDirection = positive;
412 void SetDescentDirectionMaximize()
414 m_DescentDirection = negative;
421 itkSetMacro(DoLineSearchOnImageEnergy,
unsigned int);
422 itkGetMacro(DoLineSearchOnImageEnergy,
unsigned int);
430 itkSetMacro(UseNormalizedGradient,
bool);
431 itkGetMacro(UseNormalizedGradient,
bool);
432 void SetUseNormalizedGradientOff()
434 SetUseNormalizedGradient(
false);
438 void SetUseNormalizedGradientOn()
440 SetUseNormalizedGradient(
true);
446 itkSetMacro(EmployRegridding,
unsigned int);
447 itkGetMacro(EmployRegridding,
unsigned int);
454 itkSetMacro(LineSearchMaximumIterations,
unsigned int);
455 itkGetMacro(LineSearchMaximumIterations,
unsigned int);
463 return m_FullImageSize;
470 itkGetModifiableObjectMacro(Metric, MetricBaseType);
471 itkSetObjectMacro(Metric, MetricBaseType);
482 void ChooseMetric(
unsigned int whichmetric);
487 unsigned int GetMetricType()
489 return m_WhichMetric;
505 void PrintVectorField(
unsigned int modnum = 1000);
510 void SetMaxLevel(
unsigned int level);
511 itkGetMacro(MaxLevel,
unsigned int);
518 itkSetMacro(CreateMeshFromImage,
bool);
519 void SetCreateMeshFromImageOn()
521 SetCreateMeshFromImage(
true);
523 void SetCreateMeshFromImageOff()
525 SetCreateMeshFromImage(
false);
527 itkGetMacro(CreateMeshFromImage,
bool);
531 itkSetObjectMacro( Interpolator, InterpolatorType );
534 itkGetModifiableObjectMacro( Interpolator, InterpolatorType );
539 itkSetMacro(StandardDeviations, StandardDeviationsType);
540 virtual void SetStandardDeviations(
double value);
545 itkGetConstReferenceMacro(StandardDeviations, StandardDeviationsType);
549 itkSetMacro(MaximumKernelWidth,
unsigned int);
550 itkGetConstMacro(MaximumKernelWidth,
unsigned int);
555 itkSetMacro(MaximumError,
double);
556 itkGetConstMacro(MaximumError,
double);
566 void PrintSelf(std::ostream & os,
Indent indent)
const;
569 void CreateMesh(
unsigned int ElementsPerSide, SolverType *solver);
572 void ApplyLoads(ImageSizeType Isz,
double* spacing =
NULL);
575 void ApplyImageLoads(MovingImageType* i1, FixedImageType* i2);
580 void CreateLinearSystemSolver();
584 Float EvaluateEnergy();
590 void InterpolateVectorField(SolverType *S);
595 FloatImageType * GetMetricImage(FieldType* F);
598 FieldPointer ExpandVectorField(ExpandFactorsType* expandFactors, FieldType* f);
601 void SampleVectorFieldAtNodes(SolverType *S);
604 Float EvaluateResidual(SolverType *mySolver, Float t);
609 void FindBracketingTriplet(SolverType *mySolver, Float* a, Float* b, Float* c);
615 Float GoldenSection(SolverType *mySolver, Float tol = 0.01,
unsigned int MaxIters = 25);
618 itkSetObjectMacro(
Load, ImageMetricLoadType );
619 itkGetModifiableObjectMacro(
Load, ImageMetricLoadType );
623 void SmoothDisplacementField();
627 void InitializeField();
630 void operator=(
const Self &);
722 #ifndef ITK_MANUAL_INSTANTIATION
723 #include "itkFEMRegistrationFilter.hxx"