
Image registration using the Morphon algorithm: an ITK implementation
Please use this identifier to cite or link to this publication: http://hdl.handle.net/1926/1527 |
Published in The Insight Journal - 2009 January - June.
Submitted by Jerome Plumat on 02-13-2009.
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.
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.
Data
Code







Click here for more details.
Go here to access the main testing dashboard.
Reviews
Quick Comments
Comment by Jerome Plumat
Hello,
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 http://130.236.96.13/mi_old/Publications/pdfs/pettersson06.pdf#page=59 page 25 to 36)
- Normalised convolution and morphons for non-rigid registration (at http://130.236.96.13/mi_old/Publications/pdfs/pkb06c.pdf )
- Morphons: Paint on Priors and Elastic Canvas (http://130.236.96.13/mi_old/Publications/pdfs/ka05c.pdf)
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.

Hello,
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 http://130.236.96.13/mi_old/Publications/pdfs/pettersson06.pdf#page=59 page 25 to 36)
- Normalised convolution and morphons for non-rigid registration (at http://130.236.96.13/mi_old/Publications/pdfs/pkb06c.pdf )
- Morphons: Paint on Priors and Elastic Canvas (http://130.236.96.13/mi_old/Publications/pdfs/ka05c.pdf)
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
Hi,
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.

Hi,
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
Hi,
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!
Best

Hi,
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!
Best
Comment by Huang Cheng
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

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
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.

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.
Resources
![]() |
|
Download All | |
Download Paper , View Paper | |
Download Source code | |
Github |
Statistics more
![]() |
|
Global rating: | ![]() ![]() ![]() ![]() ![]() |
Review rating: | ![]() ![]() ![]() ![]() ![]() |
Code rating: | ![]() ![]() ![]() ![]() ![]() |
Paper Quality: |
![]() ![]() |
6 comments |
Information more
![]() |
|
Categories: | Deformable registration, PointSet, Registration |
Keywords: | registration, Morphon, dense deformation field |
Toolkits: | ITK, CMake |
Export citation: |
Share
![]() |
Linked Publications more
![]() |
||
![]() by Vercauteren T., Pennec X., Perchant A., Ayache N.
|
||
![]() by Padfield D., Miller J.
|
View license
Loading license...
Send a message to the author

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
for this
typedef typename NumericTraits< TOperator >::AccumulateType AccumulateRealType;
typedef typename NumericTraits
3) I changed the class declaration of the method ApplyUpdate into MorphonRegistrationFilter for:
ApplyUpdate(const TimeStepType& dt)