From 8765cb66820cefaaf70a23847a3e23a77bfdef02 Mon Sep 17 00:00:00 2001 From: Julien Michel <julien.michel@cnes.fr> Date: Tue, 10 Nov 2015 16:56:51 +0100 Subject: [PATCH] PERF: Same trick as for PCAImageFilter (separate statistics estimation from actual image processing) --- .../include/otbMNFImageFilter.h | 2 + .../include/otbMNFImageFilter.txx | 94 +++++++++++++------ 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h index 9ae62f88e1..27c2f2f573 100644 --- a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h +++ b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h @@ -166,6 +166,8 @@ protected: void PrintSelf(std::ostream& os, itk::Indent indent) const; /** Internal methods */ + void ForwardGenerateOutputInformation(); + void ReverseGenerateOutputInformation(); virtual void ForwardGenerateData(); virtual void ReverseGenerateData(); diff --git a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx index 20e1f43eac..3308074e37 100644 --- a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx +++ b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx @@ -104,7 +104,6 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf m_NumberOfPrincipalComponentsRequired = 0; this->GetOutput()->SetNumberOfComponentsPerPixel( theOutputDimension ); - break; } default: // should not go so far... @@ -112,26 +111,21 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf "Class should be templeted with FORWARD or INVERSE only...", ITK_LOCATION ); } -} -template <class TInputImage, class TOutputImage, - class TNoiseImageFilter, - Transform::TransformDirection TDirectionOfTransformation > -void -MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation > -::GenerateData () -{ + switch ( static_cast<int>(DirectionOfTransformation) ) - { - case static_cast<int>(Transform::FORWARD): - return ForwardGenerateData(); - case static_cast<int>(Transform::INVERSE): - return ReverseGenerateData(); - default: // should not go so far - throw itk::ExceptionObject(__FILE__, __LINE__, - "Class should be templated with FORWARD or INVERSE only...", - ITK_LOCATION ); - } + { + case static_cast<int>(Transform::FORWARD): + { + ForwardGenerateOutputInformation(); + break; + } + case static_cast<int>(Transform::INVERSE): + { + ReverseGenerateOutputInformation(); + break; + } + } } template <class TInputImage, class TOutputImage, @@ -139,7 +133,7 @@ template <class TInputImage, class TOutputImage, Transform::TransformDirection TDirectionOfTransformation > void MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation > -::ForwardGenerateData () +::ForwardGenerateOutputInformation() { typename InputImageType::Pointer inputImgPtr = const_cast<InputImageType*>( this->GetInput() ); @@ -157,10 +151,10 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf m_Normalizer->SetUseStdDev( false ); m_Normalizer->SetInput( inputImgPtr ); - m_Normalizer->Update(); + m_Normalizer->GetOutput()->UpdateOutputInformation(); if ( !m_GivenMeanValues ) - m_MeanValues = m_Normalizer->GetFunctor().GetMean(); + m_MeanValues = m_Normalizer->GetCovarianceEstimator()->GetMean(); if ( m_UseNormalization ) { @@ -213,11 +207,6 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf m_Transformer->SetInput( m_Normalizer->GetOutput() ); m_Transformer->SetMatrix( m_TransformationMatrix.GetVnlMatrix() ); - m_Transformer->GraftOutput( this->GetOutput() ); - m_Transformer->Update(); - - this->GraftOutput( m_Transformer->GetOutput() ); - } template <class TInputImage, class TOutputImage, @@ -225,9 +214,9 @@ template <class TInputImage, class TOutputImage, Transform::TransformDirection TDirectionOfTransformation > void MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation > -::ReverseGenerateData () +::ReverseGenerateOutputInformation() { - if ( !m_GivenTransformationMatrix ) + if ( !m_GivenTransformationMatrix ) { if ( !m_GivenCovarianceMatrix ) { @@ -313,12 +302,55 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf revMean[i] = - m_MeanValues[i]; m_Normalizer->SetMean( revMean ); m_Normalizer->SetUseStdDev( false ); - } + } m_Normalizer->SetInput( m_Transformer->GetOutput() ); + + +} + + +template <class TInputImage, class TOutputImage, + class TNoiseImageFilter, + Transform::TransformDirection TDirectionOfTransformation > +void +MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation > +::GenerateData () +{ + switch ( static_cast<int>(DirectionOfTransformation) ) + { + case static_cast<int>(Transform::FORWARD): + return ForwardGenerateData(); + case static_cast<int>(Transform::INVERSE): + return ReverseGenerateData(); + default: // should not go so far + throw itk::ExceptionObject(__FILE__, __LINE__, + "Class should be templated with FORWARD or INVERSE only...", + ITK_LOCATION ); + } +} + +template <class TInputImage, class TOutputImage, + class TNoiseImageFilter, + Transform::TransformDirection TDirectionOfTransformation > +void +MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation > +::ForwardGenerateData () +{ + m_Transformer->GraftOutput( this->GetOutput() ); + m_Transformer->Update(); + this->GraftOutput( m_Transformer->GetOutput() ); +} + +template <class TInputImage, class TOutputImage, + class TNoiseImageFilter, + Transform::TransformDirection TDirectionOfTransformation > +void +MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation > +::ReverseGenerateData () +{ m_Normalizer->GraftOutput( this->GetOutput() ); m_Normalizer->Update(); - this->GraftOutput( m_Normalizer->GetOutput() ); } -- GitLab