ANIMA  4.0
animaBaseBMRegistrationMethod.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <itkProcessObject.h>
4 #include <itkDataObjectDecorator.h>
5 
6 // Agregator
8 
9 // Block matcher
10 #include <animaBaseBlockMatcher.h>
11 
12 // RPI stuff
13 #include <itkStationaryVelocityFieldTransform.h>
14 #include <rpiDisplacementFieldTransform.h>
15 #include <itkAffineTransform.h>
16 
17 // Resampler base
18 #include <itkImageToImageFilter.h>
19 
20 namespace anima
21 {
22 
23 template <typename TInputImageType>
24 class BaseBMRegistrationMethod : public itk::ProcessObject
25 {
26 public:
29  typedef itk::ProcessObject Superclass;
30  typedef itk::SmartPointer <Self> Pointer;
31  typedef itk::SmartPointer <const Self> ConstPointer;
32 
34  itkTypeMacro(BaseBMRegistrationMethod, itk::ProcessObject)
35 
36  typedef typename TInputImageType::IOPixelType ImageScalarType;
37 
39  typedef anima::BaseTransformAgregator<TInputImageType::ImageDimension> AgregatorType;
40  typedef typename AgregatorType::BaseInputTransformType BaseInputTransformType;
41  typedef typename AgregatorType::BaseOutputTransformType BaseOutputTransformType;
42  typedef typename AgregatorType::ScalarType AgregatorScalarType;
43  typedef typename AgregatorType::BaseOutputTransformType TransformType;
44  typedef typename TransformType::Pointer TransformPointer;
45 
48  typedef itk::DataObjectDecorator< TransformType > TransformOutputType;
49  typedef typename TransformOutputType::Pointer TransformOutputPointer;
50 
52  typedef itk::StationaryVelocityFieldTransform <AgregatorScalarType, TInputImageType::ImageDimension> SVFTransformType;
53  typedef typename SVFTransformType::Pointer SVFTransformPointer;
54  typedef rpi::DisplacementFieldTransform <AgregatorScalarType, TInputImageType::ImageDimension> DisplacementFieldTransformType;
55  typedef typename DisplacementFieldTransformType::Pointer DisplacementFieldTransformPointer;
56  typedef itk::AffineTransform <typename AgregatorType::ScalarType, TInputImageType::ImageDimension> AffineTransformType;
57  typedef typename AffineTransformType::Pointer AffineTransformPointer;
58 
59  typedef TInputImageType InputImageType;
60  typedef typename InputImageType::Pointer InputImagePointer;
61  typedef itk::ImageToImageFilter <InputImageType,InputImageType> ResamplerFilterType;
62  typedef typename ResamplerFilterType::Pointer ResamplerFilterPointer;
63 
64  typedef anima::BaseBlockMatcher <TInputImageType> BlockMatcherType;
65 
66  typedef itk::Image <unsigned char, TInputImageType::ImageDimension> MaskImageType;
67  typedef typename MaskImageType::Pointer MaskImagePointer;
68 
70  itkSetObjectMacro (FixedImage, InputImageType)
71  itkGetMacro (FixedImage, InputImageType *)
72 
74  itkSetObjectMacro (MovingImage, InputImageType)
75  itkGetMacro (MovingImage, InputImageType *)
76 
77  void SetReferenceImageResampler(ResamplerFilterType *filter) {m_ReferenceImageResampler = filter;}
78  void SetMovingImageResampler(ResamplerFilterType *filter) {m_MovingImageResampler = filter;}
79  ResamplerFilterPointer &GetReferenceImageResampler() {return m_ReferenceImageResampler;}
80  ResamplerFilterPointer &GetMovingImageResampler() {return m_MovingImageResampler;}
81 
83  itkSetObjectMacro(Agregator, AgregatorType)
84  itkGetMacro(Agregator, AgregatorType *)
85 
86 
87  itkSetMacro (MaximumIterations, unsigned int)
88  itkGetMacro (MaximumIterations, unsigned int)
89 
90 
91  itkSetMacro(MinimalTransformError, double)
92  itkGetMacro(MinimalTransformError, double)
93 
94  itkSetMacro (SVFElasticRegSigma, double)
95  itkGetMacro (SVFElasticRegSigma, double)
96 
97  itkSetMacro (BCHCompositionOrder, unsigned int)
98  itkGetMacro (BCHCompositionOrder, unsigned int)
99 
100  itkSetMacro (ExponentiationOrder, unsigned int)
101  itkGetMacro (ExponentiationOrder, unsigned int)
102 
103  itkSetMacro(VerboseProgression, bool)
104  itkGetMacro(VerboseProgression, bool)
105 
106  void Abort() {m_Abort = true;}
107 
108  itkSetMacro(InitialTransform, TransformPointer)
109  TransformPointer &GetInitialTransform() {return m_InitialTransform;}
110 
111  void SetBlockMatcher(BlockMatcherType *matcher) {m_BlockMatcher = matcher;}
112  BlockMatcherType *GetBlockMatcher() {return m_BlockMatcher;}
113 
116 
119  typedef itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType;
120  using Superclass::MakeOutput;
121  virtual DataObjectPointer MakeOutput(DataObjectPointerArraySizeType idx) ITK_OVERRIDE;
122 
123 protected:
126 
127  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
128 
129  void GenerateData() ITK_OVERRIDE;
130  void StartOptimization();
131 
132  virtual void SetupTransform(TransformPointer &optimizedTransform);
133  virtual void PerformOneIteration(InputImageType *refImage, InputImageType *movingImage, TransformPointer &addOn) = 0;
134  virtual void ResampleImages(TransformType *currentTransform, InputImagePointer &refImage, InputImagePointer &movingImage);
135  virtual bool ComposeAddOnWithTransform(TransformPointer &computedTransform, TransformType *addOn);
136 
137 private:
138  ITK_DISALLOW_COPY_AND_ASSIGN(BaseBMRegistrationMethod);
139 
140  InputImagePointer m_FixedImage;
141  InputImagePointer m_MovingImage;
142 
143  unsigned int m_MaximumIterations;
144  double m_MinimalTransformError;
145 
146  // Resampler
147  ResamplerFilterPointer m_ReferenceImageResampler;
148  ResamplerFilterPointer m_MovingImageResampler;
149 
150  // Transform agregator
151  AgregatorType *m_Agregator;
152 
153  // SVF specific regularization parameter
154  double m_SVFElasticRegSigma;
155  unsigned int m_BCHCompositionOrder;
156  unsigned int m_ExponentiationOrder;
157 
158  bool m_Abort;
159  bool m_VerboseProgression;
160 
161  TransformPointer m_InitialTransform;
162  BlockMatcherType * m_BlockMatcher;
163 };
164 
165 } // end of namespace anima
166 
TransformOutputType::Pointer TransformOutputPointer
AgregatorType::BaseInputTransformType BaseInputTransformType
ResamplerFilterType::Pointer ResamplerFilterPointer
DisplacementFieldTransformType::Pointer DisplacementFieldTransformPointer
ResamplerFilterPointer & GetMovingImageResampler()
void SetReferenceImageResampler(ResamplerFilterType *filter)
virtual void ResampleImages(TransformType *currentTransform, InputImagePointer &refImage, InputImagePointer &movingImage)
AgregatorType::BaseOutputTransformType TransformType
TInputImageType::IOPixelType ImageScalarType
rpi::DisplacementFieldTransform< AgregatorScalarType, TInputImageType::ImageDimension > DisplacementFieldTransformType
virtual DataObjectPointer MakeOutput(DataObjectPointerArraySizeType idx) ITK_OVERRIDE
itk::AffineTransform< typename AgregatorType::ScalarType, TInputImageType::ImageDimension > AffineTransformType
virtual void PrintSelf(std::ostream &os, itk::Indent indent) const ITK_OVERRIDE
virtual void SetupTransform(TransformPointer &optimizedTransform)
void SetBlockMatcher(BlockMatcherType *matcher)
itk::DataObjectDecorator< TransformType > TransformOutputType
itk::ImageToImageFilter< InputImageType, InputImageType > ResamplerFilterType
AffineTransformType::Pointer AffineTransformPointer
void SetMovingImageResampler(ResamplerFilterType *filter)
virtual bool ComposeAddOnWithTransform(TransformPointer &computedTransform, TransformType *addOn)
ResamplerFilterPointer & GetReferenceImageResampler()
itk::StationaryVelocityFieldTransform< AgregatorScalarType, TInputImageType::ImageDimension > SVFTransformType
virtual void PerformOneIteration(InputImageType *refImage, InputImageType *movingImage, TransformPointer &addOn)=0
itk::Image< unsigned char, TInputImageType::ImageDimension > MaskImageType
itk::SmartPointer< const Self > ConstPointer
itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType
AgregatorType::BaseOutputTransformType BaseOutputTransformType