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:
== Draft of Pixel Type implementation ==
+
Header for proposed itkSymmetricTensor.
  
The following pages contain a proposed implementation (in the spirit of extreme programming) of a pixel type for diffusion tensor images.
+
<nowiki>
 
+
/*=========================================================================
* [[NAMIC_Wiki:DTI:ITK-DiffusionTensorPixelType:Header|Header ]]
+
* [[NAMIC_Wiki:DTI:ITK-DiffusionTensorPixelType:Implementation|Implementation ]]
+
  Program:  Insight Segmentation & Registration Toolkit
* [[NAMIC_Wiki:DTI:ITK-DiffusionTensorPixelType:Test|Test ]]
+
  Module:    $RCSfile: itkSymmetricTensor.txx,v $
 
+
  Language:  C++
Other proposals have been made to the ITK mailing list.
+
  Date:      $Date: 2004/04/15 22:37:33 $
 
+
  Version:  $Revision: 1.10 $
* [[NAMIC_Wiki:DTI:ITK-TensorsAndTraits|Tensors and Traits]]
+
* [[NAMIC_Wiki:DTI:ITK-DTITubeSpatialObjectPoint|DTI Spatial Object]]
+
  Copyright (c) Insight Software Consortium. All rights reserved.
 +
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
 +
 +
      This software is distributed WITHOUT ANY WARRANTY; without even
 +
      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 +
      PURPOSE.  See the above copyright notices for more information.
 +
 +
=========================================================================*/
 +
 +
#ifndef __itkSymmetricTensor_h
 +
#define __itkSymmetricTensor_h
 +
 +
#include "itkFixedArray.h"
 +
#include "itkSymmetricTensorTraits.h"
 +
#include "vnl/vnl_matrix.h"
 +
 +
namespace itk
 +
{
 +
/** \class itkSymmetricTensor
 +
  *
 +
  */
 +
template
 +
  < typename TRealType = float, unsigned int VTensorDimension = 3,
 +
  typename TTensorTraits = SymmetricTensorTraits<TRealType,VTensorDimension>
 +
>
 +
class ITK_EXPORT SymmetricTensor :
 +
    public FixedArray< TRealType, VTensorDimension*(VTensorDimension+1)/2 >
 +
{
 +
  public:
 +
  /// The compact linear vector dimension of the tensor.
 +
  static const unsigned int NVectorDimension =
 +
    VTensorDimension*(VTensorDimension+1)/2;
 +
 +
  /** Standard class typedefs. */
 +
  typedef SymmetricTensor Self;
 +
  typedef SmartPointer<Self> Pointer;
 +
  typedef SmartPointer<const Self>  ConstPointer;
 +
  typedef FixedArray< TRealType, NVectorDimension > Superclass;
 +
 +
  /** Run-time type information (and related methods) */
 +
  itkTypeMacro(SymmetricTensor, FixedArray);
 +
 +
  /** Define the data type and the vector of data type used in calculations.
 +
  */
 +
  typedef TRealType RealType;
 +
 +
  typedef vnl_matrix_fixed<TRealType,VTensorDimension,VTensorDimension> VnlMatrixType;
 +
  /* Return vnl_matrix object. We do this here, since it's always the same,
 +
    * regardless of tensor size.
 +
    */
 +
  VnlMatrixType GetVnlMatrix() const;
 +
 +
  /** Compute eigenvalues. This is done in the traits class, since the best
 +
    * implementation depends on the actual tensor size.
 +
    */
 +
  void ComputeEigenvalues( double (&lambda)[VTensorDimension] ) const
 +
    {
 +
    TTensorTraits::ComputeEigenvalues( *this, lambda );
 +
    }
 +
 +
  SymmetricTensor() : Superclass() {}
 +
  SymmetricTensor(const Self& other) : Superclass( other ) {}
 +
  void operator=(const Self& other) { this->Superclass::operator=( other ); }
 +
 +
  /** This is part of a hack that allows reading a raw vector field using
 +
    * itkRawImageIO and subsequently casting to itkSymmetricTensor
 +
    * using itkCastImageFilter.
 +
    */
 +
  SymmetricTensor(const Vector<TRealType,NVectorDimension>& other) :
 +
    Superclass( other ) {}
 +
 +
  /** This is part of a hack that allows reading a raw vector field using
 +
    * itkRawImageIO and subsequently casting to itkSymmetricTensor
 +
    * using itkCastImageFilter.
 +
    */
 +
  typedef TRealType ComponentType;
 +
 +
  /** This is part of a hack that allows reading a raw vector field using
 +
    * itkRawImageIO and subsequently casting to itkSymmetricTensor
 +
    * using itkCastImageFilter.
 +
    */
 +
  static int GetNumberOfComponents()
 +
    { return VTensorDimension*(VTensorDimension+1)/2;}
 +
 +
  /** This is part of a hack that allows reading a raw vector field using
 +
    * itkRawImageIO and subsequently casting to itkSymmetricTensor
 +
    * using itkCastImageFilter.
 +
    */
 +
  void SetNthComponent(int c, const ComponentType& v)
 +
  {  this->operator[](c) = v; }
 +
 +
protected:
 +
  void PrintSelf(std::ostream& os, Indent indent) const;
 +
};
 +
 +
} // end namespace itk
 +
 +
