19 #ifndef itkFEMRegistrationFilter_h
20 #define itkFEMRegistrationFilter_h
45 #include "vnl/vnl_vector.h"
47 #include "vnl/vnl_vector_fixed.h"
117 template <
typename TMovingImage,
typename TFixedImage,
typename 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();
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);
298 m_MeshPixelsPerElementAtEachResolution[which] = i;
307 m_NumberOfIntegrationPoints[which] = i;
317 m_MetricWidth[which] = i;
322 return m_MetricWidth[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);
358 SetUseLandmarks(
false);
364 SetUseLandmarks(
true);
370 itkSetMacro(UseMassMatrix,
bool);
371 itkGetMacro(UseMassMatrix,
bool);
377 itkSetMacro(EnergyReductionFactor, Float);
378 itkGetMacro(EnergyReductionFactor, Float);
408 m_DescentDirection = positive;
414 m_DescentDirection = negative;
421 itkSetMacro(DoLineSearchOnImageEnergy,
unsigned int);
422 itkGetMacro(DoLineSearchOnImageEnergy,
unsigned int);
430 itkSetMacro(UseNormalizedGradient,
bool);
431 itkGetMacro(UseNormalizedGradient,
bool);
434 SetUseNormalizedGradient(
false);
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);
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);
521 SetCreateMeshFromImage(
true);
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 ITK_OVERRIDE;
569 void CreateMesh(
unsigned int ElementsPerSide, SolverType *solver);
572 void ApplyLoads(ImageSizeType Isz,
double* spacing = ITK_NULLPTR);
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();
721 #ifndef ITK_MANUAL_INSTANTIATION
722 #include "itkFEMRegistrationFilter.hxx"
FixedImageType * GetFixedImage()
void SetElasticity(Float i, unsigned int which=0)
InterpolationGridType::SizeType InterpolationGridSizeType
vnl_vector< Float > m_Rho
void SetCreateMeshFromImageOn()
Superclass::RegionType RegionType
Image< float, itkGetStaticConstMacro(ImageDimension)> FloatImageType
Light weight base class for most itk classes.
unsigned int m_EmployRegridding
FieldType::Pointer m_TotalField
SmartPointer< const Self > ConstPointer
itk::Image< Element::ConstPointer, ImageDimension > InterpolationGridType
SmartPointer< Self > Pointer
unsigned int m_LineSearchMaximumIterations
LandmarkArrayType m_LandmarkArray
Represent the size (bounds) of a n-dimensional image.
Float m_EnergyReductionFactor
FixedImageType::IndexType m_Windex
void SetMeshPixelsPerElementAtEachResolution(unsigned int i, unsigned int which=0)
itk::Image< VectorType, itkGetStaticConstMacro(ImageDimension)> FieldType
virtual const RegionType & GetLargestPossibleRegion() const
FieldType::Pointer m_Field
FieldType::SizeType m_FieldSize
Element::Pointer m_Element
MaterialType::Pointer m_Material
vnl_vector< Float > m_Gamma
itk::VectorIndexSelectionCastImageFilter< FieldType, FloatImageType > IndexSelectCasterType
FEM Solver for time dependent problems; uses Crank-Nicolson implicit discretization scheme...
unsigned int m_CurrentLevel
ImageSizeType m_ImageOrigin
FieldType::Pointer FieldPointer
WarperType::Pointer m_Warper
InterpolationGridType::PointType InterpolationGridPointType
FixedImageType::SizeType m_CurrentLevelImageSize
TMovingImage MovingImageType
itk::ImageRegionIteratorWithIndex< FloatImageType > FloatImageIterator
void SetNumberOfIntegrationPoints(unsigned int i, unsigned int which=0)
FEMRegistrationFilter Self
Generate a rectilinar mesh from an image. The result is stored in a FEMObject.
ImageSizeType m_FullImageSize
TFemObjectType FEMObjectType
void SetWidthOfMetricRegion(unsigned int i, unsigned int which=0)
FixedArray< double, ImageDimension > StandardDeviationsType
FixedImageType::RegionType m_Wregion
Float GetElasticity(unsigned int which=0)
FixedImageType::PointType PointType
itk::fem::ImageToRectilinearFEMObjectFilter< TMovingImage > ImageToMeshType
Load::ArrayType LoadArray
vnl_vector< unsigned int > m_MeshPixelsPerElementAtEachResolution
itk::Vector< float, itkGetStaticConstMacro(ImageDimension)> VectorType
unsigned int m_MaximumKernelWidth
itk::VectorExpandImageFilter< FieldType, FieldType > ExpanderType
FloatImageType * GetJacobianImage()
FixedImageType * GetWarpedImage()
ImageSizeType GetImageSize()
void SetRho(Float r, unsigned int which=0)
Expand the size of a vector image by an integer factor in each dimension.
InterpolatorPointer m_Interpolator
Linear elasticity material class.
TFixedImage FixedImageType
FixedImageType::Pointer m_WarpedImage
vnl_vector< unsigned int > m_NumberOfIntegrationPoints
void SetElement(Element::Pointer e)
ExpanderType::ExpandFactorsType ExpandFactorsType
FieldType::RegionType m_FieldRegion
General image pair load that uses the itkFiniteDifferenceFunctions.
FieldType * GetDisplacementField()
FEMObjectType::Pointer m_FEMObject
A templated class holding a n-Dimensional vector.
unsigned int m_TotalIterations
MaterialLinearElasticity MaterialType
FixedImageType::PixelType PixelType
FixedImageType::SizeType ImageSizeType
void SetMaterial(MaterialType::Pointer m)
A multi-dimensional iterator templated over image type that walks pixels within a region and is speci...
InterpolatorType::Pointer InterpolatorPointer
ImageToImageFilter< TMovingImage, TFixedImage > Superclass
FiniteDifferenceFunctionLoad< MovingImageType, FixedImageType > ImageMetricLoadType
ImageSizeType m_ImageScaling
const SizeType & GetSize() const
Warps an image using an input displacement field.
ImageSizeType m_CurrentImageScaling
FEM Image registration filter. The image registration problem is modelled here with the finite elemen...
VectorInterpolateImageFunction< FieldType, CoordRepType > InterpolatorType
vnl_vector< unsigned int > m_Maxiters
void SetDescentDirectionMaximize()
itk::ImageRegionIteratorWithIndex< FixedImageType > ImageIterator
SolverCrankNicolson< ImageDimension > SolverType
unsigned int GetWidthOfMetricRegion(unsigned int which=0)
void SetCreateMeshFromImageOff()
unsigned int m_DoLineSearchOnImageEnergy
unsigned int m_WhichMetric
void SetDisplacementField(FieldType *F)
MovingImageType::Pointer m_MovingImage
MovingImageType::Pointer m_OriginalMovingImage
itk::WarpImageFilter< MovingImageType, FixedImageType, FieldType > WarperType
VectorLinearInterpolateImageFunction< FieldType, CoordRepType > DefaultInterpolatorType
MetricBaseTypePointer m_Metric
void SetDescentDirectionMinimize()
Base class for filters that take an image as input and produce an image as output.
bool m_CreateMeshFromImage
MovingImageType * GetMovingImage()
itk::ImageRegionIteratorWithIndex< FieldType > FieldIterator
LinearSystemWrapperItpack LinearSystemSolverType
Control indentation during Print() invocation.
Base class for all vector image interpolaters.
Extracts the selected index of the vector that is the input pixel type.
void SetUseNormalizedGradientOff()
General abstract load base class.
bool m_UseNormalizedGradient
MovingImageType * GetOriginalMovingImage()
ImageMetricLoadType::Pointer m_Load
StandardDeviationsType m_StandardDeviations
FloatImageType::Pointer m_FloatImage
LinearSystemWrapper class that uses Itpack numeric library functions to define and solve a sparse lin...
MetricBaseType::Pointer MetricBaseTypePointer
static ITK_CONSTEXPR_VAR double e
The base of the natural logarithm or Euler's number
void SetUseLandmarksOff()
std::vector< typename LoadLandmark::Pointer > LandmarkArrayType
void SetGamma(Float r, unsigned int which=0)
void SetUseNormalizedGradientOn()
void SetMaximumIterations(unsigned int i, unsigned int which)
FixedImageType::Pointer m_FixedImage
Templated n-dimensional image class.
PDEDeformableRegistrationFunction< FixedImageType, MovingImageType, FieldType > MetricBaseType
Linearly interpolate a vector image at specified positions.
unsigned int GetMetricType()
vnl_vector< unsigned int > m_MetricWidth