From aa242cec9fefe02b23d778b8f65ce1e1bb9c74f3 Mon Sep 17 00:00:00 2001
From: Cyrille Valladeau <cyrille.valladeau@c-s.fr>
Date: Thu, 13 Oct 2011 18:59:21 +0200
Subject: [PATCH] ENH: InputImageParameter::GetImage is templated. To be
 improved, code factorization :/

---
 .../ApplicationEngine/otbWrapperApplication.h |    9 +
 .../otbWrapperApplication.txx                 |   18 +-
 .../otbWrapperInputImageParameter.cxx         | 1610 ++++++++++++++++-
 .../otbWrapperInputImageParameter.h           |  107 +-
 4 files changed, 1709 insertions(+), 35 deletions(-)

diff --git a/Code/ApplicationEngine/otbWrapperApplication.h b/Code/ApplicationEngine/otbWrapperApplication.h
index d83260be3f..17806a3b75 100644
--- a/Code/ApplicationEngine/otbWrapperApplication.h
+++ b/Code/ApplicationEngine/otbWrapperApplication.h
@@ -284,6 +284,15 @@ public:
    */
   FloatVectorImageType* GetParameterImage(std::string parameter);
 
+  /* Get an image value
+   *
+   * Can be called for types :
+   * \li ParameterType_InputImage
+   */
+  template <class TImageType>
+    TImageType* GetParameterImage(std::string parameter);
+
+
   /* Get an image list value
    *
    * Can be called for types :
diff --git a/Code/ApplicationEngine/otbWrapperApplication.txx b/Code/ApplicationEngine/otbWrapperApplication.txx
index a6cc00a355..12d21fb4ef 100644
--- a/Code/ApplicationEngine/otbWrapperApplication.txx
+++ b/Code/ApplicationEngine/otbWrapperApplication.txx
@@ -18,7 +18,7 @@
 #include "otbWrapperApplication.h"
 
 #include "otbWrapperOutputImageParameter.h"
-
+#include "otbWrapperInputImageParameter.h"
 //#include "otbWrapperParameterGroup.h"
 
 
@@ -39,5 +39,21 @@ void Application::SetParameterOutputImage(std::string parameter, TImageType* val
     }
 }
 
+template <class TImageType>
+TImageType* Application::GetParameterImage(std::string parameter)
+{
+  typename TImageType::Pointer ret;
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<InputImageParameter*>(param))
+    {
+    InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
+    ret = paramDown->GetImage<TImageType>();
+    }
+
+  //TODO: exception if not found ?
+  return ret;
+}
+
 }
 }
diff --git a/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx b/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
index 91eb8bbe96..34ad90c4e3 100644
--- a/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
+++ b/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
@@ -17,6 +17,10 @@
 =========================================================================*/
 #include "otbWrapperInputImageParameter.h"
 #include "itksys/SystemTools.hxx"
+#include "otbImageFileReader.h"
+#include "itkCastImageFilter.h"
+#include "otbImageToVectorImageCastFilter.h"
+#include "otbWrapperTypes.h"
 
 namespace otb
 {
@@ -27,6 +31,8 @@ InputImageParameter::InputImageParameter()
 {
   this->SetName("Input Image");
   this->SetKey("in");
+  m_FileName="";
+  this->ClearValue();
 }
 
 InputImageParameter::~InputImageParameter()
@@ -44,7 +50,7 @@ InputImageParameter::SetFromFileName(const std::string& filename)
   if (!filename.empty()
       && itksys::SystemTools::FileExists(filename.c_str()))
     {
-    ImageFileReaderType::Pointer reader = ImageFileReaderType::New();
+    FloatVectorReaderType::Pointer reader = FloatVectorReaderType::New();
     reader->SetFileName(filename);
     try
       {
@@ -55,51 +61,1601 @@ InputImageParameter::SetFromFileName(const std::string& filename)
       this->ClearValue();
       }
 
-    // everything went fine, store the object references
-    m_Reader = reader;
-    m_Image = reader->GetOutput();
+    // the specified filename is valid => store the value
+    m_FileName = filename;
     SetActive(true);
     }
 }
 
