Medical Imaging Interaction Toolkit  2026.06.00
Medical Imaging Interaction Toolkit
mitkMultiModalRigidDefaultRegistrationAlgorithm.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 mitkMultiModalRigidDefaultRegistrationAlgorithm_h
14 #define mitkMultiModalRigidDefaultRegistrationAlgorithm_h
15 
16 #include <mapDiscreteElements.h>
17 #include <mapITKEuler3DMattesMIMultiResRegistrationAlgorithmTemplate.h>
18 #include <mapConfigure.h>
19 
21 
22 namespace mitk
23 {
45  template<class TImageType>
47  public ::map::algorithm::boxed::ITKEuler3DMattesMIMultiResRegistrationAlgorithm<TImageType, TImageType, ::map::algorithm::mitkMultiModalRigidDefaultRegistrationAlgorithmUIDPolicy, SealedFixedInterpolatorPolicyMacro< ::itk::LinearInterpolateImageFunction<TImageType, ::map::core::continuous::ScalarType> >, ::map::algorithm::itk::NoComponentInitializationPolicy>
48  {
49  public:
51 
52  typedef ::map::algorithm::boxed::ITKEuler3DMattesMIMultiResRegistrationAlgorithm<TImageType, TImageType, ::map::algorithm::mitkMultiModalRigidDefaultRegistrationAlgorithmUIDPolicy, SealedFixedInterpolatorPolicyMacro< ::itk::LinearInterpolateImageFunction<TImageType, ::map::core::continuous::ScalarType> >, ::map::algorithm::itk::NoComponentInitializationPolicy>
54 
55  typedef ::itk::SmartPointer<Self> Pointer;
56  typedef ::itk::SmartPointer<const Self> ConstPointer;
57 
59  ITKEuler3DMattesMIMultiResRegistrationAlgorithm);
61 
62  protected:
64  {
65  };
66 
68  {
69  };
70 
79  void configureAlgorithm() override
80  {
81  Superclass::configureAlgorithm();
82 
83  this->setResolutionLevels(3);
84  this->_preInitialize = true;
85  this->_useCenterOfGravity = false;
86 
87  //optimizer
88  typename Superclass::ConcreteOptimizerType::ScalesType scales(6);
89  scales[0] = 1.0;
90  scales[1] = 1.0;
91  scales[2] = 1.0;
92  scales[3] = 1.0 / 1000;
93  scales[4] = 1.0 / 1000;
94  scales[5] = 1.0 / 1000;
95 
96  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetScales(scales);
97  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetMaximumStepLength(3.00);
98  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetMinimumStepLength(0.5);
99  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetNumberOfIterations(200);
100  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetRelaxationFactor(0.8);
101  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetGradientMagnitudeTolerance(1e-4);
102 
103  //metric
104  this->getConcreteMetricControl()->getConcreteMetric()->SetNumberOfHistogramBins(30);
105  this->getConcreteMetricControl()->getConcreteMetric()->SetUseAllPixels(true);
106  this->getConcreteMetricControl()->getConcreteMetric()->ReinitializeSeed();
107  this->getConcreteMetricControl()->getConcreteMetric()->UseExplicitPDFDerivativesOn();
108  }
109 
117  void
118  doInterLevelSetup() override
119  {
120  Superclass::doInterLevelSetup();
121 
122  if (this->getCurrentLevel() == 0)
123  {
124  typename Superclass::OptimizerBaseType::SVNLOptimizerBaseType::ScalesType scales(6);
125  scales[0] = 10.0;
126  scales[1] = 10.0;
127  scales[2] = 10.0;
128  scales[3] = 1.0 / 10000;
129  scales[4] = 1.0 / 10000;
130  scales[5] = 1.0 / 10000;
131  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetScales(scales);
132  }
133  else
134  {
135  this->getConcreteMetricControl()->getConcreteMetric()->SetUseAllPixels(false);
136 
137  typename Superclass::OptimizerBaseType::SVNLOptimizerBaseType::ScalesType scales(6);
138  scales[0] = 1.0;
139  scales[1] = 1.0;
140  scales[2] = 1.0;
141  scales[3] = 1.0 / 1000;
142  scales[4] = 1.0 / 1000;
143  scales[5] = 1.0 / 1000;
144 
145  this->getConcreteOptimizerControl()->getConcreteOptimizer()->SetScales(scales);
146 
147  unsigned int nrOfSmpl = ::itk::Math::Round<unsigned int, double>
148  (this->getMovingImage()->GetLargestPossibleRegion().GetNumberOfPixels() * 0.15);
149 
150  this->getConcreteMetricControl()->getConcreteMetric()->SetNumberOfSpatialSamples(nrOfSmpl);
151  }
152  };
153 
154  private:
155 
156  MultiModalRigidDefaultRegistrationAlgorithm(const Self& source); //purposely not implemented
157  void operator=(const Self&); //purposely not implemented
158  };
159 
160 }
161 
162 #endif
Default multimodal rigid registration algorithm for MITK.
void configureAlgorithm() override
Configure the algorithm with default parameters.
void doInterLevelSetup() override
Adjust optimizer scales and spatial sampling between resolution levels.
::map::algorithm::boxed::ITKEuler3DMattesMIMultiResRegistrationAlgorithm< TImageType, TImageType, ::map::algorithm::mitkMultiModalRigidDefaultRegistrationAlgorithmUIDPolicy, SealedFixedInterpolatorPolicyMacro< ::itk::LinearInterpolateImageFunction< TImageType, ::map::core::continuous::ScalarType > >, ::map::algorithm::itk::NoComponentInitializationPolicy > Superclass
Find image slices visible on a given plane.