.. _lbl_registration_overview: Registration Overview --------------------- The goal of registration is to estimate the transformation which maps points from one image to the corresponding points in another image. The transformation estimated via registration is said to map points from the **fixed image** coordinate system to the **moving image** coordinate system. SimpleITK provides a configurable multi-resolution registration framework, implemented in the `ImageRegistrationMethod `_ class. In addition, a number of variations of the Demons registration algorithm are implemented independently from this class as they do not fit into the framework. Actual Code ........... Code illustrating various aspects of the registration framework can be found in the set of :ref:`examples ` which are part of the SimpleITK distribution and in the SimpleITK `Jupyter notebook repository `_. ImageRegistrationMethod ........................ To create a specific registration instance using the ImageRegistrationMethod you need to select several components which together define the registration instance: 1. Transformation. 2. Similarity metric. 3. Optimizer. 4. Interpolator. Transform +++++++++ The type of transformation defines the mapping between the two images. SimpleITK supports a variety of global and local transformations. The available transformations include: * `TranslationTransform `_. * `VersorTransform `_. * `VersorRigid3DTransform `_. * `Euler2DTransform `_. * `Euler3DTransform `_. * `Similarity2DTransform `_. * `Similarity3DTransform `_. * `ScaleTransform `_. * `ScaleVersor3DTransform `_. * `ScaleSkewVersor3DTransform `_. * `AffineTransform `_. * `BSplineTransform `_. * `DisplacementFieldTransform `_. * `Composite Transform `_. The parameters modified by the registration framework are those returned by the transforms **GetParameters()** method. This requires special attention when the using a composite transform, as the specific parameters vary based on the content of your composite transformation. Similarity Metric ++++++++++++++++++ The similarity metric reflects the relationship between the intensities of the images (identity, affine, stochastic...). The available metrics include: * `MeanSquares `_ . * `Demons `_. * `Correlation `_. * `ANTSNeighborhoodCorrelation `_. * `JointHistogramMutualInformation `_. * `MattesMutualInformation `_. In the ITKv4 and consequentially in SimpleITK all similarity metrics are minimized. For metrics whose optimum corresponds to a maximum, such as mutual information, the metric value is negated internally. The selection of a similarity metric is done using the ImageRegistrationMethod's **SetMetricAsX()** methods. Optimizer +++++++++ The optimizer is selected using the **SetOptimizerAsX()** methods. When selecting the optimizer you will also need to configure it (e.g. set the number of iterations). The available optimizers include: * Gradient free * `Exhaustive `_. * `Nelder-Mead downhill simplex `_ (Amoeba). * `Powell `_. * `1+1 evolutionary optimizer `_. * Gradient based: * `Gradient Descent `_. * `Gradient Descent Line Search `_. * `Regular Step Gradient Descent `_. * `Conjugate Gradient Line Search `_. * `L-BFGS-B `_. Limited memory Broyden, Fletcher, Goldfarb, Shannon, Bound Constrained (supports the use of simple constraints). Interpolator ++++++++++++ SimpleITK has a large number of interpolators. In most cases linear interpolation, the default setting, is sufficient. Unlike the similarity metric and optimizer, the interpolator is set using the **SetInterpolator** method which receives a `parameter `_ indicating the interpolator type. Features of Interest +++++++++++++++++++++ Transforms and image spaces =========================== While the goal of registration, as defined above, refers to a single transformation and two images, the ITKv4 registration and the SimpleITK ImageRegistrationMethod provide additional flexibility in registration configuration. From a coordinate system standpoint ITKv4 introduced the **virtual image domain**, making registration a symmetric process so that both images are treated similarly. As a consequence the ImageRegistrationMethod has methods for setting **three transformations**: 1. SetInitialTransform, T_o - composed with the moving initial transform, maps points from the virtual image domain to the moving image domain, modified during optimization. 2. SetFixedInitialTransform, T_f - maps points from the virtual image domain to the fixed image domain, never modified. 3. SetMovingInitialTransform T_m- maps points from the virtual image domain to the moving image domain, never modified. The transformation that maps points from the fixed to moving image domains is thus: p_moving=T_o(T_m(inverse(T_f)(p_fixed))) Multi Resolution Framework =========================== The ImageRegistrationMethod supports multi-resolution, pyramid, registration via two methods `SetShrinkFactorsPerLevel `_ and `SetSmoothingSigmasPerLevel `_. The former receives the shrink factors to apply when moving from one level of the pyramid to the next and the later receives the sigmas to use for smoothing when moving from level to level. Sigmas can be specified either in voxel units or physical units (default) using `SetSmoothingSigmasAreSpecifiedInPhysicalUnits `_. Sampling ======== For many registration tasks one can use a fraction of the image voxels to estimate the similarity measure. Aggressive sampling can significantly reduce the registration runtime. The ImageRegistration method allows you to specify how/if to sample the voxels, `SetMetricSamplingStrategy `_, and if using a sampling, what percentage, `SetMetricSamplingPercentage `_. Scaling in Parameter Space ========================== The ITKv4 framework introduced automated methods for estimating scaling factors for non-commensurate parameter units. These change the step size per parameter so that the effect of a unit of change has similar effects in physical space (think rotation of 1 radian and translation of 1 millimeter). The relevant methods are `SetOptimizerScalesFromPhysicalShift `_, `SetOptimizerScalesFromIndexShift `_ and `SetOptimizerScalesFromJacobian `_. In many cases this scaling is what determines if the the optimization converges to the correct optimum. Observing Registration Progress ================================ The ImageRegistrationMethod enables you to observe the registration process as it progresses. This is done using the Command-Observer pattern, associating callbacks with specific events. To associate a callback with a specific `event `_ use the `AddCommand `_ method.