-std::string
-InputImageParameter::GetFileName() const
+
+FloatVectorImageType*
+InputImageParameter::GetImage()
+{
+  return this->GetImage<FloatVectorImageType>();
+}
+
+
+template <class TOutputImage>
+TOutputImage *
+InputImageParameter::GetImage()
 {
-  if (m_Reader)
+  // 2 cases : the user set a filename vs. the user set an image
+  //////////////////////// Filename case:
+  if( !m_FileName.empty() )
     {
-    return m_Reader->GetFileName();
+    typedef otb::ImageFileReader<TOutputImage> ReaderType;
+    typename ReaderType::Pointer reader = ReaderType::New();
+    reader->SetFileName(m_FileName);
+    try
+      {
+      reader->UpdateOutputInformation();
+      }
+    catch(itk::ExceptionObject & err)
+      {
+      this->ClearValue();
+      }
+    
+    m_Image = reader->GetOutput();
+    m_Reader = reader;  
+    
+    // Pay attention, don't return m_Image because it is a ImageBase...
+    return reader->GetOutput();
+    }
+  //////////////////////// Image case:
+  else
+    {
+    if( m_Image.IsNull())
+      {
+      itkExceptionMacro("No input image or filename detected...");
+      }
+    else
+      {
+  if (dynamic_cast<Int8ImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int8ImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt8ImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt8ImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<Int16ImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int16ImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt16ImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt16ImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<Int32ImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int32ImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt32ImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt32ImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<FloatImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<FloatImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<DoubleImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<DoubleImageType, TOutputImage>();
+      }     
+    else if (dynamic_cast<Int8VectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int8VectorImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt8VectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt8VectorImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<Int16VectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int16VectorImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt16VectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt16VectorImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<Int32VectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int32VectorImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt32VectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt32VectorImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<FloatVectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<FloatVectorImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<DoubleVectorImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<DoubleVectorImageType, TOutputImage>();
+      }     
+    else if (dynamic_cast<Int8RGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int8RGBAImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt8RGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt8RGBAImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<Int16RGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int16RGBAImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt16RGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt16RGBAImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<Int32RGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<Int32RGBAImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<UInt32RGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<UInt32RGBAImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<FloatRGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<FloatRGBAImageType, TOutputImage>();
+      }
+    else if (dynamic_cast<DoubleRGBAImageType*>(m_Image.GetPointer()))
+      {
+      return CastImage<DoubleRGBAImageType, TOutputImage>();
+      }     
+    else
+      {
+      itkExceptionMacro("Unknown image type");
+      }
+  
+      }
     }
-
-  itkExceptionMacro(<< "No filename value");
 }
 
 
-FloatVectorImageType*
-InputImageParameter::GetImage() const
+template <class TInputImage, class TOutputImage>
+TOutputImage*
+InputImageParameter::SimpleCastImage()
 {
-  return m_Image;
+  TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
+  
+  typedef itk::CastImageFilter<TInputImage, TOutputImage> CasterType;
+  typename CasterType::Pointer caster = CasterType::New();
+  
+  caster->SetInput(realInputImage);
+  caster->UpdateOutputInformation();
+  
+  m_Image = caster->GetOutput();
+  m_Caster = caster;
+  
+  return caster->GetOutput();
 }
-
-void
-InputImageParameter::SetImage(FloatVectorImageType* image)
+  
+                       
+template <class TInputImage, class TOutputImage>
+TOutputImage* 
+InputImageParameter::CastVectorImageFromImage()
 {
-   m_Image = image;
-   m_Reader = ImageFileReaderType::Pointer();
+  TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
+  
+  typedef ImageToVectorImageCastFilter<TInputImage, TOutputImage> CasterType;
+  typename CasterType::Pointer caster = CasterType::New();
+  
+  caster->SetInput(realInputImage);
+  caster->UpdateOutputInformation();
+  
+  m_Image = caster->GetOutput();
+  m_Caster = caster;
+  
+  return caster->GetOutput();
 }
 
