Slicer 5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
itkDiffusionTensor3DNearestCorrection.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Diffusion Applications
4 Module: $HeadURL$
5 Language: C++
6 Date: $Date$
7 Version: $Revision$
8
9 Copyright (c) Brigham and Women's Hospital (BWH) All Rights Reserved.
10
11 See License.txt or http://www.slicer.org/copyright/copyright.txt for details.
12
13==========================================================================*/
14#ifndef itkDiffusionTensor3DNearestCorrection_h
15#define itkDiffusionTensor3DNearestCorrection_h
16
17#include "itkUnaryFunctorImageFilter.h"
18#include "itkMath.h"
19#include <itkMatrix.h>
21
22namespace itk
23{
24
40namespace Functor
41{
42
43template <class TInput, class TOutput>
45{
46public:
49 bool operator!=( const DiffusionTensor3DNearest & other ) const
50 {
51 return *this != other;
52 }
53
54 bool operator==( const DiffusionTensor3DNearest & other ) const
55 {
56 return !( *this != other );
57 }
58
59 inline DiffusionTensor3D<TOutput> operator()
60 ( const DiffusionTensor3D<TInput> & tensorA )
61 {
62 DiffusionTensor3DExtended<double> tensorDouble( tensorA );
63 Matrix<double, 3, 3> B;
64 Matrix<double, 3, 3> A;
65 Matrix<double, 3, 3> transpose;
66 Matrix<double, 3, 3> H;
67 Matrix<double, 3, 3> mat;
68 A = tensorDouble.GetTensor2Matrix();
69 transpose = A.GetTranspose();
70 B = (A + transpose) / 2;
71 transpose = B.GetTranspose();
72 H = transpose * B;
73 tensorDouble.SetTensorFromMatrix(H);
74
77 tensorDouble.ComputeEigenAnalysis( eigenValues, eigenVectors );
78 for( int i = 0; i < 3; i++ )
79 {
80 mat[i][i] = sqrt(eigenValues[i]);
81 }
82 eigenVectors = eigenVectors.GetTranspose();
83 H = eigenVectors * mat * eigenVectors.GetInverse();
84 mat = (B + H) / 2;
85 tensorDouble.SetTensorFromMatrix( mat );
86 tensorDouble.ComputeEigenAnalysis( eigenValues, eigenVectors ); // sometimes very small negative eigenvalues
87 // appear; we suppress them
88 mat.Fill(0);
89 for( int i = 0; i < 3; i++ )
90 {
91 mat[i][i] = ( eigenValues[i] <= 0 ? ITK_DIFFUSION_TENSOR_3D_ZERO : eigenValues[i] );
92 }
93 eigenVectors = eigenVectors.GetTranspose();
94 tensorDouble.SetTensorFromMatrix<double>( eigenVectors * mat * eigenVectors.GetInverse() );
95
96 DiffusionTensor3D<TOutput> tensor;
97 for( int i = 0; i < 6; i++ )
98 {
99 tensor[i] = ( TOutput ) tensorDouble[i];
100 }
101 return tensor;
102 }
103
104};
105} // end of Functor namespace
106
107template <class TInputImage, class TOutputImage>
109 public
110 UnaryFunctorImageFilter<TInputImage, TOutputImage,
111 Functor::DiffusionTensor3DNearest<
112 typename TInputImage::PixelType::ComponentType,
113 typename TOutputImage::PixelType::ComponentType> >
114{
115public:
118 typedef UnaryFunctorImageFilter<TInputImage, TOutputImage,
119 Functor::DiffusionTensor3DNearest<typename TInputImage::PixelType,
120 typename TOutputImage::PixelType> > Superclass;
121 typedef SmartPointer<Self> Pointer;
122 typedef SmartPointer<const Self> ConstPointer;
123
126 void operator=( const Self & ) = delete;
127
130
133
134#ifdef ITK_USE_CONCEPT_CHECKING
136 itkConceptMacro( InputTensorTypeCheck,
137 ( Concept::SameType<DiffusionTensor3D<typename TInputImage::PixelType::ComponentType>,
138 typename TInputImage::PixelType> ) );
139 itkConceptMacro( OutputTensorTypeCheck,
140 ( Concept::SameType<DiffusionTensor3D<typename TOutputImage::PixelType::ComponentType>,
141 typename TOutputImage::PixelType> ) );
142
144#endif
145protected:
148};
149
150} // end namespace itk
151
152#endif
void SetTensorFromMatrix(Matrix< C, 3, 3 > matrix)
itkTypeMacro(DiffusionTensor3DNearestCorrectionFilter, UnaryFunctorImageFilter)
UnaryFunctorImageFilter< TInputImage, TOutputImage, Functor::DiffusionTensor3DNearest< typename TInputImage::PixelType, typename TOutputImage::PixelType > > Superclass
~DiffusionTensor3DNearestCorrectionFilter() override=default
DiffusionTensor3DNearestCorrectionFilter(const Self &)=delete
bool operator!=(const DiffusionTensor3DNearest &other) const
bool operator==(const DiffusionTensor3DNearest &other) const
#define ITK_DIFFUSION_TENSOR_3D_ZERO
Simplified inverse ITK transforms.