From cf558fdd079043c17d82b717323da950b3f66bd8 Mon Sep 17 00:00:00 2001
From: OTB Bot <otbbot@orfeo-toolbox.org>
Date: Wed, 7 May 2014 19:55:19 +0200
Subject: [PATCH] STYLE

---
 .../Projections/otbBundleToPerfectSensor.cxx  |    6 +-
 Applications/Projections/otbSuperimpose.cxx   |    2 +-
 ...otbScalarImageToAdvancedTexturesFilter.txx | 1140 ++++++++---------
 3 files changed, 574 insertions(+), 574 deletions(-)

diff --git a/Applications/Projections/otbBundleToPerfectSensor.cxx b/Applications/Projections/otbBundleToPerfectSensor.cxx
index 689b0081b9..2dc0d566ba 100644
--- a/Applications/Projections/otbBundleToPerfectSensor.cxx
+++ b/Applications/Projections/otbBundleToPerfectSensor.cxx
@@ -122,7 +122,7 @@ private:
       bool isRefPHR = false;
       bool isMovingPHR = false;
       
-      otb::PleiadesImageMetadataInterface::Pointer phrIMI = 
+      otb::PleiadesImageMetadataInterface::Pointer phrIMI =
         otb::PleiadesImageMetadataInterface::New();
       phrIMI->SetMetaDataDictionary(refImage->GetMetaDataDictionary());
       isRefPHR = phrIMI->CanRead();
@@ -149,12 +149,12 @@ private:
         std::string panProcessing = kwlPan.GetMetadataByKey("support_data.processing_level");
         std::string xsProcessing = kwlXS.GetMetadataByKey("support_data.processing_level");
         
-        if (panProcessing.compare("SENSOR") == 0 && 
+        if (panProcessing.compare("SENSOR") == 0 &&
             xsProcessing.compare("SENSOR") == 0)
           {
           SetParameterInt("mode",Mode_PHR);
           }
-        } 
+        }
       }
   }
 