-bool
-InputImageParameter::HasValue() const
-{
-  return m_Image.IsNotNull();
+/*********************************************************************
+********************** Image -> Image
+**********************************************************************/
+/////////// Int8ImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<Int8ImageType, Int8ImageType>(){
+  return this->SimpleCastImage<Int8ImageType, Int8ImageType>();
 }
 
-void
-InputImageParameter::ClearValue()
-{
-  m_Image = FloatVectorImageType::Pointer();
-  m_Reader = ImageFileReaderType::Pointer();
+template <> UInt8ImageType *
+InputImageParameter::CastImage<Int8ImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<Int8ImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<Int8ImageType, Int16ImageType>(){
+  return this->SimpleCastImage<Int8ImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<Int8ImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<Int8ImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<Int8ImageType, Int32ImageType>(){
+  return this->SimpleCastImage<Int8ImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<Int8ImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<Int8ImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<Int8ImageType, FloatImageType>(){
+  return this->SimpleCastImage<Int8ImageType, FloatImageType>();
+}
+
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<Int8ImageType, DoubleImageType>(){
+  return this->SimpleCastImage<Int8ImageType, DoubleImageType>();
+}
+
+
+/////////// UInt8ImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<UInt8ImageType, Int8ImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, Int8ImageType>();
+}
+
+template <> UInt8ImageType *
+InputImageParameter::CastImage<UInt8ImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<UInt8ImageType, Int16ImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<UInt8ImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<UInt8ImageType, Int32ImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<UInt8ImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<UInt8ImageType, FloatImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, FloatImageType>();
+}
+
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<UInt8ImageType, DoubleImageType>(){
+  return this->SimpleCastImage<UInt8ImageType, DoubleImageType>();
+}
+
+/////////// Int16ImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<Int16ImageType, Int8ImageType>(){
+  return this->SimpleCastImage<Int16ImageType, Int8ImageType>();
+}
+
+template <> UInt8ImageType *
+InputImageParameter::CastImage<Int16ImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<Int16ImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<Int16ImageType, Int16ImageType>(){
+  return this->SimpleCastImage<Int16ImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<Int16ImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<Int16ImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<Int16ImageType, Int32ImageType>(){
+  return this->SimpleCastImage<Int16ImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<Int16ImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<Int16ImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<Int16ImageType, FloatImageType>(){
+  return this->SimpleCastImage<Int16ImageType, FloatImageType>();
 }
 
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<Int16ImageType, DoubleImageType>(){
+  return this->SimpleCastImage<Int16ImageType, DoubleImageType>();
+}
+
+/////////// UInt16ImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<UInt16ImageType, Int8ImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, Int8ImageType>();
+}
+
+template <> UInt8ImageType *
+InputImageParameter::CastImage<UInt16ImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<UInt16ImageType, Int16ImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<UInt16ImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<UInt16ImageType, Int32ImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<UInt16ImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<UInt16ImageType, FloatImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, FloatImageType>();
+}
+
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<UInt16ImageType, DoubleImageType>(){
+  return this->SimpleCastImage<UInt16ImageType, DoubleImageType>();
+}
+
+/////////// Int32ImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<Int32ImageType, Int8ImageType>(){
+  return this->SimpleCastImage<Int32ImageType, Int8ImageType>();
+}
+
+template <> UInt8ImageType *
+InputImageParameter::CastImage<Int32ImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<Int32ImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<Int32ImageType, Int16ImageType>(){
+  return this->SimpleCastImage<Int32ImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<Int32ImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<Int32ImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<Int32ImageType, Int32ImageType>(){
+  return this->SimpleCastImage<Int32ImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<Int32ImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<Int32ImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<Int32ImageType, FloatImageType>(){
+  return this->SimpleCastImage<Int32ImageType, FloatImageType>();
+}
+
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<Int32ImageType, DoubleImageType>(){
+  return this->SimpleCastImage<Int32ImageType, DoubleImageType>();
+}
+
+
+/////////// UInt32ImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<UInt32ImageType, Int8ImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, Int8ImageType>();
+}
+
+template <> UInt8ImageType *
+InputImageParameter::CastImage<UInt32ImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<UInt32ImageType, Int16ImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<UInt32ImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<UInt32ImageType, Int32ImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<UInt32ImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<UInt32ImageType, FloatImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, FloatImageType>();
+}
+
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<UInt32ImageType, DoubleImageType>(){
+  return this->SimpleCastImage<UInt32ImageType, DoubleImageType>();
+}
+
+/////////// FloatImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<FloatImageType, Int8ImageType>(){
+  return this->SimpleCastImage<FloatImageType, Int8ImageType>();
+}
+
+template <> UInt8ImageType *
+InputImageParameter::CastImage<FloatImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<FloatImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<FloatImageType, Int16ImageType>(){
+  return this->SimpleCastImage<FloatImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<FloatImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<FloatImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<FloatImageType, Int32ImageType>(){
+  return this->SimpleCastImage<FloatImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<FloatImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<FloatImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<FloatImageType, FloatImageType>(){
+  return this->SimpleCastImage<FloatImageType, FloatImageType>();
+}
+
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<FloatImageType, DoubleImageType>(){
+  return this->SimpleCastImage<FloatImageType, DoubleImageType>();
+}
+
+/////////// DoubleImageType->...
+template <> Int8ImageType *
+InputImageParameter::CastImage<DoubleImageType, Int8ImageType>(){
+  return this->SimpleCastImage<DoubleImageType, Int8ImageType>();
+}
+
+template <> UInt8ImageType *
+InputImageParameter::CastImage<DoubleImageType, UInt8ImageType>(){
+  return this->SimpleCastImage<DoubleImageType, UInt8ImageType>();
+}
+
+template <>  Int16ImageType*
+InputImageParameter::CastImage<DoubleImageType, Int16ImageType>(){
+  return this->SimpleCastImage<DoubleImageType, Int16ImageType>();
+}
+
+template <> UInt16ImageType*
+InputImageParameter::CastImage<DoubleImageType, UInt16ImageType>(){
+  return this->SimpleCastImage<DoubleImageType, UInt16ImageType>();
+}
+
+template <>  Int32ImageType*
+InputImageParameter::CastImage<DoubleImageType, Int32ImageType>(){
+  return this->SimpleCastImage<DoubleImageType, Int32ImageType>();
+}
+
+
+template <>  UInt32ImageType*
+InputImageParameter::CastImage<DoubleImageType, UInt32ImageType>(){
+  return this->SimpleCastImage<DoubleImageType, UInt32ImageType>();
+}
+
+template <> FloatImageType *                                                 
+InputImageParameter::CastImage<DoubleImageType, FloatImageType>(){
+  return this->SimpleCastImage<DoubleImageType, FloatImageType>();
+}
+
+template <> DoubleImageType *                                                 
+InputImageParameter::CastImage<DoubleImageType, DoubleImageType>(){
+  return this->SimpleCastImage<DoubleImageType, DoubleImageType>();
+}
+
+
+
+/*********************************************************************
+********************** VectorImage -> VectorImage
+**********************************************************************/
+/////////// Int8VectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<Int8VectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<Int8VectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<Int8VectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<Int8VectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<Int8VectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<Int8VectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<Int8VectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<Int8VectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<Int8VectorImageType, DoubleVectorImageType>();
+}
+
+
+/////////// UInt8VectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<UInt8VectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<UInt8VectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<UInt8VectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<UInt8VectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<UInt8VectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<UInt8VectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<UInt8VectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<UInt8VectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<UInt8VectorImageType, DoubleVectorImageType>();
+}
+
+/////////// Int16VectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<Int16VectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<Int16VectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<Int16VectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<Int16VectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<Int16VectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<Int16VectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<Int16VectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<Int16VectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<Int16VectorImageType, DoubleVectorImageType>();
+}
+
+/////////// UInt16VectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<UInt16VectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<UInt16VectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<UInt16VectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<UInt16VectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<UInt16VectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<UInt16VectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<UInt16VectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<UInt16VectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<UInt16VectorImageType, DoubleVectorImageType>();
+}
+
+/////////// Int32VectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<Int32VectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<Int32VectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<Int32VectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<Int32VectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<Int32VectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<Int32VectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<Int32VectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<Int32VectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<Int32VectorImageType, DoubleVectorImageType>();
+}
+
+
+/////////// UInt32VectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<UInt32VectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<UInt32VectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<UInt32VectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<UInt32VectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<UInt32VectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<UInt32VectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<UInt32VectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<UInt32VectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<UInt32VectorImageType, DoubleVectorImageType>();
+}
+
+/////////// FloatVectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<FloatVectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<FloatVectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<FloatVectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<FloatVectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<FloatVectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<FloatVectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<FloatVectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<FloatVectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<FloatVectorImageType, DoubleVectorImageType>();
+}
+
+/////////// DoubleVectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<DoubleVectorImageType, Int8VectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<DoubleVectorImageType, UInt8VectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<DoubleVectorImageType, Int16VectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<DoubleVectorImageType, UInt16VectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<DoubleVectorImageType, Int32VectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<DoubleVectorImageType, UInt32VectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<DoubleVectorImageType, FloatVectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<DoubleVectorImageType, DoubleVectorImageType>(){
+  return this->SimpleCastImage<DoubleVectorImageType, DoubleVectorImageType>();
+}
+
+
+/*********************************************************************
+********************** RGBAImage -> RGBAImage
+**********************************************************************/
+/////////// Int8RGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<Int8RGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<Int8RGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<Int8RGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<Int8RGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<Int8RGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<Int8RGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<Int8RGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<Int8RGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<Int8RGBAImageType, DoubleRGBAImageType>();
+}
+
+
+/////////// UInt8RGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<UInt8RGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<UInt8RGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<UInt8RGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<UInt8RGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<UInt8RGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<UInt8RGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<UInt8RGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<UInt8RGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<UInt8RGBAImageType, DoubleRGBAImageType>();
+}
+
+/////////// Int16RGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<Int16RGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<Int16RGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<Int16RGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<Int16RGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<Int16RGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<Int16RGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<Int16RGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<Int16RGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<Int16RGBAImageType, DoubleRGBAImageType>();
+}
+
+/////////// UInt16RGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<UInt16RGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<UInt16RGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<UInt16RGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<UInt16RGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<UInt16RGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<UInt16RGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<UInt16RGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<UInt16RGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<UInt16RGBAImageType, DoubleRGBAImageType>();
+}
+
+/////////// Int32RGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<Int32RGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<Int32RGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<Int32RGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<Int32RGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<Int32RGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<Int32RGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<Int32RGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<Int32RGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<Int32RGBAImageType, DoubleRGBAImageType>();
+}
+
+
+/////////// UInt32RGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<UInt32RGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<UInt32RGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<UInt32RGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<UInt32RGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<UInt32RGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<UInt32RGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<UInt32RGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<UInt32RGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<UInt32RGBAImageType, DoubleRGBAImageType>();
+}
+
+/////////// FloatRGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<FloatRGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<FloatRGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<FloatRGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<FloatRGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<FloatRGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<FloatRGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<FloatRGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<FloatRGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<FloatRGBAImageType, DoubleRGBAImageType>();
+}
+
+/////////// DoubleRGBAImageType->...
+template <> Int8RGBAImageType *
+InputImageParameter::CastImage<DoubleRGBAImageType, Int8RGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, Int8RGBAImageType>();
+}
+
+template <> UInt8RGBAImageType *
+InputImageParameter::CastImage<DoubleRGBAImageType, UInt8RGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, UInt8RGBAImageType>();
+}
+
+template <>  Int16RGBAImageType*
+InputImageParameter::CastImage<DoubleRGBAImageType, Int16RGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, Int16RGBAImageType>();
+}
+
+template <> UInt16RGBAImageType*
+InputImageParameter::CastImage<DoubleRGBAImageType, UInt16RGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, UInt16RGBAImageType>();
+}
+
+template <>  Int32RGBAImageType*
+InputImageParameter::CastImage<DoubleRGBAImageType, Int32RGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, Int32RGBAImageType>();
+}
+
+
+template <>  UInt32RGBAImageType*
+InputImageParameter::CastImage<DoubleRGBAImageType, UInt32RGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, UInt32RGBAImageType>();
+}
+
+template <> FloatRGBAImageType *                                                 
+InputImageParameter::CastImage<DoubleRGBAImageType, FloatRGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, FloatRGBAImageType>();
+}
+
+template <> DoubleRGBAImageType *                                                 
+InputImageParameter::CastImage<DoubleRGBAImageType, DoubleRGBAImageType>(){
+  return this->SimpleCastImage<DoubleRGBAImageType, DoubleRGBAImageType>();
+}
+
+
+/*********************************************************************
+********************** Image -> VectorImage
+**********************************************************************/
+/////////// Int8ImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<Int8ImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<Int8ImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<Int8ImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<Int8ImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<Int8ImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<Int8ImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<Int8ImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<Int8ImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<Int8ImageType, DoubleVectorImageType>();
+}
+
+
+/////////// UInt8ImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<UInt8ImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<UInt8ImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<UInt8ImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<UInt8ImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<UInt8ImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<UInt8ImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<UInt8ImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<UInt8ImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<UInt8ImageType, DoubleVectorImageType>();
+}
+
+/////////// Int16ImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<Int16ImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<Int16ImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<Int16ImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<Int16ImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<Int16ImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<Int16ImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<Int16ImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<Int16ImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<Int16ImageType, DoubleVectorImageType>();
+}
+
+/////////// UInt16VectorImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<UInt16ImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<UInt16ImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<UInt16ImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<UInt16ImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<UInt16ImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<UInt16ImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<UInt16ImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<UInt16ImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<UInt16ImageType, DoubleVectorImageType>();
+}
+
+/////////// Int32ImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<Int32ImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<Int32ImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<Int32ImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<Int32ImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<Int32ImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<Int32ImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<Int32ImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<Int32ImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<Int32ImageType, DoubleVectorImageType>();
+}
+
+
+/////////// UInt32ImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<UInt32ImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<UInt32ImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<UInt32ImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<UInt32ImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<UInt32ImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<UInt32ImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<UInt32ImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<UInt32ImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<UInt32ImageType, DoubleVectorImageType>();
+}
+
+/////////// FloatImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<FloatImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<FloatImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<FloatImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<FloatImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<FloatImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<FloatImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<FloatImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<FloatImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<FloatImageType, DoubleVectorImageType>();
+}
+
+/////////// DoubleImageType->...
+template <> Int8VectorImageType *
+InputImageParameter::CastImage<DoubleImageType, Int8VectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, Int8VectorImageType>();
+}
+
+template <> UInt8VectorImageType *
+InputImageParameter::CastImage<DoubleImageType, UInt8VectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, UInt8VectorImageType>();
+}
+
+template <>  Int16VectorImageType*
+InputImageParameter::CastImage<DoubleImageType, Int16VectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, Int16VectorImageType>();
+}
+
+template <> UInt16VectorImageType*
+InputImageParameter::CastImage<DoubleImageType, UInt16VectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, UInt16VectorImageType>();
+}
+
+template <>  Int32VectorImageType*
+InputImageParameter::CastImage<DoubleImageType, Int32VectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, Int32VectorImageType>();
+}
+
+
+template <>  UInt32VectorImageType*
+InputImageParameter::CastImage<DoubleImageType, UInt32VectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, UInt32VectorImageType>();
+}
+
+template <> FloatVectorImageType *                                                 
+InputImageParameter::CastImage<DoubleImageType, FloatVectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, FloatVectorImageType>();
+}
+
+template <> DoubleVectorImageType *                                                 
+InputImageParameter::CastImage<DoubleImageType, DoubleVectorImageType>(){
+  return this->CastVectorImageFromImage<DoubleImageType, DoubleVectorImageType>();
+}
+
+
+
+void
+InputImageParameter::SetImage(FloatVectorImageType* image)
+{
+  this->SetImage<FloatVectorImageType>( image );
+}
+
+
+template <class TInputImage>
+void
+InputImageParameter::SetImage(TInputImage* image)
+{
+   m_Image = image;
+}
+
+
+bool
+InputImageParameter::HasValue() const
+{
+  if( m_FileName.empty() && m_Image.IsNull() )
+    return false;
+  else
+    return true;
+}
+
+void
+InputImageParameter::ClearValue()
+{
+  m_Image = ImageBaseType::New();
+  m_Reader = NULL;
+  m_Caster = NULL;
+}
+
+
 }
 }
 
