Medical Imaging Interaction Toolkit  2026.06.00
Medical Imaging Interaction Toolkit
mitkMultiModalAffineDefaultRegistrationAlgorithm.h
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #ifndef mitkMultiModalAffineDefaultRegistrationAlgorithm_h
14 #define mitkMultiModalAffineDefaultRegistrationAlgorithm_h
15 
16 #include <mapDiscreteElements.h>
17 #include <mapITKAffineMattesMIMultiResRegistrationAlgorithmTemplate.h>
18 #include <mapConfigure.h>
19 
21 
22 namespace mitk
23 {
24 
44  template <class TImageType>
46  public map::algorithm::boxed::ITKAffineMattesMIMultiResRegistrationAlgorithm<TImageType, TImageType, ::map::algorithm::mitkMultiModalAffineDefaultRegistrationAlgorithmUIDPolicy, SealedFixedInterpolatorPolicyMacro< ::itk::LinearInterpolateImageFunction<TImageType, map::core::continuous::ScalarType> >, map::algorithm::itk::NoComponentInitializationPolicy>
47  {
48  public:
50 
51  typedef map::algorithm::boxed::ITKAffineMattesMIMultiResRegistrationAlgorithm<TImageType, TImageType, ::map::algorithm::mitkMultiModalAffineDefaultRegistrationAlgorithmUIDPolicy, SealedFixedInterpolatorPolicyMacro< ::itk::LinearInterpolateImageFunction<TImageType, map::core::continuous::ScalarType> >, map::algorithm::itk::NoComponentInitializationPolicy>
53 
54  typedef ::itk::SmartPointer<Self> Pointer;
55  typedef ::itk::SmartPointer<const Self> ConstPointer;
56 
58  ITKAffineMattesMIMultiResRegistrationAlgorithm);
60 
61  protected:
63  {
64  };
65 
67  {
68  };
69 
77  void configureAlgorithm() override
78  {
79  Superclass::configureAlgorithm();
80 
81  this->setResolutionLevels(3);
82  this->_preInitialize = true;
83  this->_useCenterOfGravity = false;
84 
85  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetMaximumStepLength(3.00);
86  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetMinimumStepLength(0.5);
87  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetNumberOfIterations(200);
88  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetRelaxationFactor(0.8);
89  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetGradientMagnitudeTolerance(1e-4);
90 
91  //metric
92  this->getConcreteMetricControl()->getConcreteMetric()->SetNumberOfHistogramBins(30);
93  this->getConcreteMetricControl()->getConcreteMetric()->SetUseAllPixels(true);
94  this->getConcreteMetricControl()->getConcreteMetric()->ReinitializeSeed();
95  this->getConcreteMetricControl()->getConcreteMetric()->UseExplicitPDFDerivativesOn();
96  }
97 
105  void
106  doInterLevelSetup() override
107  {
108  Superclass::doInterLevelSetup();
109 
110  //scale setting
111  int dimCount = TImageType::ImageDimension*TImageType::ImageDimension + TImageType::ImageDimension;
112  int matrixEnd = TImageType::ImageDimension*TImageType::ImageDimension;
113  typename Superclass::ConcreteOptimizerType::ScalesType scales(dimCount);
114  double matrixScale = 1.0;
115  double transScale = 1.0;
116 
117  if (this->getCurrentLevel() == 0)
118  {
119  matrixScale = 10.0;
120  transScale = 1.0 / 10000;
121  }
122  else
123  {
124  matrixScale = 1.0;
125  transScale = 1.0 / 1000;
126  }
127 
128  for (int i = 0; i < dimCount; ++i)
129  {
130  if (i < matrixEnd)
131  {
132  scales[i] = matrixScale;
133 
134  }
135  else
136  {
137  scales[i] = transScale;
138  }
139  }
140 
141  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetScales(scales);
142 
143  //spatial samples setting
144  if (this->getCurrentLevel() != 0)
145  {
146  this->getConcreteMetricControl()->getConcreteMetric()->SetUseAllPixels(false);
147 
148  unsigned int nrOfSmpl = ::itk::Math::Round<unsigned int, double>
149  (this->getMovingImage()->GetLargestPossibleRegion().GetNumberOfPixels() * 0.30);
150 
151  this->getConcreteMetricControl()->getConcreteMetric()->SetNumberOfSpatialSamples(nrOfSmpl);
152  }
153  };
154 
155  private:
156 
157  MultiModalAffineDefaultRegistrationAlgorithm(const Self& source); //purposely not implemented
158  void operator=(const Self&); //purposely not implemented
159  };
160 
161 }
162 
163 #endif
Default multimodal affine registration algorithm for MITK.
void configureAlgorithm() override
Configure the algorithm with default parameters.
map::algorithm::boxed::ITKAffineMattesMIMultiResRegistrationAlgorithm< TImageType, TImageType, ::map::algorithm::mitkMultiModalAffineDefaultRegistrationAlgorithmUIDPolicy, SealedFixedInterpolatorPolicyMacro< ::itk::LinearInterpolateImageFunction< TImageType, map::core::continuous::ScalarType > >, map::algorithm::itk::NoComponentInitializationPolicy > Superclass
void doInterLevelSetup() override
Adjust optimizer scales and spatial sampling between resolution levels.
Find image slices visible on a given plane.