00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkSymmetricEigenAnalysisImageFilter_h
00018 #define __itkSymmetricEigenAnalysisImageFilter_h
00019
00020 #include "itkUnaryFunctorImageFilter.h"
00021 #include "itkSymmetricEigenAnalysis.h"
00022
00023
00024 namespace itk
00025 {
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 namespace Functor {
00036
00037 template< typename TInput, typename TOutput >
00038 class SymmetricEigenAnalysisFunction
00039 {
00040 public:
00041 typedef typename TInput::RealValueType RealValueType;
00042 SymmetricEigenAnalysisFunction() {}
00043 ~SymmetricEigenAnalysisFunction() {}
00044 typedef SymmetricEigenAnalysis< TInput, TOutput > CalculatorType;
00045 bool operator!=( const SymmetricEigenAnalysisFunction & ) const
00046 {
00047 return false;
00048 }
00049 bool operator==( const SymmetricEigenAnalysisFunction & other ) const
00050 {
00051 return !(*this != other);
00052 }
00053
00054 inline TOutput operator()( const TInput & x )
00055 {
00056 TOutput eigenValues;
00057 m_Calculator.ComputeEigenValues( x, eigenValues );
00058 return eigenValues;
00059 }
00060
00062 void SetDimension( unsigned int n )
00063 {
00064 m_Calculator.SetDimension(n);
00065 }
00066
00072 typedef enum {
00073 OrderByValue=1,
00074 OrderByMagnitude,
00075 DoNotOrder
00076 }EigenValueOrderType;
00077
00079 void OrderEigenValuesBy( EigenValueOrderType order )
00080 {
00081 if( order == OrderByMagnitude )
00082 {
00083 m_Calculator.SetOrderEigenMagnitudes( true );
00084 }
00085 else if( order == DoNotOrder )
00086 {
00087 m_Calculator.SetOrderEigenValues( false );
00088 }
00089 }
00091
00092 private:
00093 CalculatorType m_Calculator;
00094 };
00095
00096 }
00097
00098
00122 template <typename TInputImage, typename TOutputImage=TInputImage>
00123 class ITK_EXPORT SymmetricEigenAnalysisImageFilter :
00124 public
00125 UnaryFunctorImageFilter<TInputImage,TOutputImage,
00126 Functor::SymmetricEigenAnalysisFunction<
00127 typename TInputImage::PixelType,
00128 typename TOutputImage::PixelType > >
00129 {
00130 public:
00132 typedef SymmetricEigenAnalysisImageFilter Self;
00133 typedef UnaryFunctorImageFilter<TInputImage,TOutputImage,
00134 Functor::SymmetricEigenAnalysisFunction<
00135 typename TInputImage::PixelType,
00136 typename TOutputImage::PixelType > >
00137 Superclass;
00138
00139 typedef SmartPointer<Self> Pointer;
00140 typedef SmartPointer<const Self> ConstPointer;
00141
00142 typedef typename Superclass::OutputImageType OutputImageType;
00143 typedef typename TOutputImage::PixelType OutputPixelType;
00144 typedef typename TInputImage::PixelType InputPixelType;
00145 typedef typename InputPixelType::ValueType InputValueType;
00146 typedef typename Superclass::FunctorType FunctorType;
00147
00153 typedef typename FunctorType::EigenValueOrderType EigenValueOrderType;
00154
00156 void OrderEigenValuesBy( EigenValueOrderType order )
00157 {
00158 this->GetFunctor().OrderEigenValuesBy( order );
00159 }
00160
00162 itkTypeMacro( SymmetricEigenAnalysisImageFilter, UnaryFunctorImageFilter );
00163
00165 itkNewMacro(Self);
00166
00168 void PrintSelf(std::ostream& os, Indent indent) const
00169 { this->Superclass::PrintSelf( os, indent ); }
00170
00173 void SetDimension( unsigned int p )
00174 {
00175 this->GetFunctor().SetDimension(p);
00176 }
00177
00178 #ifdef ITK_USE_CONCEPT_CHECKING
00179
00180 itkConceptMacro(InputHasNumericTraitsCheck,
00181 (Concept::HasNumericTraits<InputValueType>));
00182
00184 #endif
00185
00186 protected:
00187 SymmetricEigenAnalysisImageFilter() {};
00188 virtual ~SymmetricEigenAnalysisImageFilter() {};
00189
00190 private:
00191 SymmetricEigenAnalysisImageFilter(const Self&);
00192 void operator=(const Self&);
00193
00194 };
00195
00196
00197
00198 }
00199
00200 #endif
00201