diff --git a/Code/ApplicationEngine/otbWrapperInputImageParameter.h b/Code/ApplicationEngine/otbWrapperInputImageParameter.h
index 5d06c8198e..6aa709047f 100644
--- a/Code/ApplicationEngine/otbWrapperInputImageParameter.h
+++ b/Code/ApplicationEngine/otbWrapperInputImageParameter.h
@@ -19,7 +19,7 @@
 #define __otbWrapperInputImageParameter_h
 
 #include "otbImageFileReader.h"
-
+#include "itkImageBase.h"
 #include "otbWrapperParameter.h"
 
 namespace otb
@@ -39,6 +39,8 @@ public:
   typedef itk::SmartPointer<Self>       Pointer;
   typedef itk::SmartPointer<const Self> ConstPointer;
 
+  typedef itk::ImageBase<2> ImageBaseType;
+
   /** Defining ::New() static method */
   itkNewMacro(Self);
 
@@ -47,17 +49,49 @@ public:
 
   /** Set value from filename */
   void SetFromFileName(const std::string& filename);
+  itkGetConstMacro(FileName, std::string);
 
-  std::string GetFileName() const;
+  /** Get the input image as FloatVectorImageType */
+  FloatVectorImageType* GetImage();
+  
+  /** Get the input image as templated image type. */
+  template <class TImageType>
+    TImageType* GetImage();
 
