Image registration using the Morphon algorithm: an ITK implementation

Please use this identifier to cite or link to this publication:
Medical image registration is becoming a more and more useful component of a large number of applications. The presented method aims to enrich the ITK library. This method, called Morphon registration algorithm, computes a dense deformation field accepting inputs from different intensity contrasts. This article presents its implementation within the Insight Toolkit.
In this paper, we provide a brief description of the algorithm, a presentation of the implementation, the justification of our modified classes and the results given by the algorithm. We demonstrate the algorithm in application of different images intesity constrasts and dimensions.
minus 2 Datasets (346Kb)
minus Automatic Testing Results by Insight-Journal Dashboard on Thu Mar 5 10:57:59 2009 for revision #4
starstarstarstarstar expertise: 5 sensitivity: 5
yellow This project passed all of its tests.
Click here for more details.

Go here to access the main testing dashboard.

There is no review at this time. Be the first to review this publication!

Quick Comments
Comment by Ariel Hernán Curiale yellow
Hy Jerome,
I finally find were was the problem. The ApplyUpdate was not doing using ITK 4.1 and ITK 4.2. Another thing was that I found a bug (I suppose) in the class NeighborhoodInnerProduct.

To compile and execute your code using ITK 4.1.0 or 4.2.0 I have needed to do this:

1) I duplicate the class NeighborhoodInnerProduct and use the new class instead the ITK version.

2) I changed the following lines into the methods operator():

typedef typename NumericTraits< InputPixelRealType >::AccumulateType AccumulateRealType;
typedef typename NumericTraits::ValueType OutputPixelValueType;

for this

typedef typename NumericTraits< TOperator >::AccumulateType AccumulateRealType;
typedef typename NumericTraits::RealType OutputPixelValueType;

3) I changed the class declaration of the method ApplyUpdate into MorphonRegistrationFilter for:
ApplyUpdate(const TimeStepType& dt)
Comment by Jerome Plumat yellow
Thanks for using this code.
First of all, I have not been work on this code nor with ITK since a while and my answers may be no so precise.

First, the command I gave as example should work on the hand image. If not I suggest to have a look on the convolution filters and on the image reader.

The deformation field is updated and weighted thanks to the certainty matrix. The certainty matrix has no "real interest" by itself (according to the best of my knowledges). It is the respond, at a certain sampling, of the convolution of the image by the directional filters. The certainties are a linear transformation of the convoluted image.

The certainty matrix is the result of Pr. Andersson and Knutsson works from Linkoping University. I recommend the following papers
- Non-rigid registration using morphons (at page 25 to 36)
- Normalised convolution and morphons for non-rigid registration (at )
- Morphons: Paint on Priors and Elastic Canvas (
Well, also all the work of Knutsson. It mostly weights the deformation fields depending of the information on the image (a line or an edge has a higher certainty than a smooth area for example).

I hope this helps.
Comment by Ariel Hernán Curiale yellow
I can't reproduce the registration result using ITK4.1 or 4.2. I don't understand very well how are computed the coefficient and why the metric is go up instead go down. The result of the registration is really bad, the algorithm destroy the accumulated image in each iteration.
Comment by Jerome Plumat yellow
I don't have the parameters (long time ago I did not have a look on this code!).
According to me the error is mostly due the fact that the size along z axis is not sufficient. The filters have sizes 9 (along all directions). Thus, you may have a sufficiently big volume to let the convolution take sense. The strict minimum is of course 9 but due to padding in the convolution you may ask for bigger sizes.

Also note that the 3D convolution is very slow in ITK!

Comment by Huang Cheng yellow
I changed the level numbers to 10 and it works without throwing any exception. I guess the number of slices in z-axis is too small, so after resampling 13 times, the number goes down to smaller than 4 and cause the exception.

Here is the parameter I used for testing:
10 1.5 10 1.5 10 1.5 10 1.5 10 1.5 10 1.5 10 1.5 10 1.5 10 1.5 10 1.5
Comment by Huang Cheng yellow
Could you please post the parameters you used for the 3D registration? I tried "10 1.5 10 1.5 10 4.5 10 4.5 10 4.5 10 2 10 2 10 2 10 2 10 2 10 2 10 3.5 10 2.5" you mentioned in the 2D registration case but failed. It keeps throw exception out.

Here is the exception information:
Description: itk::ERROR: RecursiveGaussianImageFilter(0000000002AA69D0): The number of pixels along direction 2 is less than 4. This filter requires a minimum of four pixels along the dimension to be processed.

Download All
Download Paper , View Paper
Download Source code

Statistics more
Global rating: starstarstarstarstar
Review rating: starstarstarstarstar [review]
Code rating: starstarstarstarstar
Paper Quality: plus minus

Information more
Categories: Deformable registration, PointSet, Registration
Keywords: registration, Morphon, dense deformation field
Toolkits: ITK, CMake
Export citation:


Linked Publications more
Diffeomorphic Demons Using ITK's Finite Difference Solver Hierarchy Diffeomorphic Demons Using ITK's Finite Difference Solver Hierarchy
by Vercauteren T., Pennec X., Perchant A., Ayache N.
A Label Geometry Image Filter for Multiple Object Measurement A Label Geometry Image Filter for Multiple Object Measurement
by Padfield D., Miller J.

View license
Loading license...

Send a message to the author
Powered by Midas