diff --git a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h index 9ae62f88e1e186bebba8ad86399886961404c44e..27c2f2f5737bac0d6bb45479782539e2f5d578f1 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 20e1f43eac8447c346b5a1c5e45d5347c5cef4bc..3308074e3772738a12187a164246f4b13ee921ff 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() ); }