Difference between revisions of "NAMIC Wiki:DTI:ITK"

From NAMIC Wiki
Jump to: navigation, search
m (Update from Wiki)
m (Update from Wiki)
Line 1: Line 1:
The DiffusionTensorPixel type derives from the itk::FixedArray<> instantiated for a fixed size of 6 elements. The rationale behind it is that we are dealing with symmetric tensors in this particular case, therefore for the sake of memory use we only store 6 components. The type however will also implement a matrix-like notation in order to provide a natural notation for tensor operations.
+
== Draft of Pixel Type implementation ==
  
A short version of the class essentials is below, a full compilable version is at the end of this page
+
The following pages contain a proposed implementation (in the spirit of extreme programming) of a pixel type for diffusion tensor images.
  
+
* [[NAMIC_Wiki:DTI:ITK-DiffusionTensorPixelType:Header|Header ]]
template < typename TComponent = float >
+
* [[NAMIC_Wiki:DTI:ITK-DiffusionTensorPixelType:Implementation|Implementation ]]
class DiffusionTensorPixel: public FixedArray<TComponent,6>
+
* [[NAMIC_Wiki:DTI:ITK-DiffusionTensorPixelType:Test|Test ]]
{
 
public:
 
  typedef DiffusionTensorPixel  Self;
 
  typedef FixedArray<TComponent, 6> SuperClass;
 
  itkStaticConstMacro(Dimension, unsigned int, 6);
 
  itkStaticConstMacro(Length, unsigned int, 6);
 
  typedef FixedArray<TComponent, 6> BaseArray;
 
 
  /** Array of eigen-values. */
 
  typedef FixedArray<TComponent, 3> EigenValuesArray;
 
  typedef Matrix<TComponent, 3, 3>  EigenVectorsMatrix;
 
 
  /** Matrix notation, in const and non-const forms. */
 
  ValueType & operator()( unsigned int i, unsigned int j);
 
  const ValueType & operator()( unsigned int i, unsigned int j) const;
 
};
 
 
 
  
<br /> Here is the full version of the class. This code is compilable using ITK 2.0.
+
Other proposals have been made to the ITK mailing list.
  
<nowiki>
+
* [[NAMIC_Wiki:DTI:ITK-TensorsAndTraits|Tensors and Traits]]
#ifndef __itkDiffusionTensorPixel_h
+
* [[NAMIC_Wiki:DTI:ITK-DTITubeSpatialObjectPoint|DTI Spatial Object]]
#define __itkDiffusionTensorPixel_h
 
 
// Undefine an eventual DiffusionTensorPixel macro
 
#ifdef DiffusionTensorPixel
 
#undef DiffusionTensorPixel
 
#endif
 
 
#include <itkIndent.h>
 
#include <itkFixedArray.h>
 
#include <itkMatrix.h>
 
#include "vnl/vnl_math.h"
 
 
namespace itk
 
{
 
 
/** \class DiffusionTensorPixel
 
  * \brief Represent a diffusion tensor as used in DTI images.
 
  *
 
  * This class implements a 3D symmetric tensor as it is used for representing
 
  * diffusion of water molecules in Diffusion Tensor Images.
 
  *
 
  * Since DiffusionTensorPixel is a subclass of Array, you can access its components as:
 
  *
 
  * typedef itk::DiffusionTensorPixel< float >    TensorPixelType;
 
  * TensorPixelType tensor;
 
  *
 
  *  tensor[0] = 1.233;
 
  *  tensor[1] = 1.456;
 
  *
 
  * for convenience the indexed access is also available as
 
  *
 
  *  tensor(0,0) = 1.233;
 
  *  tensor(2,0) = 1.233;
 
  *
 
  * The Tensor in principle represents a 3x3 matrix, but given that it is
 
  * always symmetric the representation can be compacted into a 6-elements
 
  * array that derives from the itk::FixedArray<T>
 
  *
 
  * \ingroup ImageObjects
 
  */
 
 
template < typename TComponent = float >
 
class DiffusionTensorPixel: public FixedArray<TComponent,6>
 
{
 
public:
 
  /** Standard class typedefs. */
 
  typedef DiffusionTensorPixel  Self;
 
  typedef FixedArray<TComponent, 6> SuperClass;
 
 
  /** Dimension of the vector space. */
 
  itkStaticConstMacro(Dimension, unsigned int, 6);
 
  itkStaticConstMacro(Length, unsigned int, 6);
 
 
  /** Convenience typedefs. */
 
  typedef FixedArray<TComponent, 6> BaseArray;
 
 
  /** Array of eigen-values. */
 
  typedef FixedArray<TComponent, 3> EigenValuesArray;
 
 
  /** Matrix of eigen-vectors. */
 
  typedef Matrix<TComponent, 3, 3> EigenVectorsMatrix;
 
 
  /**  Define the component type. */
 
  typedef TComponent ComponentType;
 
  typedef typename SuperClass::ValueType ValueType;
 
 
  /** Default constructor has nothing to do. */
 
  DiffusionTensorPixel() {this->Fill(0);}
 
  DiffusionTensorPixel (const ComponentType& r) { this->Fill(r); }
 
 
  /** Pass-through constructor for the Array base class. */
 
  DiffusionTensorPixel(const Self& r): BaseArray(r) {}
 
  DiffusionTensorPixel(const ComponentType  r[6]): BaseArray(r) {}
 
 
  /** Pass-through assignment operator for the Array base class. */
 
  Self& operator= (const Self& r);
 
  Self& operator= (const ComponentType r[6]);
 
 
  /** Aritmetic operations between pixels. Return a new DiffusionTensorPixel. */
 
  Self operator+(const Self &vec) const;
 
  Self operator-(const Self &vec) const;
 
  const Self & operator+=(const Self &vec);
 
  const Self & operator-=(const Self &vec);
 
  Self operator*(const ComponentType &f) const;
 
 
 
  /** Return the number of components. */
 
  static int GetNumberOfComponents(){ return 6;}
 
 
  /** Return the value for the Nth component. */
 
  ComponentType GetNthComponent(int c) const
 
    { return this->operator[](c); }
 
 
  /** Set the Nth component to v. */
 
  void SetNthComponent(int c, const ComponentType& v)
 
    {  this->operator[](c) = v; }
 
 
  /** Matrix notation, in const and non-const forms. */
 
  ValueType & operator()( unsigned int i, unsigned int j);
 
  const ValueType & operator()( unsigned int i, unsigned int j) const;
 
 
};
 
 
 
template< typename TComponent  >
 
ITK_EXPORT std::ostream& operator<<(std::ostream& os,
 
                                    const DiffusionTensorPixel<TComponent> & c);
 
template< typename TComponent  >
 
ITK_EXPORT std::istream& operator>>(std::istream& is,
 
                                          DiffusionTensorPixel<TComponent> & c);
 
 
} // end namespace itk
 
 
#ifndef ITK_MANUAL_INSTANTIATION
 
#include "itkDiffusionTensorPixel.txx"
 
#endif
 
 
#endif
 
</nowiki>
 

Revision as of 14:06, 18 December 2006

Home < NAMIC Wiki:DTI:ITK

Draft of Pixel Type implementation

The following pages contain a proposed implementation (in the spirit of extreme programming) of a pixel type for diffusion tensor images.

Other proposals have been made to the ITK mailing list.