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