#ifndef ITK_MANUAL_INSTANTIATION
 +
#include "itkSymmetricTensor.txx"
 +
#endif
 +
 +
#endif
 +
 +
</nowiki>

Revision as of 13:31, 18 December 2006

Home < NAMIC Wiki:DTI:ITK

Header for proposed itkSymmetricTensor.

 /*=========================================================================
 
   Program:   Insight Segmentation & Registration Toolkit
   Module:    $RCSfile: itkSymmetricTensor.txx,v $
   Language:  C++
   Date:      $Date: 2004/04/15 22:37:33 $
   Version:   $Revision: 1.10 $
 
   Copyright (c) Insight Software Consortium. All rights reserved.
   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
 
      This software is distributed WITHOUT ANY WARRANTY; without even
      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
      PURPOSE.  See the above copyright notices for more information.
 
 =========================================================================*/
 
 #ifndef __itkSymmetricTensor_h
 #define __itkSymmetricTensor_h
 
 #include "itkFixedArray.h"
 #include "itkSymmetricTensorTraits.h"
 #include "vnl/vnl_matrix.h"
 
 namespace itk
 {
 /** \class itkSymmetricTensor
  *
  */
 template
  < typename TRealType = float, unsigned int VTensorDimension = 3,
   typename TTensorTraits = SymmetricTensorTraits<TRealType,VTensorDimension>
 >
 class ITK_EXPORT SymmetricTensor :
     public FixedArray< TRealType, VTensorDimension*(VTensorDimension+1)/2 >
 {
  public:
   /// The compact linear vector dimension of the tensor.
   static const unsigned int NVectorDimension =
     VTensorDimension*(VTensorDimension+1)/2;
 
   /** Standard class typedefs. */
   typedef SymmetricTensor Self;
   typedef SmartPointer<Self> Pointer;
   typedef SmartPointer<const Self>  ConstPointer;
   typedef FixedArray< TRealType, NVectorDimension > Superclass;
 
   /** Run-time type information (and related methods) */
   itkTypeMacro(SymmetricTensor, FixedArray);
 
   /** Define the data type and the vector of data type used in calculations.
   */
   typedef TRealType RealType;
 
   typedef vnl_matrix_fixed<TRealType,VTensorDimension,VTensorDimension> VnlMatrixType;
   /* Return vnl_matrix object. We do this here, since it's always the same,
    * regardless of tensor size.
    */
   VnlMatrixType GetVnlMatrix() const;
 
   /** Compute eigenvalues. This is done in the traits class, since the best
    * implementation depends on the actual tensor size.
    */
   void ComputeEigenvalues( double (&lambda)[VTensorDimension] ) const
     {
     TTensorTraits::ComputeEigenvalues( *this, lambda );
     }
 
   SymmetricTensor() : Superclass() {}
   SymmetricTensor(const Self& other) : Superclass( other ) {}
   void operator=(const Self& other) { this->Superclass::operator=( other ); }
 
   /** This is part of a hack that allows reading a raw vector field using
     * itkRawImageIO and subsequently casting to itkSymmetricTensor
     * using itkCastImageFilter.
     */
   SymmetricTensor(const Vector<TRealType,NVectorDimension>& other) :
     Superclass( other ) {}
 
   /** This is part of a hack that allows reading a raw vector field using
     * itkRawImageIO and subsequently casting to itkSymmetricTensor
     * using itkCastImageFilter.
     */
   typedef TRealType ComponentType;
 
   /** This is part of a hack that allows reading a raw vector field using
     * itkRawImageIO and subsequently casting to itkSymmetricTensor
     * using itkCastImageFilter.
     */
   static int GetNumberOfComponents()
     { return VTensorDimension*(VTensorDimension+1)/2;}
 
   /** This is part of a hack that allows reading a raw vector field using
     * itkRawImageIO and subsequently casting to itkSymmetricTensor
     * using itkCastImageFilter.
     */
   void SetNthComponent(int c, const ComponentType& v)
   {  this->operator[](c) = v; }
 
 protected:
   void PrintSelf(std::ostream& os, Indent indent) const;
 };
 
 } // end namespace itk
 
 #ifndef ITK_MANUAL_INSTANTIATION
 #include "itkSymmetricTensor.txx"
 #endif
 
 #endif