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