Slicer 5.4
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
itkDiffusionTensor3DAbsCorrection.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 itkDiffusionTensor3DAbsCorrection_h
15#define itkDiffusionTensor3DAbsCorrection_h
16
17#include "itkUnaryFunctorImageFilter.h"
18#include "itkMath.h"
19#include <itkMatrix.h>
21
22namespace itk
23{
24
44namespace Functor
45{
46
47template <class TInput, class TOutput>
49{
50public:
53 bool operator!=( const DiffusionTensor3DAbs & other ) const
54 {
55 return *this != other;
56 }
57
58 bool operator==( const DiffusionTensor3DAbs & other ) const
59 {
60 return !( *this != other );
61 }
62
63 inline DiffusionTensor3D<TOutput> operator()
64 ( const DiffusionTensor3D<TInput> & A )
65 {
66 DiffusionTensor3D<TOutput> tensor;
67 Matrix<double, 3, 3> mat;
68 Matrix<double, 3, 3> matcorrect;
71 DiffusionTensor3DExtended<double> tensorDouble( A );
72 tensorDouble.ComputeEigenAnalysis( eigenValues, eigenVectors );
73 for( int i = 0; i < 3; i++ )
74 {
75 mat[i][i] = ( eigenValues[i] < 0 ? -eigenValues[i] : eigenValues[i] );
76 }
77 eigenVectors = eigenVectors.GetTranspose();
78 matcorrect = eigenVectors * mat * eigenVectors.GetInverse();
79 tensorDouble.SetTensorFromMatrix( matcorrect );
80 for( int i = 0; i < 6; i++ )
81 {
82 tensor[i] = ( TOutput ) tensorDouble[i];
83 }
84 return tensor;
85 }
86
87};
88} // end of Functor namespace
89
90template <class TInputImage, class TOutputImage>
92 public
93 UnaryFunctorImageFilter<TInputImage, TOutputImage,
94 Functor::DiffusionTensor3DAbs<
95 typename TInputImage::PixelType::ComponentType,
96 typename TOutputImage::PixelType::ComponentType> >
97{
98public:
101 typedef UnaryFunctorImageFilter<TInputImage, TOutputImage,
102 Functor::DiffusionTensor3DAbs<typename TInputImage::PixelType,
103 typename TOutputImage::PixelType> > Superclass;
104 typedef SmartPointer<Self> Pointer;
105 typedef SmartPointer<const Self> ConstPointer;
106
109 void operator=( const Self & ) = delete;
110
113
116
117#ifdef ITK_USE_CONCEPT_CHECKING
119 itkConceptMacro( InputTensorTypeCheck,
120 ( Concept::SameType<DiffusionTensor3D<typename TInputImage::PixelType::ComponentType>,
121 typename TInputImage::PixelType> ) );
122 itkConceptMacro( OutputTensorTypeCheck,
123 ( Concept::SameType<DiffusionTensor3D<typename TOutputImage::PixelType::ComponentType>,
124 typename TOutputImage::PixelType> ) );
125
127#endif
128protected:
131};
132
133} // end namespace itk
134
135#endif
Computes pixel-wise the absolute value of the diffusion tensor eigenvalues.
~DiffusionTensor3DAbsCorrectionFilter() override=default
void operator=(const Self &)=delete
DiffusionTensor3DAbsCorrectionFilter(const Self &)=delete
itkTypeMacro(DiffusionTensor3DAbsCorrectionFilter, UnaryFunctorImageFilter)
UnaryFunctorImageFilter< TInputImage, TOutputImage, Functor::DiffusionTensor3DAbs< typename TInputImage::PixelType, typename TOutputImage::PixelType > > Superclass
bool operator==(const DiffusionTensor3DAbs &other) const
bool operator!=(const DiffusionTensor3DAbs &other) const
Simplified inverse ITK transforms.