ITK Working Group DTI: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
(New page: = Motivation = This page is intended to list proposals for changes to ITK to improve the processing of diffusion weighted and diffusion tensor images. {{ITK/Template/Footer}})
 
No edit summary
 
(One intermediate revision by the same user not shown)
Line 2: Line 2:


This page is intended to list proposals for changes to ITK to improve the processing of diffusion weighted and diffusion tensor images.
This page is intended to list proposals for changes to ITK to improve the processing of diffusion weighted and diffusion tensor images.
== casting support ==
neither itkDiffusionTensor3D or itkSymmetricSecondRankTensor have full numericTraits. DiffusionTensor3D doesn't have any.
static_cast< diffusionTensor3d > doesn't work. incorporating constructors like the following to both classes would enable casting.
template < typename TCoordRepB >
SymmetricSecondRankTensor( const SymmetricSecondRankTensor<TCoordRepB,NDimension> & pa ): BaseArray(pa) { };
== Pre/Post Multiply ==
the pre/post multiply methods in itkSymmetricSecondRankTensor have the wrong api [http://www.itk.org/Bug/view.php?id=8574 bug0008574]
the product of a symmetric matrix and a matrix is not symmetric.
A possible solution may be to add a method like
Self PreMultiply( const Self & m ) const;
which is ok because a sym matrix times a sym matrix is still symmetric. and then to modify
Self PreMultiply( const MatrixType & m ) const;
to check if m is symmetric, if it is then call Premultiply( static_cast<Self> m) if m isn't throw an exception.
Granted this will break existing code, however it will only break code that was giving incorrect results. I think that is preferable to maintaining the status quo.
== Rotation ==
A rotate method should be implemented [http://www.itk.org/Bug/view.php?id=8574 bug0008574] in itkSymmetricSecondRankTensor. I propose the following signatures to enable some generality.
  template<typename TMatrixValueType>
  Self Rotate( const Matrix<TMatrixValueType, NDimension, NDimension> & m);
  template<typename TMatrixValueType>
  Self Rotate( const vnl_matrix_fixed<TMatrixValueType, NDimension, NDimension> & m)
  {
    return this->Rotate( static_cast<Matrix<TMatrixValueType, NDimension, NDimension> >(m) );
  }
  template<typename TMatrixValueType>
  Self Rotate( const vnl_matrix<TMatrixValueType> & m)
  {
    return this->Rotate( static_cast<Matrix<TMatrixValueType> >(m) );
  }
additionally the application of a transform to dti images necesitates the computation of the spatial jacobian at the points of interest.
[http://www.itk.org/Bug/view.php?id=8786 bug0008786]. This bug proposed putting a numeric version of this computation in itkTransform, and to allow specific classes to override this method with analytical solutions.
== log-euclidean metric ==
2 methods are needed to implement the log-euclidean metic
# add GetMatrixExp( ) to SymmetricSecondRankTensor which computes the matrix exponential and returns a SymmetricSecondRankTensor
# add GetMatrixLog()  to DiffusionTensor3D, which computes the matrix log and returns a SymmetricSecondRankTensor


{{ITK/Template/Footer}}
{{ITK/Template/Footer}}

Latest revision as of 22:45, 24 April 2009

Motivation

This page is intended to list proposals for changes to ITK to improve the processing of diffusion weighted and diffusion tensor images.

casting support

neither itkDiffusionTensor3D or itkSymmetricSecondRankTensor have full numericTraits. DiffusionTensor3D doesn't have any.

static_cast< diffusionTensor3d > doesn't work. incorporating constructors like the following to both classes would enable casting.

template < typename TCoordRepB >
SymmetricSecondRankTensor( const SymmetricSecondRankTensor<TCoordRepB,NDimension> & pa ): BaseArray(pa) { };

Pre/Post Multiply

the pre/post multiply methods in itkSymmetricSecondRankTensor have the wrong api bug0008574 the product of a symmetric matrix and a matrix is not symmetric.

A possible solution may be to add a method like

Self PreMultiply( const Self & m ) const;

which is ok because a sym matrix times a sym matrix is still symmetric. and then to modify

Self PreMultiply( const MatrixType & m ) const;

to check if m is symmetric, if it is then call Premultiply( static_cast<Self> m) if m isn't throw an exception.

Granted this will break existing code, however it will only break code that was giving incorrect results. I think that is preferable to maintaining the status quo.

Rotation

A rotate method should be implemented bug0008574 in itkSymmetricSecondRankTensor. I propose the following signatures to enable some generality.

 template<typename TMatrixValueType>
 Self Rotate( const Matrix<TMatrixValueType, NDimension, NDimension> & m);
 template<typename TMatrixValueType>
 Self Rotate( const vnl_matrix_fixed<TMatrixValueType, NDimension, NDimension> & m)
 {
   return this->Rotate( static_cast<Matrix<TMatrixValueType, NDimension, NDimension> >(m) );
 }
 template<typename TMatrixValueType>
 Self Rotate( const vnl_matrix<TMatrixValueType> & m)
 {
   return this->Rotate( static_cast<Matrix<TMatrixValueType> >(m) );
 }

additionally the application of a transform to dti images necesitates the computation of the spatial jacobian at the points of interest. bug0008786. This bug proposed putting a numeric version of this computation in itkTransform, and to allow specific classes to override this method with analytical solutions.

log-euclidean metric

2 methods are needed to implement the log-euclidean metic

  1. add GetMatrixExp( ) to SymmetricSecondRankTensor which computes the matrix exponential and returns a SymmetricSecondRankTensor
  2. add GetMatrixLog() to DiffusionTensor3D, which computes the matrix log and returns a SymmetricSecondRankTensor




ITK: [Welcome | Site Map]