diff --git a/Code/FeatureExtraction/otbComplexMomentImageFunction.h b/Code/FeatureExtraction/otbComplexMomentImageFunction.h
new file mode 100644
index 0000000000000000000000000000000000000000..fd6f5dc85c63957c35b6cac3307b1fdfe0406955
--- /dev/null
+++ b/Code/FeatureExtraction/otbComplexMomentImageFunction.h
@@ -0,0 +1,122 @@
+/*=========================================================================
+
+  Programme :   OTB (ORFEO ToolBox)
+  Auteurs   :   CS - P. Imbo
+  Language  :   C++
+  Date      :   20 mars 2006
+  Version   :   
+  Role      :   Complex Geometric Moments Class of iamges 
+  $Id:$
+
+=========================================================================*/
+#ifndef _otbComplexMomentImageFunction_h
+#define _otbComplexMomentImageFunction_h
+
+#include "otbGeometricMomentImageFunction.h"
+
+#include <complex>
+
+namespace otb
+{
+
+/**
+ * \class ComplexMomentImageFunction
+ * \brief Calculate the complex moment value in the full image.
+ *
+ * Calculate the complex moment value over an image. 
+ * The implemented equation is:
+ *
+ *  \f[  c_{p,q}=\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} (x+iy)^{p} \cdot (x-iy)^{q} \cdot f(x,y) \cdot
+ dx \cdot dy \f]
+ *
+ * With:
+ *
+ *   - \f$ (x,y) \f$ pixel localization;
+ *   - \f$ f(x,y) \f$  the pixel value over the \f$(x,y) \f$ coordinate.
+ *
+ * This class is templated over the input image type and the
+ * coordinate representation type (e.g. float or double).
+ * 
+ * \ingroup ImageFunctions
+ */
+template < class TInput, 
+           class TOutput = std::complex<double >,
+	   class TCoordRep = float >
+class ITK_EXPORT ComplexMomentImageFunction :
+    public GeometricMomentImageFunction<TInput, TOutput,TCoordRep>
+{
+public:
+  /** Standard class typedefs. */
+  typedef ComplexMomentImageFunction                                 Self;
+  typedef GeometricMomentImageFunction<TInput, TOutput,TCoordRep>    Superclass;
+  typedef itk::SmartPointer<Self>                                    Pointer;
+  typedef itk::SmartPointer<const Self>                              ConstPointer;
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(ComplexMomentImageFunction, GeometricMomentImageFunction);
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+
+  /** InputImageType typedef support. */
+  typedef typename Superclass::InputType            InputType;
+  typedef typename Superclass::IndexType            IndexType;
+  typedef typename Superclass::ContinuousIndexType  ContinuousIndexType;
+  typedef typename Superclass::PointType            PointType;
+ 
+  typedef TOutput                                   ComplexType;
+
+  /** Dimension of the underlying image. */
+//  itkStaticConstMacro(ImageDimension, unsigned int,
+//                      InputType::ImageDimension);
+  			 
+  /** Evalulate the function at specified index */
+  virtual ComplexType EvaluateAtIndex( const IndexType& index ) const;
+  
+  /** Evaluate the function at non-integer positions */
+  virtual ComplexType Evaluate( const PointType& point ) const
+    { 
+      IndexType index;
+      this->ConvertPointToNearestIndex( point, index );
+      return this->EvaluateAtIndex( index ); 
+    }
+  virtual ComplexType EvaluateAtContinuousIndex( 
+    const ContinuousIndexType& cindex ) const
+    { 
+      IndexType index;
+      this->ConvertContinuousIndexToNearestIndex( cindex, index );
+      return this->EvaluateAtIndex( index ) ; 
+    }
+  itkSetMacro(P, unsigned int);
+  itkGetConstReferenceMacro(P, unsigned int);
+  itkSetMacro(Q, unsigned int);
+  itkGetConstReferenceMacro(Q, unsigned int);
+
+  /** Get/Set the radius of the neighborhood over which the
+      statistics are evaluated */
+  itkSetMacro( NeighborhoodRadius, int );
+  itkGetConstReferenceMacro( NeighborhoodRadius, int );
+
+protected:
+  ComplexMomentImageFunction();
+  ~ComplexMomentImageFunction(){};
+  void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  ComplexMomentImageFunction( const Self& ); //purposely not implemented
+  void operator=( const Self& ); //purposely not implemented
+
+  unsigned int m_P;
+  unsigned int m_Q;
+  int m_NeighborhoodRadius;
+  
+};
+
+} // namespace otb
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbComplexMomentImageFunction.txx"
+#endif
+
+#endif
+
diff --git a/Code/FeatureExtraction/otbComplexMomentImageFunction.txx b/Code/FeatureExtraction/otbComplexMomentImageFunction.txx
new file mode 100644
index 0000000000000000000000000000000000000000..a2368dee235acdf85c78a4033b89507ace06ebfc
--- /dev/null
+++ b/Code/FeatureExtraction/otbComplexMomentImageFunction.txx
@@ -0,0 +1,137 @@
+/*=========================================================================
+
+    Program:   Insight Segmentation & Registration Toolkit
+    Module:    $RCSfile: itkMeanImageFunction.txx,v $
+    Language:  C++
+    Date:      $Date: 2004/12/12 22:07:24 $
+    Version:   $Revision: 1.12 $
+
+    Copyright (c) Insight Software Consortium. All rights reserved.
+    See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 _otbComplexMomentImageFunction_txx
+#define _otbComplexMomentImageFunction_txx
+
+#include "otbComplexMomentImageFunction.h"
+#include "itkImageRegionIterator.h"
+#include "itkImage.h"
+#include "itkConstNeighborhoodIterator.h"
+
+#include <complex>
+namespace otb
+{
+
+/**
+   * Constructor
+   */
+template < class TInput, class TOutput, class TCoordRep>
+ComplexMomentImageFunction<TInput,TOutput,TCoordRep>
+::ComplexMomentImageFunction()
+{
+  m_P = 0;
+  m_Q = 0;
+  m_NeighborhoodRadius = -1;
+}
+
+/**
+   *
+   */
+template < class TInput, class TOutput, class TCoordRep>
+void
+ComplexMomentImageFunction<TInput,TOutput,TCoordRep>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  this->Superclass::PrintSelf(os,indent);
+  os << indent << " p indice value      : "  << m_P << std::endl;
+  os << indent << " q indice value      : "  << m_Q << std::endl;
+  os << indent << " m_NeighborhoodRadius: "  << m_NeighborhoodRadius << std::endl;
+}
+
+
+template < class TInput, class TOutput, class TCoordRep>
+typename ComplexMomentImageFunction<TInput,TOutput,TCoordRep>::ComplexType
+ComplexMomentImageFunction<TInput,TOutput,TCoordRep>
+::EvaluateAtIndex(const IndexType& index) const
+{
+  typename InputType::SizeType        ImageSize;
+  ComplexType                         Sum;
+  ComplexType                         ValP;
+  ComplexType                         ValQ;
+  IndexType                           IndexValue;
+  IndexType                           indexPos = index;
+  typename InputType::SizeType        kernelSize;
+
+  if( !this->GetInputImage() )
+    {
+      return std::complex<float>(0.,0.);  // A modifier
+//    return ( NumericTraits<RealType>::max() );
+    }
+  
+  if ( !this->IsInsideBuffer( index ) )
+    {
+      return std::complex<float>(0.,0.); // A modifier
+//    return ( NumericTraits<RealType>::max() );
+    }
+#if 0
+   if(m_NeighborhoodRadius<0)
+     {
+     ImageSize = this->GetInputImage()->GetBufferedRegion().GetSize();
+     indexPos[0] = ImageSize[0] / 2 ;
+     indexPos[1] = ImageSize[1] / 2;
+     
+       kernelSize[0] = indexPos[0];
+       kernelSize[1] = indexPos[1];          
+     }
+     else
+     {
+       kernelSize.Fill( m_NeighborhoodRadius );
+     }  
+ 
+  itk::ConstNeighborhoodIterator<InputType>
+    it(kernelSize, this->GetInputImage(), this->GetInputImage()->GetBufferedRegion());
+
+  // Set the iterator at the desired location
+  it.SetLocation(indexPos);
+  Sum = std::complex<float>(0.0,0.0); 
+
+  const unsigned int size = it.Size();
+  for (unsigned int i = 0; i < size; ++i)
+  {
+    IndexValue = it.GetIndex(i);
+    ValP = std::complex<float>(1.0,0.0);
+    ValQ = std::complex<float>(1.0,0.0);
+    unsigned int p  = m_P;
+    while(p>0)
+     {
+      ValP *= std::complex<float>(IndexValue[0], IndexValue[1]);
+      --p; 
+     }
+    unsigned int q  = m_Q;
+    while(q>0)
+     {
+      ValQ *= std::complex<float>(IndexValue[0], -IndexValue[1]);
+      --q; 
+     }
+//    std::cout<< i <<"--> "<< IndexValue << " p:"<<ValP <<" Q: "<<ValQ;  
+          
+    Sum += ( ValP * ValQ * std::complex<float>(static_cast<float>(it.GetPixel(i)),0.0) ); 
+//    std::cout<< "Val Pixel: " << static_cast<float>(it.GetPixel(i)) <<" Result :" << Sum<<std::endl;
+  }
+
+//   std::cout<<"Result dans la procedure: " <<Sum <<std::endl;
+           
+  return (static_cast<ComplexType>(Sum) );
+
+#endif
+
+}
+
+
+} // namespace otb
+
+#endif
diff --git a/Code/FeatureExtraction/otbFlusserImageFunction.h b/Code/FeatureExtraction/otbFlusserImageFunction.h
new file mode 100644
index 0000000000000000000000000000000000000000..e2ac02e55499faf250499f82cf8d26899bad3369
--- /dev/null
+++ b/Code/FeatureExtraction/otbFlusserImageFunction.h
@@ -0,0 +1,130 @@
+/*=========================================================================
+
+  Programme :   OTB (ORFEO ToolBox)
+  Auteurs   :   CS - P. Imbo
+  Language  :   C++
+  Date      :   20 mars 2006
+  Version   :   
+  Role      :   Flusser's invariant Class of iamges 
+  $Id$
+
+=========================================================================*/
+#ifndef _otbFlusserImageFunction_h
+#define _otbFlusserImageFunction_h
+
+#include "otbRealMomentImageFunction.h"
+
+#include <complex>
+
+
+namespace otb
+{
+
+/**
+ * \class FlusserImageFunction
+ * \brief Calculate the Flusser's invariant parameters.
+ *
+ * Calculate the Flusser's invariant over an image defined as:
+ *
+ * - \f$ \psi_{1} = c_{11} \f$
+ * - \f$ \psi_{2} = c_{21} c_{12} \f$
+ * - \f$ \psi_{3} = Re (c_{20} c_{12}^{2} )\f$
+ * - \f$ \psi_{4} = Im (c_{20} c_{12}^{2} )\f$
+ * - \f$ \psi_{5} = Re (c_{30} c_{12}^{3} )\f$
+ * - \f$ \psi_{6} = Im (c_{30} c_{12}^{3} )\f$
+ * - \f$ \psi_{7} = c_{22} \f$
+ * - \f$ \psi_{8} = Re (c_{31} c_{12}^{2} )\f$
+ * - \f$ \psi_{9} = Im (c_{31} c_{12}^{2} )\f$
+ * - \f$ \psi_{10} = Re (c_{40} c_{12}^{4} )\f$
+ * - \f$ \psi_{11} = Im (c_{40} c_{12}^{4} )\f$
+ *  
+ * With :
+ *
+ *  \f[  c_{p,q}=\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} (x+iy)^{p} \cdot (x-iy)^{q} \cdot f(x,y) \cdot
+ dx \cdot dy \f]
+ *
+ * And:
+ *  - \f$(x,y)\f$ pixel localization;
+ *  - \f$ f(x,y)\f$ the pixel value over the \f$(x,y)\f$ coordinate.
+ *
+ * This class is templated over the input image type and the
+ * coordinate representation type (e.g. float or double).
+ * 
+ * \ingroup ImageFunctions
+ */
+
+template < class TInput, 
+           class TOutput   = double,
+	   class TCoordRep = float >
+class ITK_EXPORT FlusserImageFunction :
+  public RealMomentImageFunction< TInput, TOutput,TCoordRep >
+{
+public:
+  /** Standard class typedefs. */
+  typedef FlusserImageFunction                                      Self;
+  typedef RealMomentImageFunction< TInput, TOutput,TCoordRep >      Superclass;
+  typedef itk::SmartPointer<Self>                                   Pointer;
+  typedef itk::SmartPointer<const Self>                             ConstPointer;
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(FlusserImageFunction, RealMomentImageFunction);
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+
+  /** InputImageType typedef support. */
+  typedef TInput                                    InputType;
+  typedef typename Superclass::IndexType            IndexType;
+  typedef typename Superclass::ContinuousIndexType  ContinuousIndexType;
+  typedef typename Superclass::PointType            PointType;
+
+  typedef TOutput                                   RealType;
+  typedef typename std::complex<RealType>           ComplexType;
+   
+  /** Dimension of the underlying image. */
+  itkStaticConstMacro(ImageDimension, unsigned int,
+                      InputType::ImageDimension);
+  			 
+
+  /** Evalulate the function at specified index */
+  virtual RealType EvaluateAtIndex( const IndexType& index ) const;
+  
+  /** Evaluate the function at non-integer positions */
+  virtual RealType Evaluate( const PointType& point ) const
+    { 
+      IndexType index;
+      this->ConvertPointToNearestIndex( point, index );
+      return this->EvaluateAtIndex( index ); 
+    }
+  virtual RealType EvaluateAtContinuousIndex( 
+    const ContinuousIndexType& cindex ) const
+    { 
+      IndexType index;
+      this->ConvertContinuousIndexToNearestIndex( cindex, index );
+      return this->EvaluateAtIndex( index ) ; 
+    }
+
+  /** Get/Set the radius of the neighborhood over which the
+      statistics are evaluated */  
+  itkSetClampMacro(Number,short,1,11);
+  itkGetConstReferenceMacro( Number, short );
+
+protected:
+  FlusserImageFunction();
+  ~FlusserImageFunction(){};
+  void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  FlusserImageFunction( const Self& ); //purposely not implemented
+  void operator=( const Self& ); //purposely not implemented
+
+  short m_Number;  
+};
+
+} // namespace otb
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbFlusserImageFunction.txx"
+#endif
+
+#endif
diff --git a/Code/FeatureExtraction/otbFlusserImageFunction.txx b/Code/FeatureExtraction/otbFlusserImageFunction.txx
new file mode 100644
index 0000000000000000000000000000000000000000..a3c5ca6af75e2b35ac1651b401a742fd7ce901d2
--- /dev/null
+++ b/Code/FeatureExtraction/otbFlusserImageFunction.txx
@@ -0,0 +1,228 @@
+/*=========================================================================
+
+    Program:   Insight Segmentation & Registration Toolkit
+    Module:    $RCSfile: itkMeanImageFunction.txx,v $
+    Language:  C++
+    Date:      $Date: 2004/12/12 22:07:24 $
+    Version:   $Revision: 1.12 $
+
+    Copyright (c) Insight Software Consortium. All rights reserved.
+    See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 _otbFlusserImageFunction_txx
+#define _otbFlusserImageFunction_txx
+
+#include "otbFlusserImageFunction.h"
+#include "otbComplexMomentImageFunction.h"
+#include "itkNumericTraits.h"
+#include "itkMacro.h"
+#include <complex>
+
+namespace otb
+{
+
+/**
+   * Constructor
+   */
+template < class TInput, class TOutput, class TCoordRep>
+FlusserImageFunction<TInput,TOutput,TCoordRep>
+::FlusserImageFunction()
+{
+  m_Number =-1; 
+}
+
+/**
+   *
+   */
+template < class TInput, class TOutput, class TCoordRep>
+void
+FlusserImageFunction<TInput,TOutput,TCoordRep>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  this->Superclass::PrintSelf(os,indent);
+  os << indent << " m_Number           : "  << m_Number << std::endl;
+}
+
+
+template < class TInput, class TOutput, class TCoordRep>
+typename FlusserImageFunction<TInput,TOutput,TCoordRep>::RealType
+FlusserImageFunction<TInput,TOutput,TCoordRep>
+::EvaluateAtIndex(const IndexType& index) const
+{
+  typename InputType::SizeType        ImageSize;
+  RealType                            FlusserValue;
+  ComplexType                         FlusserValueComplex;
+
+  typedef otb::ComplexMomentImageFunction<InputType,ComplexType>   CMType;
+  typename CMType::Pointer function =CMType::New();
+
+  if( !this->GetInputImage() )
+    {
+    return ( itk::NumericTraits<RealType>::max() );
+    }
+  
+  if ( !this->IsInsideBuffer( index ) )
+    {
+    return ( itk::NumericTraits<RealType>::max() );
+    }
+
+  assert(m_Number > 0);
+  assert(m_Number < 12);
+	
+   function->SetInputImage( this->GetInputImage() );
+
+
+  switch(m_Number)
+    {
+    case 1 : 
+        {
+	ComplexType C11;
+	function->SetP(1);
+	function->SetQ(1);
+	C11 = function->EvaluateAtIndex( index );
+        FlusserValue = C11.real() ;
+	}
+	break;
+    case 2:
+        {
+	ComplexType C21;
+	function->SetP(2);
+	function->SetQ(1);
+	C21 = function->EvaluateAtIndex( index );
+	FlusserValue = abs( C21 * conj(C21) ) ;
+	}
+	break;
+    case 3:
+        {
+	ComplexType C20,C12;
+	function->SetP(2);
+	function->SetQ(0);
+	C20 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+	FlusserValueComplex = C20 * pow(C12,2);
+	FlusserValue = FlusserValueComplex.real();
+	}
+	break;
+    case 4:
+        {
+	ComplexType C20,C12;
+	function->SetP(2);
+	function->SetQ(0);
+	C20 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+	FlusserValueComplex = C20 * pow(C12,2);
+	FlusserValue = FlusserValueComplex.imag();
+	}
+	break;
+    case 5:
+        {
+	ComplexType C30,C12;
+	function->SetP(3);
+	function->SetQ(0);
+	C30 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+
+	FlusserValueComplex = C30 * pow(C12,3) ;
+	FlusserValue = FlusserValueComplex.real();       
+	}	
+	break;
+    case 6:
+        {
+	ComplexType C30,C12;
+	function->SetP(3);
+	function->SetQ(0);
+	C30 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+
+	FlusserValueComplex = C30 * pow(C12,3) ;
+	FlusserValue = FlusserValueComplex.real();       
+	}	
+	break;
+    case 7 : 
+        {
+	ComplexType C22;
+	function->SetP(2);
+	function->SetQ(2);
+	C22 = function->EvaluateAtIndex( index );
+        FlusserValue = C22.real() ;
+	}
+	break;
+    case 8:
+        {
+	ComplexType C31,C12;
+	function->SetP(3);
+	function->SetQ(1);
+	C31 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+	FlusserValueComplex = C31 * pow(C12,2);
+	FlusserValue = FlusserValueComplex.real();
+	}
+	break;
+    case 9:
+        {
+	ComplexType C31,C12;
+	function->SetP(3);
+	function->SetQ(1);
+	C31 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+	FlusserValueComplex = C31 * pow(C12,2);
+	FlusserValue = FlusserValueComplex.imag();
+	}
+	break;
+    case 10:
+        {
+	ComplexType C40,C12;
+	function->SetP(4);
+	function->SetQ(0);
+	C40 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+	FlusserValueComplex = C40 * pow(C12,4);
+	FlusserValue = FlusserValueComplex.real();
+	}
+	break;
+    case 11:
+        {
+	ComplexType C40,C12;
+	function->SetP(4);
+	function->SetQ(0);
+	C40 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+	FlusserValueComplex = C40 * pow(C12,4);
+	FlusserValue = FlusserValueComplex.imag();
+	}
+	break;
+	
+    default:
+	itkWarningMacro("Hu's invariant parameters are between 1 and 7");	
+    }
+
+
+  return (static_cast<RealType>(FlusserValue) );
+
+}
+
+
+} // namespace otb
+
+#endif
diff --git a/Code/FeatureExtraction/otbGeometricMomentImageFunction.h b/Code/FeatureExtraction/otbGeometricMomentImageFunction.h
new file mode 100644
index 0000000000000000000000000000000000000000..1588a687de63ec53773bc8d277b7f5d09f720e71
--- /dev/null
+++ b/Code/FeatureExtraction/otbGeometricMomentImageFunction.h
@@ -0,0 +1,70 @@
+/*=========================================================================
+
+  Programme :   OTB (ORFEO ToolBox)
+  Auteurs   :   CS - P. Imbo
+  Language  :   C++
+  Date      :   17 mars 2006
+  Version   :   
+  Role      :   Geometric Moments Class of iamges 
+  $Id$
+
+=========================================================================*/
+#ifndef _otbGeometricMomentImageFunction_h
+#define _otbGeometricMomentImageFunction_h
+
+#include "itkImageFunction.h"
+
+
+namespace otb
+{
+
+/**
+ * \class GeometricMomentImageFunction
+ * \brief Virtual class for the Geometric moments for an image function
+ *
+ * \ingroup ImageFunctions
+ */
+
+template < class TInput, 
+           class TOutput = float,
+	   class TCoordRep = float >
+class ITK_EXPORT GeometricMomentImageFunction :
+  public itk::ImageFunction<TInput, TOutput,TCoordRep >
+{
+public:
+  /** Standard class typedefs. */
+  typedef GeometricMomentImageFunction                            Self;
+  typedef itk::ImageFunction< TInput, TOutput,TCoordRep >         Superclass;
+  typedef itk::SmartPointer<Self>                                 Pointer;
+  typedef itk::SmartPointer<const Self>                           ConstPointer;
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(GeometricMomentImageFunction, itk::ImageFunction);
+
+
+  /** InputImageType typedef support. */
+  typedef typename Superclass::InputType            InputType;
+  typedef typename Superclass::IndexType            IndexType;
+  typedef typename Superclass::ContinuousIndexType  ContinuousIndexType;
+  typedef typename Superclass::PointType            PointType;
+ 
+  typedef TOutput                                   OutputType;
+
+
+protected:
+  GeometricMomentImageFunction() {};
+  ~GeometricMomentImageFunction(){};
+  void PrintSelf(std::ostream& os, itk::Indent indent) const 
+     {
+      Superclass::PrintSelf( os, indent );
+     }
+     
+private:
+  GeometricMomentImageFunction( const Self& ); //purposely not implemented
+  void operator=( const Self& );               //purposely not implemented
+};
+
+} // namespace otb
+
+#endif
+
diff --git a/Code/FeatureExtraction/otbHuImageFunction.h b/Code/FeatureExtraction/otbHuImageFunction.h
new file mode 100644
index 0000000000000000000000000000000000000000..d1e4d92e11c8cdf926edd650960ec6a3e2258fa2
--- /dev/null
+++ b/Code/FeatureExtraction/otbHuImageFunction.h
@@ -0,0 +1,130 @@
+/*=========================================================================
+
+  Programme :   OTB (ORFEO ToolBox)
+  Auteurs   :   CS - P. Imbo
+  Language  :   C++
+  Date      :   20 mars 2006
+  Version   :   
+  Role      :   Hu's invariant Class of iamges 
+  $Id$
+
+=========================================================================*/
+#ifndef _otbHuImageFunction_h
+#define _otbHuImageFunction_h
+
+//#include "itkImageFunction.h"
+#include "otbRealMomentImageFunction.h"
+
+#include <complex>
+
+
+namespace otb
+{
+
+/**
+ * \class HuImageFunction
+ * \brief Calculate the Hu's invariant paramete.
+ *
+ * Calculate the Hu's invariant over an image defined as:
+ *
+ * - \f$ \phi_{1} = c_{11} \f$
+ * - \f$ \phi_{2} = c_{20} c_{02} \f$
+ * - \f$ \phi_{3} = c_{30} c_{03} \f$
+ * - \f$ \phi_{4} = c_{21} c_{12} \f$
+ * - \f$ \phi_{5} = Re (c_{30} c_{12}^{3}) \f$
+ * - \f$ \phi_{6} = Re (c_{20} c_{12}^{2}) \f$
+ * - \f$ \phi_{7} = Im (c_{30} c_{12}^{3}) \f$
+ *  
+ * With :
+ *
+ *  \f[  c_{p,q}=\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} (x+iy)^{p} \cdot (x-iy)^{q} \cdot f(x,y) \cdot
+ dx \cdot dy \f]
+ *
+ * And:
+ *  - \f$(x,y)\f$ pixel localization;
+ *  - \f$ f(x,y)\f$  the pixel value over the \f$(x,y)\f$ coordinate.
+ *
+ * This class is templated over the input image type and the
+ * coordinate representation type (e.g. float or double).
+ * 
+ * \ingroup ImageFunctions
+ */
+//  public itk::ImageFunction< TInput, TOutput,TCoordRep >
+
+template < class TInput, 
+           class TOutput   = double,
+	   class TCoordRep = float >
+class ITK_EXPORT HuImageFunction :
+  public RealMomentImageFunction< TInput, TOutput,TCoordRep >
+{
+public:
+  /** Standard class typedefs. */
+  typedef HuImageFunction                                           Self;
+  typedef RealMomentImageFunction< TInput, TOutput,TCoordRep >      Superclass;
+  typedef itk::SmartPointer<Self>                                   Pointer;
+  typedef itk::SmartPointer<const Self>                             ConstPointer;
+  
+  /** Run-time type information (and related methods). */
+//  itkTypeMacro(HuImageFunction, itk::ImageFunction);
+  itkTypeMacro(HuImageFunction, RealMomentImageFunction);
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+
+  /** InputImageType typedef support. */
+  typedef TInput                                    InputType;
+  typedef typename Superclass::IndexType            IndexType;
+  typedef typename Superclass::ContinuousIndexType  ContinuousIndexType;
+  typedef typename Superclass::PointType            PointType;
+
+  typedef TOutput                                   RealType;
+  typedef typename std::complex<RealType>           ComplexType;
+   
+  /** Dimension of the underlying image. */
+  itkStaticConstMacro(ImageDimension, unsigned int,
+                      InputType::ImageDimension);
+  			 
+
+  /** Evalulate the function at specified index */
+  virtual RealType EvaluateAtIndex( const IndexType& index ) const;
+  
+  /** Evaluate the function at non-integer positions */
+  virtual RealType Evaluate( const PointType& point ) const
+    { 
+      IndexType index;
+      this->ConvertPointToNearestIndex( point, index );
+      return this->EvaluateAtIndex( index ); 
+    }
+  virtual RealType EvaluateAtContinuousIndex( 
+    const ContinuousIndexType& cindex ) const
+    { 
+      IndexType index;
+      this->ConvertContinuousIndexToNearestIndex( cindex, index );
+      return this->EvaluateAtIndex( index ) ; 
+    }
+
+  /** Get/Set the radius of the neighborhood over which the
+      statistics are evaluated */  
+  itkSetClampMacro(Number,short,1,7);
+  itkGetConstReferenceMacro( Number, short );
+
+protected:
+  HuImageFunction();
+  ~HuImageFunction(){};
+  void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  HuImageFunction( const Self& ); //purposely not implemented
+  void operator=( const Self& ); //purposely not implemented
+
+  short m_Number;  
+};
+
+} // namespace otb
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbHuImageFunction.txx"
+#endif
+
+#endif
+
diff --git a/Code/FeatureExtraction/otbHuImageFunction.txx b/Code/FeatureExtraction/otbHuImageFunction.txx
new file mode 100644
index 0000000000000000000000000000000000000000..5847dff282e9915de940b328111f08b89bb990c5
--- /dev/null
+++ b/Code/FeatureExtraction/otbHuImageFunction.txx
@@ -0,0 +1,191 @@
+/*=========================================================================
+
+    Program:   Insight Segmentation & Registration Toolkit
+    Module:    $RCSfile: itkMeanImageFunction.txx,v $
+    Language:  C++
+    Date:      $Date: 2004/12/12 22:07:24 $
+    Version:   $Revision: 1.12 $
+
+    Copyright (c) Insight Software Consortium. All rights reserved.
+    See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 _otbHuImageFunction_txx
+#define _otbHuImageFunction_txx
+
+#include "otbHuImageFunction.h"
+#include "otbComplexMomentImageFunction.h"
+#include "itkNumericTraits.h"
+#include "itkMacro.h"
+#include <complex>
+
+namespace otb
+{
+
+/**
+   * Constructor
+   */
+template < class TInput, class TOutput, class TCoordRep>
+HuImageFunction<TInput,TOutput,TCoordRep>
+::HuImageFunction()
+{
+  m_Number =-1; 
+}
+
+/**
+   *
+   */
+template < class TInput, class TOutput, class TCoordRep>
+void
+HuImageFunction<TInput,TOutput,TCoordRep>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  this->Superclass::PrintSelf(os,indent);
+  os << indent << " m_Number           : "  << m_Number << std::endl;
+}
+
+
+template < class TInput, class TOutput, class TCoordRep>
+typename HuImageFunction<TInput,TOutput,TCoordRep>::RealType
+HuImageFunction<TInput,TOutput,TCoordRep>
+::EvaluateAtIndex(const IndexType& index) const
+{
+  typename InputType::SizeType        ImageSize;
+  RealType                         HuValue;
+  ComplexType                      HuValueComplex;
+
+  typedef otb::ComplexMomentImageFunction<InputType,ComplexType>   CMType;
+  typename CMType::Pointer function =CMType::New();
+
+  if( !this->GetInputImage() )
+    {
+//      return std::complex<float>(0.,0.);  // A modifier
+    return ( itk::NumericTraits<RealType>::max() );
+    }
+  
+  if ( !this->IsInsideBuffer( index ) )
+    {
+//      return std::complex<float>(0.,0.); // A modifier
+    return ( itk::NumericTraits<RealType>::max() );
+    }
+
+  assert(m_Number > 0);
+  assert(m_Number < 8);
+	
+   function->SetInputImage( this->GetInputImage() );
+
+
+  switch(m_Number)
+    {
+    case 1 : 
+        {
+	ComplexType C11;
+	function->SetP(1);
+	function->SetQ(1);
+	C11 = function->EvaluateAtIndex( index );
+        HuValue = C11.real() ;
+	}
+	break;
+    case 2:
+        {
+	ComplexType C20,C02;
+	function->SetP(2);
+	function->SetQ(0);
+	C20 = function->EvaluateAtIndex( index );
+//	function->SetP(0);
+//	function->SetQ(2);
+//	C02 = function->EvaluateAtIndex( index );
+
+	HuValue = abs( C20 * conj(C20) ) ;
+
+	}
+	break;
+    case 3:
+        {
+	ComplexType C30,C03;
+	function->SetP(3);
+	function->SetQ(0);
+	C30 = function->EvaluateAtIndex( index );
+//	function->SetP(0);
+//	function->SetQ(3);
+//	C03 = function->EvaluateAtIndex( index );
+
+	HuValue = abs( C30 * conj(C30) );
+	}
+	break;
+    case 4:
+        {
+	ComplexType C21,C12;
+	function->SetP(2);
+	function->SetQ(1);
+	C21 = function->EvaluateAtIndex( index );
+//	function->SetP(1);
+//	function->SetQ(2);
+//	C12 = function->EvaluateAtIndex( index );
+
+	HuValue = abs( C21 * conj(C21) );
+	}	
+	break;
+
+    case 5:
+        {
+	ComplexType C30,C12;
+	function->SetP(3);
+	function->SetQ(0);
+	C30 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+
+	HuValueComplex = C30 * pow(C12,3) ;
+	HuValue = HuValueComplex.real();       
+	}	
+	break;
+
+    case 6:
+        {
+	ComplexType C20,C12;
+	function->SetP(2);
+	function->SetQ(0);
+	C20 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+
+	HuValueComplex = C20 * pow( C12 ,2 );
+	HuValue = HuValueComplex.real();         
+	}	
+	break;
+
+    case 7:
+        {
+	ComplexType C30,C12;
+	function->SetP(3);
+	function->SetQ(0);
+	C30 = function->EvaluateAtIndex( index );
+	function->SetP(1);
+	function->SetQ(2);
+	C12 = function->EvaluateAtIndex( index );
+
+	HuValueComplex = C30 * pow( C12 , 3);
+	HuValue = HuValueComplex.imag();         
+	}	
+	break;
+	
+    default:
+	itkWarningMacro("Hu's invariant parameters are between 1 and 7");	
+    }
+
+
+  return (static_cast<RealType>(HuValue) );
+
+}
+
+
+} // namespace otb
+
+#endif
diff --git a/Code/FeatureExtraction/otbRealMomentImageFunction.h b/Code/FeatureExtraction/otbRealMomentImageFunction.h
new file mode 100644
index 0000000000000000000000000000000000000000..4eb0adf71d6a11b1f2b70c7fd98438c490dd7265
--- /dev/null
+++ b/Code/FeatureExtraction/otbRealMomentImageFunction.h
@@ -0,0 +1,70 @@
+/*=========================================================================
+
+  Programme :   OTB (ORFEO ToolBox)
+  Auteurs   :   CS - P. Imbo
+  Language  :   C++
+  Date      :   17 mars 2006
+  Version   :   
+  Role      :   Real Geometric Moments Class of iamges 
+  $Id$
+
+=========================================================================*/
+#ifndef _otbRealMomentImageFunction_h
+#define _otbRealMomentImageFunction_h
+
+#include "otbGeometricMomentImageFunction.h"
+
+
+namespace otb
+{
+
+/**
+ * \class RealMomentImageFunction
+ * \brief Virtual class for the Real moments for an image function
+ *
+ * \ingroup ImageFunctions
+ */
+
+template < class TInput, 
+           class TOutput = float,
+	   class TCoordRep = float >
+class ITK_EXPORT RealMomentImageFunction :
+  public GeometricMomentImageFunction<TInput, TOutput,TCoordRep >
+{
+public:
+  /** Standard class typedefs. */
+  typedef RealMomentImageFunction                                     Self;
+  typedef GeometricMomentImageFunction< TInput, TOutput,TCoordRep >   Superclass;
+  typedef itk::SmartPointer<Self>                                     Pointer;
+  typedef itk::SmartPointer<const Self>                               ConstPointer;
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(RealMomentImageFunction, GeometricMomentImageFunction);
+
+
+  /** InputImageType typedef support. */
+  typedef typename Superclass::InputType            InputType;
+  typedef typename Superclass::IndexType            IndexType;
+  typedef typename Superclass::ContinuousIndexType  ContinuousIndexType;
+  typedef typename Superclass::PointType            PointType;
+ 
+  typedef TOutput                                   OutputType;
+
+
+protected:
+  RealMomentImageFunction() {};
+  ~RealMomentImageFunction(){};
+  void PrintSelf(std::ostream& os, itk::Indent indent) const 
+     {
+      Superclass::PrintSelf( os, indent );
+     }
+     
+private:
+  RealMomentImageFunction( const Self& ); //purposely not implemented
+  void operator=( const Self& );               //purposely not implemented
+};
+
+} // namespace otb
+
+#endif
+