-  FloatVectorImageType* GetImage() const;
+  template <class TOutputImage>
+    TOutputImage* GetImage(unsigned int typeIn);
 
+  /** Set a FloatVectorImageType image.*/
   void SetImage(FloatVectorImageType* image);
 
+  /** Set a templated image.*/
+  template <class TImageType>
+    void SetImage(TImageType* image);
+  
+  
+    /** Generic cast method that will be specified for each image type. */  
+  template <class TInputImage, class TOutputImage>
+    TOutputImage* CastImage()
+  {
+    itkExceptionMacro("Cast from "<<typeid(TInputImage).name()<<" to "<<typeid(TInputImage).name()<<" not authorized.");
+  }
+
+  /** Cast an image to an image of the same type
+  * Image to Image, VectorImage to VectorImage, RGBAImage to RGBAImage. */
+  template <class TInputImage, class TOutputImage>
+    TOutputImage* SimpleCastImage();
+
+
+  /** Cast an image to a vector image. */
+  template <class TInputImage, class TOutputImage>
+    TOutputImage* CastVectorImageFromImage();
+  
+  
   bool HasValue() const;
 
   void ClearValue();
 
+  
 protected:
   /** Constructor */
   InputImageParameter();
@@ -65,10 +99,69 @@ protected:
   /** Destructor */
   virtual ~InputImageParameter();
 
