Implementation of local structure tensor and enhancement anisotropic diffusion filters in ITK
Enquobahrie A., Yang H., Aylward S.
Kitware Inc
logo

Please use this identifier to cite or link to this publication: http://hdl.handle.net/10380/3199
This paper describes implementation of local structure tensor and anisotropic enhancement diffusion filters using the Insight Toolkit. The anisotropic diffusion filters are implemented using ITK's finite difference solver framework. The filters are used to implement the 3D edge-enhancing diffusion ( EED), coherence-enhancing diffusion (CED) and hybrid diffusion with continuous switch(HDCS) noise filtering algorithms described in Mendrik et al[1].

The most up-to-date version of the code presented in this paper is distributed with the TubeTK project:
http://public.kitware.com/Wiki/TubeTK
Data
minus 3 Datasets (298Kb)
Code
minus Automatic Testing Results by Insight-Journal Dashboard on Thu Aug 19 03:36:47 2010 for revision #1
starstarstarstarstar expertise: 5 sensitivity: 3.3
yellow This project passed all of its tests.
Click here for more details.

Go here to access the main testing dashboard.

Reviews
minus Error: Eigenvectors of the structure tensor are not sorted! by Adriƫnne Mendrik on 2011-12-09 06:20:22 for revision #1
starstarstarstarstar expertise: 5 sensitivity: 4.3
yellow
Summary:

Dear authors,


Thanks for implementing these filters in ITK. However, I agree with Fethallah Benmansour that there was a loss of precision in the structure tensor code and the outer product components of the structure tensor needed to be smoothed using an additional parameter rho.


I found another error in the function "UpdateDiffusionTensorImage()" of all three filters: itkAnisotropicCoherenceEnhancingDiffusionImageFilter.txx, itkAnisotropicEdgeEnhancementDiffusionImageFilter.txx, itkAnisotropicHybridDiffusionImageFilter.txx.


The eigenvalues of the structure tensor are neatly ordered in decreasing order, however the corresponding eigenvectors of the structure tensor are not! This will cause all diffusion filters (EED, CED, HDCS) to work incorrectly...

Hypothesis:

The diffusion tensor is based on the orientation of the structure tensor. The first eigenvector of the structure tensor is assumed to point into the direction with the highest contrast (largest eigenvalue), however, in the current version of the code, the first eigenvector points into the direction of the lowest contrast (still sorted in ascending order). Because the eigenvalues are sorted, the largest eigenvalue is 'coupled' to the eigenvector with originally the lowest eigenvalue, therefore filtering across edges will take place instead of along edges...


 

Evidence:

The eigenvectors can be ordered after ordering the eigenvalues in the function UpdateDiffusionTensorImage(), by for example adding the following code:



    unsigned int vectorLength = 3; // Eigenvector length
    EigenVectorMatrixType eigenVectorMatrix;
    eigenVectorMatrix = eigenVectorImageIterator.Get();

    itk::VariableLengthVector<double> firstEigenVector( vectorLength );
    itk::VariableLengthVector<double> secondEigenVector( vectorLength );
    itk::VariableLengthVector<double> thirdEigenVector( vectorLength );
    for ( unsigned int i=0; i < vectorLength; i++ ) {
      // Get eigenvectors belonging to eigenvalue order
      firstEigenVector[i] = eigenVectorMatrix[largestEigenValueIndex][i];
      secondEigenVector[i] = eigenVectorMatrix[middleEigenValueIndex][i];
      thirdEigenVector[i] = eigenVectorMatrix[smallestEigenValueIndex][i];
     
      // Set eigenVectorMatrix in correct order
      eigenVectorMatrix[0][i] = firstEigenVector[i];
      eigenVectorMatrix[1][i] = secondEigenVector[i];
      eigenVectorMatrix[2][i] = thirdEigenVector[i];
    }

minus A couple of errors by Fethallah Benmansour on 2011-01-21 11:58:22 for revision #1
starstarstarstarstar expertise: 5 sensitivity: 2.7
yellow
Summary:

 


Dear authors,


 


I found a couple of errors in the provided implementation of the structure tensor.


-- First, in line 260 of itkStructureTensorRecursiveGaussianImageFilter.txx.


std::vector<PixelType> tmp( numberTensorElements );


 


PixelType might be uchar or ushort, and therefore yields a loss of precision. I replaced PixelType by InternalRealType.


 


-- Second, the smoothing of the outer product' components was not performed.


This additional filtering have been added.


 


 


Attached the modified *.h and *.txx files.


Regards,


 

Evidence:

 


 

review itkStructureTensorRecursiveGaussianImageFilter.zip (4Kb)

Add a new review
Quick Comments


Resources
backyellow
Download Package
Download Paper, View Paper
Download Source code
Github

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

Information more
backyellow
Categories: Anisotropic blurring filters, Blurring filters, Filtering
Keywords: Noise filtering, Diffusion, Anisotropic, Tensor,
Toolkit: ITK
Export citation:

Share
backyellow
Share

Associated Publications more
backyellow
Camino: Diffusion MRI reconstruction and processing

View license
Loading license...

Send a message to the author
main_flat
Powered by Midas