diff --git a/Modules/Filtering/ImageManipulation/include/otbAffineFunctor.h b/Modules/Filtering/ImageManipulation/include/otbAffineFunctor.h
new file mode 100644
index 0000000000000000000000000000000000000000..2b7594f088e19f9fff6ad409fcb7d048ef880f79
--- /dev/null
+++ b/Modules/Filtering/ImageManipulation/include/otbAffineFunctor.h
@@ -0,0 +1,90 @@
+/*=========================================================================
+
+  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 __otbAffineFunctor_h
+#define __otbAffineFunctor_h
+
+namespace otb
+{
+namespace Functor
+{
+/** \class AffineFunctor
+ *  \brief This functor performs a linear transform of its input.
+ *
+ *  \f[ output = a*input + b \f]
+ *
+ * Coefficient a is a scalar, its type is templated (default is double).
+ * Coefficient b has the same type as output type. Standard casting is applied
+ * between input and output type.
+ *
+ * TInput and TOutput type are supposed to be scalar types.
+ *
+ * \ingroup OTBImageManipulation
+ */
+template<class TInput, class TOutput, class TScale=double>
+class AffineFunctor
+{
+public:
+  /// Constructor
+  AffineFunctor() {}
+
+  /// Constructor
+  virtual ~AffineFunctor() {}
+
+  /// Accessors
+  void SetA(TScale value)
+  {
+    m_A = value;
+  }
+  TScale GetA()
+  {
+    return m_A;
+  }
+  void SetB(TOutput value)
+  {
+    m_B = value;
+  }
+  TOutput GetB()
+  {
+    return m_B;
+  }
+
+  bool operator !=(const AffineFunctor& other) const
+  {
+    return ((m_A != other.GetA()) || (m_B != other.GetB()));
+  }
+
+  bool operator==(const AffineFunctor& other) const
+  {
+    return ((m_A == other.GetA()) && (m_B == other.GetB()));
+  }
+
+  // main computation method
+  inline TOutput operator()(const TInput & x) const
+  {
+    return (m_B + static_cast<TOutput>(m_A*x));
+  }
+
+private:
+  TScale  m_A;
+  TOutput m_B;
+};
+} // End namespace Functor
+} // End namespace otb
+
+#endif