-  FloatVectorImageType::Pointer m_Image;
-
-  typedef otb::ImageFileReader<FloatVectorImageType> ImageFileReaderType;
-  ImageFileReaderType::Pointer m_Reader;
+  ImageBaseType::Pointer m_Image;
+  std::string m_FileName;
+
+
+  /** Readers typedefs */
+
+  typedef otb::ImageFileReader<Int8ImageType> Int8ReaderType;
+  typedef otb::ImageFileReader<UInt8ImageType> UInt8ReaderType;
+  typedef otb::ImageFileReader<Int16ImageType> Int16ReaderType;
+  typedef otb::ImageFileReader<UInt16ImageType> UInt16ReaderType;
+  typedef otb::ImageFileReader<Int32ImageType> Int32ReaderType;
+  typedef otb::ImageFileReader<UInt32ImageType> UInt32ReaderType;
+  typedef otb::ImageFileReader<FloatImageType> FloatReaderType;
+  typedef otb::ImageFileReader<DoubleImageType> DoubleReaderType;
+
+  typedef otb::ImageFileReader<Int8VectorImageType> Int8VectorReaderType;
+  typedef otb::ImageFileReader<UInt8VectorImageType> UInt8VectorReaderType;
+  typedef otb::ImageFileReader<Int16VectorImageType> Int16VectorReaderType;
+  typedef otb::ImageFileReader<UInt16VectorImageType> UInt16VectorReaderType;
+  typedef otb::ImageFileReader<Int32VectorImageType> Int32VectorReaderType;
+  typedef otb::ImageFileReader<UInt32VectorImageType> UInt32VectorReaderType;
+  typedef otb::ImageFileReader<FloatVectorImageType> FloatVectorReaderType;
+  typedef otb::ImageFileReader<DoubleVectorImageType> DoubleVectorReaderType;
+
+  typedef otb::ImageFileReader<Int8RGBAImageType> Int8RGBAReaderType;
+  typedef otb::ImageFileReader<UInt8RGBAImageType> UInt8RGBAReaderType;
+  typedef otb::ImageFileReader<Int16RGBAImageType> Int16RGBAReaderType;
+  typedef otb::ImageFileReader<UInt16RGBAImageType> UInt16RGBAReaderType;
+  typedef otb::ImageFileReader<Int32RGBAImageType> Int32RGBAReaderType;
+  typedef otb::ImageFileReader<UInt32RGBAImageType> UInt32RGBAReaderType;
+  typedef otb::ImageFileReader<FloatRGBAImageType> FloatRGBAReaderType;
+  typedef otb::ImageFileReader<DoubleRGBAImageType> DoubleRGBAReaderType;
+
+/*
+  Int8ReaderType::Pointer   m_Int8Reader;
+  UInt8ReaderType::Pointer  m_UInt8Reader;
+  Int16ReaderType::Pointer  m_Int16Reader;
+  UInt16ReaderType::Pointer m_UInt16Reader;
+  Int32ReaderType::Pointer  m_Int32Reader;
+  UInt32ReaderType::Pointer m_UInt32Reader;
+  FloatReaderType::Pointer  m_FloatReader;
+  DoubleReaderType::Pointer m_DoubleReader;
+
+  VectorInt8ReaderType::Pointer   m_VectorInt8Reader;
+  VectorUInt8ReaderType::Pointer  m_VectorUInt8Reader;
+  VectorInt16ReaderType::Pointer  m_VectorInt16Reader;
+  VectorUInt16ReaderType::Pointer m_VectorUInt16Reader;
+  VectorInt32ReaderType::Pointer  m_VectorInt32Reader;
+  VectorUInt32ReaderType::Pointer m_VectorUInt32Reader;
+  VectorFloatReaderType::Pointer  m_VectorFloatReader;
+  VectorDoubleReaderType::Pointer m_VectorDoubleReader;
+
+  RGBAInt8ReaderType::Pointer   m_RGBAInt8Reader;
+  RGBAUInt8ReaderType::Pointer  m_RGBAUInt8Reader;
+  RGBAInt16ReaderType::Pointer  m_RGBAInt16Reader;
+  RGBAUInt16ReaderType::Pointer m_RGBAUInt16Reader;
+  RGBAInt32ReaderType::Pointer  m_RGBAInt32Reader;
+  RGBAUInt32ReaderType::Pointer m_RGBAUInt32Reader;
+  RGBAFloatReaderType::Pointer  m_RGBAFloatReader;
+  RGBADoubleReaderType::Pointer m_RGBADoubleReader;
+*/
+  itk::ProcessObject * m_Reader;
+  itk::ProcessObject * m_Caster;
 
 private:
   InputImageParameter(const Parameter &); //purposely not implemented
-- 
GitLab