From 7ec6cb8508a6943ac1a195d7ce09442b9bafb2d6 Mon Sep 17 00:00:00 2001 From: Angelos Tzotsos <tzotsos@gmail.com> Date: Sat, 20 Oct 2012 17:08:08 +0300 Subject: [PATCH] BUG: Split Ternary Filter to 2 parts --- .../otbLmvmPanSharpeningFusionImageFilter.h | 58 ++++++++++++++----- .../otbLmvmPanSharpeningFusionImageFilter.txx | 25 ++++---- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.h b/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.h index 822647d89a..0ccd69fb1a 100644 --- a/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.h +++ b/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.h @@ -67,7 +67,8 @@ public: TPanImageType::ImageDimension> InternalImageType; /** Single band Xs image type */ - typedef otb::Image<TXsImageType::PixelType, + typedef typename TXsImageType::PixelType XsPixelType; + typedef otb::Image<XsPixelType, TXsImageType::ImageDimension> XsBandImageType; /** Internal image type used as Xs smoothing and local standard deviation filter output */ @@ -122,19 +123,38 @@ private: * This functor applies the LMVM * operation. It is intended for internal use only. */ - class FusionFunctor + class FusionFunctor1 { public: // Implement the fusion as a six arguments operator - typename TOutputImageType::PixelType operator()(const typename TXsImageType::PixelType& xsPixel, - const TInternalPrecision& smoothPanchroPixel, - const typename InternalVectorImageType::PixelType& smoothXsPixel, + typename TOutputImageType::PixelType operator()(const TInternalPrecision& smoothPanchroPixel, const typename InternalVectorImageType::PixelType& stdXsPixel, - const TInternalPrecision& stdPanchroPixel, const typename TPanImageType::PixelType& sharpPanchroPixel) const { // Build output pixel - typename TOutputImageType::PixelType output(xsPixel.Size()); + typename TOutputImageType::PixelType output(stdXsPixel.Size()); + + // Perform fusion for each band with appropriate casting + for(unsigned int i = 0; i < stdXsPixel.Size(); ++i) + { + output[i] = static_cast<typename TOutputImageType::InternalPixelType>( + (sharpPanchroPixel - (smoothPanchroPixel * stdXsPixel[i]))); + } + // Returns the output pixel + return output; + } + }; + + class FusionFunctor2 + { + public: + // Implement the fusion as a six arguments operator + typename TOutputImageType::PixelType operator()(const typename TOutputImageType::PixelType& functor1Pixel, + const typename InternalVectorImageType::PixelType& smoothXsPixel, + const TInternalPrecision& stdPanchroPixel) const + { + // Build output pixel + typename TOutputImageType::PixelType output(smoothXsPixel.Size()); TInternalPrecision scale = 1.; @@ -144,10 +164,10 @@ private: } // Perform fusion for each band with appropriate casting - for(unsigned int i = 0; i < xsPixel.Size(); ++i) + for(unsigned int i = 0; i < smoothXsPixel.Size(); ++i) { output[i] = static_cast<typename TOutputImageType::InternalPixelType>( - (((sharpPanchroPixel - (smoothPanchroPixel * stdXsPixel[i])) * scale) + smoothXsPixel[i])); + ((functor1Pixel[i] * scale) + smoothXsPixel[i])); } // Returns the output pixel return output; @@ -158,17 +178,25 @@ private: * Typedef of the TernaryFunctorImageFilter applying the fusion functor to * p, p_smooth, p_std, xs_smooth, xs_std and xs. */ - typedef itk::TernaryFunctorImageFilter<TXsImageType, - InternalImageType, - InternalVectorImageType, + typedef itk::TernaryFunctorImageFilter<InternalImageType, InternalVectorImageType, - InternalImageType, TPanImageType, TOutputImageType, - FusionFunctor> FusionFilterType; + FusionFunctor1> FusionStep1FilterType; /** Pointer to the fusion filter */ - typename FusionFilterType::Pointer m_FusionFilter; + typename FusionStep1FilterType::Pointer m_FusionStep1Filter; + + + typedef itk::TernaryFunctorImageFilter<TOutputImageType, + InternalVectorImageType, + InternalImageType, + TOutputImageType, + FusionFunctor2> FusionStep2FilterType; + + /** Pointer to the fusion filter */ + typename FusionStep1FilterType::Pointer m_FusionStep2Filter; + /** Typedef of the convolution filter performing Pan smoothing */ typedef otb::ConvolutionImageFilter diff --git a/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.txx b/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.txx index 73b3983f86..45ca9f52f7 100644 --- a/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.txx +++ b/Code/Fusion/otbLmvmPanSharpeningFusionImageFilter.txx @@ -50,7 +50,8 @@ LmvmPanSharpeningFusionImageFilter m_Filter.Fill(1); // Instantiate fusion filter - m_FusionFilter = FusionFilterType::New(); + m_FusionStep1Filter = FusionStep1FilterType::New(); + m_FusionStep2Filter = FusionStep2FilterType::New(); // Set-up progress reporting m_ProgressAccumulator = itk::ProgressAccumulator::New(); @@ -59,7 +60,8 @@ LmvmPanSharpeningFusionImageFilter m_ProgressAccumulator->RegisterInternalFilter(m_PanNoiseFilter, 0.2); m_ProgressAccumulator->RegisterInternalFilter(m_XsVectorConvolutionFilter, 0.2); m_ProgressAccumulator->RegisterInternalFilter(m_XsVectorNoiseFilter, 0.2); - m_ProgressAccumulator->RegisterInternalFilter(m_FusionFilter, 0.2); + m_ProgressAccumulator->RegisterInternalFilter(m_FusionStep1Filter, 0.1); + m_ProgressAccumulator->RegisterInternalFilter(m_FusionStep2Filter, 0.1); } template <class TPanImageType, class TXsImageType, class TOutputImageType, class TInternalPrecision> @@ -151,17 +153,18 @@ LmvmPanSharpeningFusionImageFilter m_XsVectorNoiseFilter->SetFilter(m_XsNoiseFilter); - m_FusionFilter->SetInput1(this->GetXsInput()); - m_FusionFilter->SetInput2(m_PanConvolutionFilter->GetOutput()); - m_FusionFilter->SetInput3(m_XsVectorConvolutionFilter->GetOutput()); - m_FusionFilter->SetInput4(m_XsVectorNoiseFilter->GetOutput()); - m_FusionFilter->SetInput5(m_PanNoiseFilter->GetOutput()); - m_FusionFilter->SetInput6(this->GetPanInput()); + m_FusionStep1Filter->SetInput2(m_XsVectorNoiseFilter->GetOutput()); + m_FusionStep1Filter->SetInput1(m_PanConvolutionFilter->GetOutput()); + m_FusionStep1Filter->SetInput3(this->GetPanInput()); + + m_FusionStep2Filter->SetInput1(m_FusionStep1Filter->GetOutput()); + m_FusionStep2Filter->SetInput3(m_PanNoiseFilter->GetOutput()); + m_FusionStep2Filter->SetInput2(m_XsVectorConvolutionFilter->GetOutput()); // Wire composite filter - m_FusionFilter->GraftOutput(this->GetOutput()); - m_FusionFilter->Update(); - this->GraftOutput(m_FusionFilter->GetOutput()); + m_FusionStep2Filter->GraftOutput(this->GetOutput()); + m_FusionStep2Filter->Update(); + this->GraftOutput(m_FusionStep2Filter->GetOutput()); } template <class TPanImageType, class TXsImageType, class TOutputImageType, class TInternalPrecision> -- GitLab