diff --git a/Applications/Projections/otbSuperimpose.cxx b/Applications/Projections/otbSuperimpose.cxx
index c6c141d760..832ad73e23 100644
--- a/Applications/Projections/otbSuperimpose.cxx
+++ b/Applications/Projections/otbSuperimpose.cxx
@@ -300,7 +300,7 @@ private:
       {
       otbAppLogINFO("Using the PHR mode");
       
-      // Setup a simple affine transform using PHR support data 
+      // Setup a simple affine transform using PHR support data
       ImageKeywordlist kwlPan;
       ImageKeywordlist kwlXS;
       
diff --git a/Code/FeatureExtraction/otbScalarImageToAdvancedTexturesFilter.txx b/Code/FeatureExtraction/otbScalarImageToAdvancedTexturesFilter.txx
index 3272e9f792..0ee25281bb 100644
--- a/Code/FeatureExtraction/otbScalarImageToAdvancedTexturesFilter.txx
+++ b/Code/FeatureExtraction/otbScalarImageToAdvancedTexturesFilter.txx
@@ -1,570 +1,570 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#ifndef __otbScalarImageToAdvancedTexturesFilter_txx
-#define __otbScalarImageToAdvancedTexturesFilter_txx
-
-#include "otbScalarImageToAdvancedTexturesFilter.h"
-#include "itkImageRegionIteratorWithIndex.h"
-#include "itkConstNeighborhoodIterator.h"
-#include "itkImageRegionIterator.h"
-#include "itkProgressReporter.h"
-#include "itkNumericTraits.h"
-#include <algorithm>
-
-namespace otb
-{
-template <class TInputImage, class TOutputImage>
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::ScalarImageToAdvancedTexturesFilter()
-: m_Radius()
-, m_Offset()
-, m_HistSize(2)
-, m_NumberOfBinsPerAxis(8)
-, m_InputImageMinimum(0)
-, m_InputImageMaximum(255)
-{
-  // There are 10 outputs corresponding to the 9 textures indices
-  this->SetNumberOfRequiredOutputs(10);
-
-  // Create the 10 outputs
-  this->SetNthOutput(0, OutputImageType::New());
-  this->SetNthOutput(1, OutputImageType::New());
-  this->SetNthOutput(2, OutputImageType::New());
-  this->SetNthOutput(3, OutputImageType::New());
-  this->SetNthOutput(4, OutputImageType::New());
-  this->SetNthOutput(5, OutputImageType::New());
-  this->SetNthOutput(6, OutputImageType::New());
-  this->SetNthOutput(7, OutputImageType::New());
-  this->SetNthOutput(8, OutputImageType::New());
-  this->SetNthOutput(9, OutputImageType::New());
-}
-
-template <class TInputImage, class TOutputImage>
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::~ScalarImageToAdvancedTexturesFilter()
-{}
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetMeanOutput()
-{
-  if (this->GetNumberOfOutputs() < 1)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(0));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetVarianceOutput()
-{
-  if (this->GetNumberOfOutputs() < 2)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(1));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetDissimilarityOutput()
-{
-  if (this->GetNumberOfOutputs() < 3)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(2));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetSumAverageOutput()
-{
-  if (this->GetNumberOfOutputs() < 4)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(3));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetSumVarianceOutput()
-{
-  if (this->GetNumberOfOutputs() < 5)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(4));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetSumEntropyOutput()
-{
-  if (this->GetNumberOfOutputs() < 6)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(5));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetDifferenceEntropyOutput()
-{
-  if (this->GetNumberOfOutputs() < 7)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(6));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetDifferenceVarianceOutput()
-{
-  if (this->GetNumberOfOutputs() < 8)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(7));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetIC1Output()
-{
-  if (this->GetNumberOfOutputs() < 9)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(8));
-}
-
-template <class TInputImage, class TOutputImage>
-typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::OutputImageType *
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GetIC2Output()
-{
-  if (this->GetNumberOfOutputs() < 10)
-    {
-    return 0;
-    }
-  return static_cast<OutputImageType *>(this->GetOutput(9));
-}
-
-template <class TInputImage, class TOutputImage>
-void
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::GenerateInputRequestedRegion()
-{
-  // First, call superclass implementation
-  Superclass::GenerateInputRequestedRegion();
-
-  // Retrieve the input and output pointers
-  InputImagePointerType  inputPtr = const_cast<InputImageType *>(this->GetInput());
-  OutputImagePointerType outputPtr = this->GetOutput();
-
-  if (!inputPtr || !outputPtr)
-    {
-    return;
-    }
-
-  // Retrieve the output requested region
-  // We use only the first output since requested regions for all outputs are enforced to be equal
-  // by the default GenerateOutputRequestedRegiont() implementation
-  OutputRegionType outputRequestedRegion = outputPtr->GetRequestedRegion();
-
-  typename OutputRegionType::IndexType outputIndex = outputRequestedRegion.GetIndex();
-  typename OutputRegionType::SizeType  outputSize   = outputRequestedRegion.GetSize();
-  typename InputRegionType::IndexType  inputIndex;
-  typename InputRegionType::SizeType   inputSize;
-
-  // First, apply offset
-  for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
-    {
-    inputIndex[dim] = std::min(outputIndex[dim], outputIndex[dim] + m_Offset[dim]);
-    inputSize[dim] =
-      std::max(outputIndex[dim] + outputSize[dim], outputIndex[dim] + outputSize[dim] +
-               m_Offset[dim]) - inputIndex[dim];
-    }
-
-  // Build the input requested region
-  InputRegionType inputRequestedRegion;
-  inputRequestedRegion.SetIndex(inputIndex);
-  inputRequestedRegion.SetSize(inputSize);
-
-  // Apply the radius
-  inputRequestedRegion.PadByRadius(m_Radius);
-
-  // Try to apply the requested region to the input image
-  if (inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()))
-    {
-    inputPtr->SetRequestedRegion(inputRequestedRegion);
-    }
-  else
-    {
-    // Build an exception
-    itk::InvalidRequestedRegionError e(__FILE__, __LINE__);
-    e.SetLocation(ITK_LOCATION);
-    e.SetDescription("Requested region is (at least partially) outside the largest possible region.");
-    e.SetDataObject(inputPtr);
-    throw e;
-    }
-}
-
-template <class TInputImage, class TOutputImage>
-void
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::SetBinsAndMinMax(unsigned int numberOfBinsPerAxis,
-                   InputPixelType inputImageMinimum,
-                   InputPixelType inputImageMaximum)
-{
-  /** calulate minimum offset and set it as neigborhood radius **/
-  unsigned int minRadius = 0;
-  for ( unsigned int i = 0; i < m_Offset.GetOffsetDimension(); i++ )
-    {
-    unsigned int distance = vcl_abs(m_Offset[i]);
-    if ( distance > minRadius )
-      {
-      minRadius = distance;
-      }
-    }
-  m_NeighborhoodRadius.Fill(minRadius);
-
-  /** Initalize m_Histogram with given min, max and number of bins  **/
-  MeasurementVectorType lowerBound;
-  MeasurementVectorType upperBound;
-  m_InputImageMinimum = inputImageMinimum;
-  m_InputImageMaximum = inputImageMaximum;
-  m_NumberOfBinsPerAxis = numberOfBinsPerAxis;
-  m_Histogram = HistogramType::New();
-  m_Histogram->SetMeasurementVectorSize( MeasurementVectorSize );
-  lowerBound.SetSize( MeasurementVectorSize );
-  upperBound.SetSize( MeasurementVectorSize );
-  lowerBound.Fill(m_InputImageMinimum);
-  upperBound.Fill(m_InputImageMaximum+1);
-  m_HistSize.Fill(m_NumberOfBinsPerAxis);
-  m_Histogram->Initialize(m_HistSize, lowerBound, upperBound);
-}
-
-template <class TInputImage, class TOutputImage>
-void
-ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
-::ThreadedGenerateData(const OutputRegionType& outputRegionForThread, itk::ThreadIdType threadId)
-{
-  // Retrieve the input and output pointers
-  InputImagePointerType  inputPtr              =      const_cast<InputImageType *>(this->GetInput());
-  OutputImagePointerType meanPtr               =      this->GetMeanOutput();
-  OutputImagePointerType variancePtr           =      this->GetVarianceOutput();
-  OutputImagePointerType dissimilarityPtr      =      this->GetDissimilarityOutput();
-  OutputImagePointerType sumAveragePtr         =      this->GetSumAverageOutput();
-  OutputImagePointerType sumVariancePtr        =      this->GetSumVarianceOutput();
-  OutputImagePointerType sumEntropytPtr        =      this->GetSumEntropyOutput();
-  OutputImagePointerType differenceEntropyPtr  =      this->GetDifferenceEntropyOutput();
-  OutputImagePointerType differenceVariancePtr =      this->GetDifferenceVarianceOutput();
-  OutputImagePointerType ic1Ptr                =      this->GetIC1Output();
-  OutputImagePointerType ic2Ptr                =      this->GetIC2Output();
-
-  // Build output iterators
-  itk::ImageRegionIteratorWithIndex<OutputImageType> varianceIt(variancePtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          meanIt(meanPtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          dissimilarityIt(dissimilarityPtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          sumAverageIt(sumAveragePtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          sumVarianceIt(sumVariancePtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          sumEntropytIt(sumEntropytPtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          differenceEntropyIt(differenceEntropyPtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          differenceVarianceIt(differenceVariancePtr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          ic1It(ic1Ptr, outputRegionForThread);
-  itk::ImageRegionIterator<OutputImageType>          ic2It(ic2Ptr, outputRegionForThread);
-
-  // Go to begin
-  varianceIt.GoToBegin();
-  meanIt.GoToBegin();
-  dissimilarityIt.GoToBegin();
-  sumAverageIt.GoToBegin();
-  sumVarianceIt.GoToBegin();
-  sumEntropytIt.GoToBegin();
-  differenceEntropyIt.GoToBegin();
-  differenceVarianceIt.GoToBegin();
-  ic1It.GoToBegin();
-  ic2It.GoToBegin();
-
-  const double log2 = vcl_log(2.0);
-  const itk::SizeValueType histSize0 = m_HistSize[0];
-  const itk::SizeValueType histSize1 = m_HistSize[1];
-  const double minSizeHist = std::min (histSize0, histSize1);
-
-  // Set-up progress reporting
-  itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
-
-  // Iterate on outputs to compute textures
-  while (!varianceIt.IsAtEnd()
-         && !meanIt.IsAtEnd()
-         && !dissimilarityIt.IsAtEnd()
-         && !sumAverageIt.IsAtEnd()
-         && !sumVarianceIt.IsAtEnd()
-         && !sumEntropytIt.IsAtEnd()
-         && !differenceEntropyIt.IsAtEnd()
-         && !differenceVarianceIt.IsAtEnd()
-         && !ic1It.IsAtEnd()
-         && !ic2It.IsAtEnd())
-    {
-    // Compute the region on which co-occurence will be estimated
-    typename InputRegionType::IndexType inputIndex;
-    typename InputRegionType::SizeType inputSize;
-
-    // First, create an window for neighborhood iterator based on m_Radius
-    // For example, if xradius and yradius is 2. window size is 5x5 (2 * radius + 1).
-    for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
-      {
-      inputIndex[dim] = varianceIt.GetIndex()[dim] - m_Radius[dim];
-      inputSize[dim] = 2 * m_Radius[dim] + 1;
-      }
-
-    // Build the input  region
-    InputRegionType inputRegion;
-    inputRegion.SetIndex(inputIndex);
-    inputRegion.SetSize(inputSize);
-    inputRegion.Crop(inputPtr->GetRequestedRegion());
-
-    CooccurrenceIndexedListPointerType m_GLCIList = CooccurrenceIndexedListType::New();
-    m_GLCIList->Initialize(m_HistSize);
-
-    typedef itk::ConstNeighborhoodIterator< InputImageType > NeighborhoodIteratorType;
-    NeighborhoodIteratorType neighborIt;
-    neighborIt = NeighborhoodIteratorType(m_NeighborhoodRadius, inputPtr, inputRegion);
-    for ( neighborIt.GoToBegin(); !neighborIt.IsAtEnd(); ++neighborIt )
-    {
-    const InputPixelType centerPixelIntensity = neighborIt.GetCenterPixel();
-    if ( centerPixelIntensity < m_InputImageMinimum
-         || centerPixelIntensity > m_InputImageMaximum )
-      {
-      continue; // don't put a pixel in the histogram if the value
-                // is out-of-bounds.
-      }
-
-    bool            pixelInBounds;
-    const InputPixelType pixelIntensity = neighborIt.GetPixel(m_Offset, pixelInBounds);
-    if ( !pixelInBounds )
-        {
-        continue; // don't put a pixel in the histogram if it's out-of-bounds.
-        }
-    if ( pixelIntensity < m_InputImageMinimum
-         || pixelIntensity > m_InputImageMaximum )
-      {
-      continue; // don't put a pixel in the histogram if the value
-      // is out-of-bounds.
-      }
-
-      CooccurrenceIndexType instanceIndex;
-      MeasurementVectorType measurement( MeasurementVectorSize );
-      measurement[0] = centerPixelIntensity;
-      measurement[1] = pixelIntensity;
-      //Get Index of the histogram for the given pixel pair;
-      m_Histogram->GetIndex(measurement, instanceIndex);
-      m_GLCIList->AddPairToList(instanceIndex);
-    }
-
-    MeasurementType m_Mean                    = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_Variance                = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_Dissimilarity           = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_SumAverage              = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_SumEntropy              = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_SumVariance             = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_DifferenceEntropy       = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_DifferenceVariance      = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_IC1                     = itk::NumericTraits< MeasurementType >::Zero;
-    MeasurementType m_IC2                     = itk::NumericTraits< MeasurementType >::Zero;
-
-    double Entropy = 0;
-
-    long unsigned int twiceHistSize = histSize0 + histSize1;
-    typedef itk::Array<double> DoubleArrayType;
-    DoubleArrayType hx(histSize0);
-    DoubleArrayType hy(histSize0);
-    DoubleArrayType pdxy(twiceHistSize);
-
-    for(long unsigned int i = 0; i < histSize0; i++)
-      {
-      hx[i] = 0.0;
-      hy[i] = 0.0;
-      pdxy[i] = 0.0;
-      }
-    for(long unsigned int i = histSize0; i < twiceHistSize; i++)
-      {
-      pdxy[i] = 0.0;
-      }
-
-    /*   hx.Fill(0.0);    hy.Fill(0.0);    pdxy.Fill(0.0);   */
-    double hxy1 = 0;
-
-    VectorType glcList = m_GLCIList->GetVector();
-    TotalAbsoluteFrequencyType totalFrequency = m_GLCIList->GetTotalFrequency();
-
-    VectorIteratorType vectorIt;
-    //Normalize the GreyLevelCooccurrenceListType
-    //Compute Mean, Entropy (f12), hx, hy, pdxy
-    vectorIt = glcList.begin();
-    while( vectorIt != glcList.end())
-      {
-      CooccurrenceIndexType index = (*vectorIt).index;
-      double frequency = static_cast<double>((*vectorIt).frequency) / static_cast<double>(totalFrequency);
-      m_Mean += static_cast<double>(index[0]) * frequency;
-      Entropy -= (frequency > 0.0001) ? frequency * vcl_log(frequency) / log2 : 0.;
-      //update normalized frequency
-      (*vectorIt).frequency = frequency;
-
-      unsigned int i = index[1];
-      unsigned int j = index[0];
-      hx[j] += frequency;
-      hy[i] += frequency;
-
-      if( i+j > histSize0-1)
-        {
-        pdxy[i+j] += frequency;
-        }
-      if( i <= j )
-        {
-        pdxy[j-i] += frequency;
-        }
-
-      ++vectorIt;
-      }
-
-    VectorConstIteratorType constVectorIt;
-    //second pass over normalized co-occurrence list to find variance and pipj.
-    //pipj is needed to calculate f11
-    constVectorIt = glcList.begin();
-    while( constVectorIt != glcList.end())
-      {
-      double frequency = (*constVectorIt).frequency;
-      CooccurrenceIndexType index = (*constVectorIt).index;
-      unsigned int i = index[1];
-      unsigned int j = index[0];
-      double index0 = static_cast<double>(index[0]);
-      m_Variance += ((index0 - m_Mean) * (index0 - m_Mean)) * frequency;
-      double pipj = hx[j] * hy[i];
-      hxy1 -= (pipj > 0.0001) ? frequency * vcl_log(pipj) : 0.;
-      ++constVectorIt;
-      }
-
-    //iterate histSize to compute sumEntropy
-    double PSSquareCumul = 0;
-    for(long unsigned int k = histSize0; k < twiceHistSize; k++)
-      {
-      m_SumAverage += k * pdxy[k];
-      m_SumEntropy -= (pdxy[k] > 0.0001) ? pdxy[k] * vcl_log(pdxy[k]) / log2 : 0;
-      PSSquareCumul += k * k * pdxy[k];
-      }
-    m_SumVariance = PSSquareCumul - m_SumAverage * m_SumAverage;
-
-    double PDSquareCumul = 0;
-    double PDCumul = 0;
-    double hxCumul = 0;
-    double hyCumul = 0;
-
-    for (long unsigned int i = 0; i < minSizeHist; ++i)
-      {
-      double pdTmp = pdxy[i];
-      PDCumul += i * pdTmp;
-      m_DifferenceEntropy -= (pdTmp > 0.0001) ? pdTmp * vcl_log(pdTmp) / log2 : 0;
-      PDSquareCumul += i * i * pdTmp;
-
-      //comput hxCumul and hyCumul
-      double marginalfreq = hx[i];
-      hxCumul += (marginalfreq > 0.0001) ? vcl_log (marginalfreq) * marginalfreq : 0;
-
-      marginalfreq = hy[i];
-      hyCumul += (marginalfreq > 0.0001) ? vcl_log (marginalfreq) * marginalfreq : 0;
-      }
-    m_DifferenceVariance = PDSquareCumul - PDCumul * PDCumul;
-
-    /* pipj computed below is totally different from earlier one which was used
-     * to compute hxy1. This need to force an iterator over entire histogram.
-       Processing time is propotional to the histogram bin size */
-    double hxy2 = 0;
-    for(int i = 0; i < histSize0; ++i)
-      {
-      for(int j = 0; j < histSize1; ++j)
-        {
-        double pipj = hx[j] * hy[i];
-        hxy2 -= (pipj > 0.0001) ? pipj * vcl_log(pipj) : 0.;
-        double frequency = m_GLCIList->GetFrequency(i,j, glcList);
-        m_Dissimilarity+= ( j - i ) * (frequency * frequency);
-        }
-      }
-
-    //Information measures of correlation 1 & 2
-    m_IC1 = (vcl_abs(std::max (hxCumul, hyCumul)) > 0.0001) ? (Entropy - hxy1) / (std::max (hxCumul, hyCumul)) : 0;
-    m_IC2 = 1 - vcl_exp (-2. * vcl_abs (hxy2 - Entropy));
-    m_IC2 = (m_IC2 >= 0) ? vcl_sqrt (m_IC2) : 0;
-
-    // Fill outputs
-    meanIt.Set(m_Mean);
-    varianceIt.Set(m_Variance);
-    dissimilarityIt.Set(m_Dissimilarity);
-    sumAverageIt.Set(m_SumAverage);
-    sumVarianceIt.Set(m_SumVariance);
-    sumEntropytIt.Set(m_SumEntropy);
-    differenceEntropyIt.Set(m_DifferenceEntropy);
-    differenceVarianceIt.Set(m_DifferenceVariance);
-    ic1It.Set(m_IC1);
-    ic2It.Set(m_IC2);
-
-    // Update progress
-    progress.CompletedPixel();
-
-    // Increment iterators
-    ++varianceIt;
-    ++meanIt;
-    ++dissimilarityIt;
-    ++sumAverageIt;
-    ++sumVarianceIt;
-    ++sumEntropytIt;
-    ++differenceEntropyIt;
-    ++differenceVarianceIt;
-    ++ic1It;
-    ++ic2It;
-    }
-
-}
-
-} // End namespace otb
-
-#endif
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbScalarImageToAdvancedTexturesFilter_txx
+#define __otbScalarImageToAdvancedTexturesFilter_txx
+
+#include "otbScalarImageToAdvancedTexturesFilter.h"
+#include "itkImageRegionIteratorWithIndex.h"
+#include "itkConstNeighborhoodIterator.h"
+#include "itkImageRegionIterator.h"
+#include "itkProgressReporter.h"
+#include "itkNumericTraits.h"
+#include <algorithm>
+
+namespace otb
+{
+template <class TInputImage, class TOutputImage>
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::ScalarImageToAdvancedTexturesFilter()
+: m_Radius()
+, m_Offset()
+, m_HistSize(2)
+, m_NumberOfBinsPerAxis(8)
+, m_InputImageMinimum(0)
+, m_InputImageMaximum(255)
+{
+  // There are 10 outputs corresponding to the 9 textures indices
+  this->SetNumberOfRequiredOutputs(10);
+
+  // Create the 10 outputs
+  this->SetNthOutput(0, OutputImageType::New());
+  this->SetNthOutput(1, OutputImageType::New());
+  this->SetNthOutput(2, OutputImageType::New());
+  this->SetNthOutput(3, OutputImageType::New());
+  this->SetNthOutput(4, OutputImageType::New());
+  this->SetNthOutput(5, OutputImageType::New());
+  this->SetNthOutput(6, OutputImageType::New());
+  this->SetNthOutput(7, OutputImageType::New());
+  this->SetNthOutput(8, OutputImageType::New());
+  this->SetNthOutput(9, OutputImageType::New());
+}
+
+template <class TInputImage, class TOutputImage>
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::~ScalarImageToAdvancedTexturesFilter()
+{}
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetMeanOutput()
+{
+  if (this->GetNumberOfOutputs() < 1)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(0));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetVarianceOutput()
+{
+  if (this->GetNumberOfOutputs() < 2)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(1));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetDissimilarityOutput()
+{
+  if (this->GetNumberOfOutputs() < 3)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(2));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetSumAverageOutput()
+{
+  if (this->GetNumberOfOutputs() < 4)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(3));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetSumVarianceOutput()
+{
+  if (this->GetNumberOfOutputs() < 5)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(4));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetSumEntropyOutput()
+{
+  if (this->GetNumberOfOutputs() < 6)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(5));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetDifferenceEntropyOutput()
+{
+  if (this->GetNumberOfOutputs() < 7)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(6));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetDifferenceVarianceOutput()
+{
+  if (this->GetNumberOfOutputs() < 8)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(7));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetIC1Output()
+{
+  if (this->GetNumberOfOutputs() < 9)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(8));
+}
+
+template <class TInputImage, class TOutputImage>
+typename ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::OutputImageType *
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GetIC2Output()
+{
+  if (this->GetNumberOfOutputs() < 10)
+    {
+    return 0;
+    }
+  return static_cast<OutputImageType *>(this->GetOutput(9));
+}
+
+template <class TInputImage, class TOutputImage>
+void
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GenerateInputRequestedRegion()
+{
+  // First, call superclass implementation
+  Superclass::GenerateInputRequestedRegion();
+
+  // Retrieve the input and output pointers
+  InputImagePointerType  inputPtr = const_cast<InputImageType *>(this->GetInput());
+  OutputImagePointerType outputPtr = this->GetOutput();
+
+  if (!inputPtr || !outputPtr)
+    {
+    return;
+    }
+
+  // Retrieve the output requested region
+  // We use only the first output since requested regions for all outputs are enforced to be equal
+  // by the default GenerateOutputRequestedRegiont() implementation
+  OutputRegionType outputRequestedRegion = outputPtr->GetRequestedRegion();
+
+  typename OutputRegionType::IndexType outputIndex = outputRequestedRegion.GetIndex();
+  typename OutputRegionType::SizeType  outputSize   = outputRequestedRegion.GetSize();
+  typename InputRegionType::IndexType  inputIndex;
+  typename InputRegionType::SizeType   inputSize;
+
+  // First, apply offset
+  for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
+    {
+    inputIndex[dim] = std::min(outputIndex[dim], outputIndex[dim] + m_Offset[dim]);
+    inputSize[dim] =
+      std::max(outputIndex[dim] + outputSize[dim], outputIndex[dim] + outputSize[dim] +
+               m_Offset[dim]) - inputIndex[dim];
+    }
+
+  // Build the input requested region
+  InputRegionType inputRequestedRegion;
+  inputRequestedRegion.SetIndex(inputIndex);
+  inputRequestedRegion.SetSize(inputSize);
+
+  // Apply the radius
+  inputRequestedRegion.PadByRadius(m_Radius);
+
+  // Try to apply the requested region to the input image
+  if (inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()))
+    {
+    inputPtr->SetRequestedRegion(inputRequestedRegion);
+    }
+  else
+    {
+    // Build an exception
+    itk::InvalidRequestedRegionError e(__FILE__, __LINE__);
+    e.SetLocation(ITK_LOCATION);
+    e.SetDescription("Requested region is (at least partially) outside the largest possible region.");
+    e.SetDataObject(inputPtr);
+    throw e;
+    }
+}
+
+template <class TInputImage, class TOutputImage>
+void
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::SetBinsAndMinMax(unsigned int numberOfBinsPerAxis,
+                   InputPixelType inputImageMinimum,
+                   InputPixelType inputImageMaximum)
+{
+  /** calulate minimum offset and set it as neigborhood radius **/
+  unsigned int minRadius = 0;
+  for ( unsigned int i = 0; i < m_Offset.GetOffsetDimension(); i++ )
+    {
+    unsigned int distance = vcl_abs(m_Offset[i]);
+    if ( distance > minRadius )
+      {
+      minRadius = distance;
+      }
+    }
+  m_NeighborhoodRadius.Fill(minRadius);
+
+  /** Initalize m_Histogram with given min, max and number of bins  **/
+  MeasurementVectorType lowerBound;
+  MeasurementVectorType upperBound;
+  m_InputImageMinimum = inputImageMinimum;
+  m_InputImageMaximum = inputImageMaximum;
+  m_NumberOfBinsPerAxis = numberOfBinsPerAxis;
+  m_Histogram = HistogramType::New();
+  m_Histogram->SetMeasurementVectorSize( MeasurementVectorSize );
+  lowerBound.SetSize( MeasurementVectorSize );
+  upperBound.SetSize( MeasurementVectorSize );
+  lowerBound.Fill(m_InputImageMinimum);
+  upperBound.Fill(m_InputImageMaximum+1);
+  m_HistSize.Fill(m_NumberOfBinsPerAxis);
+  m_Histogram->Initialize(m_HistSize, lowerBound, upperBound);
+}
+
+template <class TInputImage, class TOutputImage>
+void
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::ThreadedGenerateData(const OutputRegionType& outputRegionForThread, itk::ThreadIdType threadId)
+{
+  // Retrieve the input and output pointers
+  InputImagePointerType  inputPtr              =      const_cast<InputImageType *>(this->GetInput());
+  OutputImagePointerType meanPtr               =      this->GetMeanOutput();
+  OutputImagePointerType variancePtr           =      this->GetVarianceOutput();
+  OutputImagePointerType dissimilarityPtr      =      this->GetDissimilarityOutput();
+  OutputImagePointerType sumAveragePtr         =      this->GetSumAverageOutput();
+  OutputImagePointerType sumVariancePtr        =      this->GetSumVarianceOutput();
+  OutputImagePointerType sumEntropytPtr        =      this->GetSumEntropyOutput();
+  OutputImagePointerType differenceEntropyPtr  =      this->GetDifferenceEntropyOutput();
+  OutputImagePointerType differenceVariancePtr =      this->GetDifferenceVarianceOutput();
+  OutputImagePointerType ic1Ptr                =      this->GetIC1Output();
+  OutputImagePointerType ic2Ptr                =      this->GetIC2Output();
+
+  // Build output iterators
+  itk::ImageRegionIteratorWithIndex<OutputImageType> varianceIt(variancePtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          meanIt(meanPtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          dissimilarityIt(dissimilarityPtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          sumAverageIt(sumAveragePtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          sumVarianceIt(sumVariancePtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          sumEntropytIt(sumEntropytPtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          differenceEntropyIt(differenceEntropyPtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          differenceVarianceIt(differenceVariancePtr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          ic1It(ic1Ptr, outputRegionForThread);
+  itk::ImageRegionIterator<OutputImageType>          ic2It(ic2Ptr, outputRegionForThread);
+
+  // Go to begin
+  varianceIt.GoToBegin();
+  meanIt.GoToBegin();
+  dissimilarityIt.GoToBegin();
+  sumAverageIt.GoToBegin();
+  sumVarianceIt.GoToBegin();
+  sumEntropytIt.GoToBegin();
+  differenceEntropyIt.GoToBegin();
+  differenceVarianceIt.GoToBegin();
+  ic1It.GoToBegin();
+  ic2It.GoToBegin();
+
+  const double log2 = vcl_log(2.0);
+  const itk::SizeValueType histSize0 = m_HistSize[0];
+  const itk::SizeValueType histSize1 = m_HistSize[1];
+  const double minSizeHist = std::min (histSize0, histSize1);
+
+  // Set-up progress reporting
+  itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
+
+  // Iterate on outputs to compute textures
+  while (!varianceIt.IsAtEnd()
+         && !meanIt.IsAtEnd()
+         && !dissimilarityIt.IsAtEnd()
+         && !sumAverageIt.IsAtEnd()
+         && !sumVarianceIt.IsAtEnd()
+         && !sumEntropytIt.IsAtEnd()
+         && !differenceEntropyIt.IsAtEnd()
+         && !differenceVarianceIt.IsAtEnd()
+         && !ic1It.IsAtEnd()
+         && !ic2It.IsAtEnd())
+    {
+    // Compute the region on which co-occurence will be estimated
+    typename InputRegionType::IndexType inputIndex;
+    typename InputRegionType::SizeType inputSize;
+
+    // First, create an window for neighborhood iterator based on m_Radius
+    // For example, if xradius and yradius is 2. window size is 5x5 (2 * radius + 1).
+    for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
+      {
+      inputIndex[dim] = varianceIt.GetIndex()[dim] - m_Radius[dim];
+      inputSize[dim] = 2 * m_Radius[dim] + 1;
+      }
+
+    // Build the input  region
+    InputRegionType inputRegion;
+    inputRegion.SetIndex(inputIndex);
+    inputRegion.SetSize(inputSize);
+    inputRegion.Crop(inputPtr->GetRequestedRegion());
+
+    CooccurrenceIndexedListPointerType m_GLCIList = CooccurrenceIndexedListType::New();
+    m_GLCIList->Initialize(m_HistSize);
+
+    typedef itk::ConstNeighborhoodIterator< InputImageType > NeighborhoodIteratorType;
+    NeighborhoodIteratorType neighborIt;
+    neighborIt = NeighborhoodIteratorType(m_NeighborhoodRadius, inputPtr, inputRegion);
+    for ( neighborIt.GoToBegin(); !neighborIt.IsAtEnd(); ++neighborIt )
+    {
+    const InputPixelType centerPixelIntensity = neighborIt.GetCenterPixel();
+    if ( centerPixelIntensity < m_InputImageMinimum
+         || centerPixelIntensity > m_InputImageMaximum )
+      {
+      continue; // don't put a pixel in the histogram if the value
+                // is out-of-bounds.
+      }
+
+    bool            pixelInBounds;
+    const InputPixelType pixelIntensity = neighborIt.GetPixel(m_Offset, pixelInBounds);
+    if ( !pixelInBounds )
+        {
+        continue; // don't put a pixel in the histogram if it's out-of-bounds.
+        }
+    if ( pixelIntensity < m_InputImageMinimum
+         || pixelIntensity > m_InputImageMaximum )
+      {
+      continue; // don't put a pixel in the histogram if the value
+      // is out-of-bounds.
+      }
+
+      CooccurrenceIndexType instanceIndex;
+      MeasurementVectorType measurement( MeasurementVectorSize );
+      measurement[0] = centerPixelIntensity;
+      measurement[1] = pixelIntensity;
+      //Get Index of the histogram for the given pixel pair;
+      m_Histogram->GetIndex(measurement, instanceIndex);
+      m_GLCIList->AddPairToList(instanceIndex);
+    }
+
+    MeasurementType m_Mean                    = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_Variance                = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_Dissimilarity           = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_SumAverage              = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_SumEntropy              = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_SumVariance             = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_DifferenceEntropy       = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_DifferenceVariance      = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_IC1                     = itk::NumericTraits< MeasurementType >::Zero;
+    MeasurementType m_IC2                     = itk::NumericTraits< MeasurementType >::Zero;
+
+    double Entropy = 0;
+
+    long unsigned int twiceHistSize = histSize0 + histSize1;
+    typedef itk::Array<double> DoubleArrayType;
+    DoubleArrayType hx(histSize0);
+    DoubleArrayType hy(histSize0);
+    DoubleArrayType pdxy(twiceHistSize);
+
+    for(long unsigned int i = 0; i < histSize0; i++)
+      {
+      hx[i] = 0.0;
+      hy[i] = 0.0;
+      pdxy[i] = 0.0;
+      }
+    for(long unsigned int i = histSize0; i < twiceHistSize; i++)
+      {
+      pdxy[i] = 0.0;
+      }
+
+    /*   hx.Fill(0.0);    hy.Fill(0.0);    pdxy.Fill(0.0);   */
+    double hxy1 = 0;
+
+    VectorType glcList = m_GLCIList->GetVector();
+    TotalAbsoluteFrequencyType totalFrequency = m_GLCIList->GetTotalFrequency();
+
+    VectorIteratorType vectorIt;
+    //Normalize the GreyLevelCooccurrenceListType
+    //Compute Mean, Entropy (f12), hx, hy, pdxy
+    vectorIt = glcList.begin();
+    while( vectorIt != glcList.end())
+      {
+      CooccurrenceIndexType index = (*vectorIt).index;
+      double frequency = static_cast<double>((*vectorIt).frequency) / static_cast<double>(totalFrequency);
+      m_Mean += static_cast<double>(index[0]) * frequency;
+      Entropy -= (frequency > 0.0001) ? frequency * vcl_log(frequency) / log2 : 0.;
+      //update normalized frequency
+      (*vectorIt).frequency = frequency;
+
+      unsigned int i = index[1];
+      unsigned int j = index[0];
+      hx[j] += frequency;
+      hy[i] += frequency;
+
+      if( i+j > histSize0-1)
+        {
+        pdxy[i+j] += frequency;
+        }
+      if( i <= j )
+        {
+        pdxy[j-i] += frequency;
+        }
+
+      ++vectorIt;
+      }
+
+    VectorConstIteratorType constVectorIt;
+    //second pass over normalized co-occurrence list to find variance and pipj.
+    //pipj is needed to calculate f11
+    constVectorIt = glcList.begin();
+    while( constVectorIt != glcList.end())
+      {
+      double frequency = (*constVectorIt).frequency;
+      CooccurrenceIndexType index = (*constVectorIt).index;
+      unsigned int i = index[1];
+      unsigned int j = index[0];
+      double index0 = static_cast<double>(index[0]);
+      m_Variance += ((index0 - m_Mean) * (index0 - m_Mean)) * frequency;
+      double pipj = hx[j] * hy[i];
+      hxy1 -= (pipj > 0.0001) ? frequency * vcl_log(pipj) : 0.;
+      ++constVectorIt;
+      }
+
+    //iterate histSize to compute sumEntropy
+    double PSSquareCumul = 0;
+    for(long unsigned int k = histSize0; k < twiceHistSize; k++)
+      {
+      m_SumAverage += k * pdxy[k];
+      m_SumEntropy -= (pdxy[k] > 0.0001) ? pdxy[k] * vcl_log(pdxy[k]) / log2 : 0;
+      PSSquareCumul += k * k * pdxy[k];
+      }
+    m_SumVariance = PSSquareCumul - m_SumAverage * m_SumAverage;
+
+    double PDSquareCumul = 0;
+    double PDCumul = 0;
+    double hxCumul = 0;
+    double hyCumul = 0;
+
+    for (long unsigned int i = 0; i < minSizeHist; ++i)
+      {
+      double pdTmp = pdxy[i];
+      PDCumul += i * pdTmp;
+      m_DifferenceEntropy -= (pdTmp > 0.0001) ? pdTmp * vcl_log(pdTmp) / log2 : 0;
+      PDSquareCumul += i * i * pdTmp;
+
+      //comput hxCumul and hyCumul
+      double marginalfreq = hx[i];
+      hxCumul += (marginalfreq > 0.0001) ? vcl_log (marginalfreq) * marginalfreq : 0;
+
+      marginalfreq = hy[i];
+      hyCumul += (marginalfreq > 0.0001) ? vcl_log (marginalfreq) * marginalfreq : 0;
+      }
+    m_DifferenceVariance = PDSquareCumul - PDCumul * PDCumul;
+
+    /* pipj computed below is totally different from earlier one which was used
+     * to compute hxy1. This need to force an iterator over entire histogram.
+       Processing time is propotional to the histogram bin size */
+    double hxy2 = 0;
+    for(int i = 0; i < histSize0; ++i)
+      {
+      for(int j = 0; j < histSize1; ++j)
+        {
+        double pipj = hx[j] * hy[i];
+        hxy2 -= (pipj > 0.0001) ? pipj * vcl_log(pipj) : 0.;
+        double frequency = m_GLCIList->GetFrequency(i,j, glcList);
+        m_Dissimilarity+= ( j - i ) * (frequency * frequency);
+        }
+      }
+
+    //Information measures of correlation 1 & 2
+    m_IC1 = (vcl_abs(std::max (hxCumul, hyCumul)) > 0.0001) ? (Entropy - hxy1) / (std::max (hxCumul, hyCumul)) : 0;
+    m_IC2 = 1 - vcl_exp (-2. * vcl_abs (hxy2 - Entropy));
+    m_IC2 = (m_IC2 >= 0) ? vcl_sqrt (m_IC2) : 0;
+
+    // Fill outputs
+    meanIt.Set(m_Mean);
+    varianceIt.Set(m_Variance);
+    dissimilarityIt.Set(m_Dissimilarity);
+    sumAverageIt.Set(m_SumAverage);
+    sumVarianceIt.Set(m_SumVariance);
+    sumEntropytIt.Set(m_SumEntropy);
+    differenceEntropyIt.Set(m_DifferenceEntropy);
+    differenceVarianceIt.Set(m_DifferenceVariance);
+    ic1It.Set(m_IC1);
+    ic2It.Set(m_IC2);
+
+    // Update progress
+    progress.CompletedPixel();
+
+    // Increment iterators
+    ++varianceIt;
+    ++meanIt;
+    ++dissimilarityIt;
+    ++sumAverageIt;
+    ++sumVarianceIt;
+    ++sumEntropytIt;
+    ++differenceEntropyIt;
+    ++differenceVarianceIt;
+    ++ic1It;
+    ++ic2It;
+    }
+
+}
+
+} // End namespace otb
+
+#endif
-- 
GitLab