diff --git a/Modules/Core/ImageBase/include/otbImage.h b/Modules/Core/ImageBase/include/otbImage.h
index 32f177dc07d52420af9e5734459ff1bd875ccaf5..238c7c06fe20b714cd58749f6e335f6af58b559f 100644
--- a/Modules/Core/ImageBase/include/otbImage.h
+++ b/Modules/Core/ImageBase/include/otbImage.h
@@ -31,6 +31,7 @@
 #endif
 
 #include "otbImageMetadataInterfaceBase.h"
+#include "OTBImageBaseExport.h"
 
 namespace otb
 {
@@ -85,7 +86,7 @@ namespace otb
  */
 
 template <class TPixel, unsigned int VImageDimension = 2>
-class ITK_EXPORT Image : public itk::Image<TPixel, VImageDimension>
+class OTBImageBase_EXPORT_TEMPLATE  Image : public itk::Image<TPixel, VImageDimension>
 {
 public:
   /** Standard class typedefs. */
@@ -274,18 +275,24 @@ private:
 #include "otbImage.hxx"
 #endif
 
+#include <complex>
+
 namespace otb {
 
 // Prevent implicit instanciation of common types to improve build performance
 // Explicit instanciations are provided in the .cxx
-extern template class Image<unsigned int, 2>;
-extern template class Image<int, 2>;
-extern template class Image<unsigned char, 2>;
-extern template class Image<char, 2>;
-extern template class Image<unsigned short, 2>;
-extern template class Image<short, 2>;
-extern template class Image<float, 2>;
-extern template class Image<double, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<unsigned int, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<int, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<unsigned char, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<char, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<unsigned short, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<short, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<float, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<double, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<std::complex<int> , 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<std::complex<short> , 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<std::complex<float> , 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE Image<std::complex<double> , 2>;
 
 }
 
diff --git a/Modules/Core/ImageBase/include/otbVectorImage.h b/Modules/Core/ImageBase/include/otbVectorImage.h
index 6c7d305c692f8f69826908e0d2a25d148d68542f..66f7ebe943ec1da0d8f7591760368016b3f666f2 100644
--- a/Modules/Core/ImageBase/include/otbVectorImage.h
+++ b/Modules/Core/ImageBase/include/otbVectorImage.h
@@ -30,6 +30,7 @@
 #include "itkVectorImage.h"
 #endif
 #include "otbImageMetadataInterfaceBase.h"
+#include "OTBImageBaseExport.h"
 
 namespace otb
 {
@@ -40,7 +41,7 @@ namespace otb
  * \ingroup OTBImageBase
  */
 template <class TPixel, unsigned int VImageDimension = 2>
-class ITK_EXPORT VectorImage : public itk::VectorImage<TPixel, VImageDimension>
+class OTBImageBase_EXPORT_TEMPLATE VectorImage : public itk::VectorImage<TPixel, VImageDimension>
 {
 public:
 
@@ -215,18 +216,24 @@ private:
 #include "otbVectorImage.hxx"
 #endif
 
+#include <complex>
+
 namespace otb {
 
 // Prevent implicit instanciation of common types to improve build performance
 // Explicit instanciations are provided in the .cxx
-extern template class VectorImage<unsigned int, 2>;
-extern template class VectorImage<int, 2>;
-extern template class VectorImage<unsigned char, 2>;
-extern template class VectorImage<char, 2>;
-extern template class VectorImage<unsigned short, 2>;
-extern template class VectorImage<short, 2>;
-extern template class VectorImage<float, 2>;
-extern template class VectorImage<double, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<unsigned int, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<int, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<unsigned char, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<char, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<unsigned short, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<short, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<float, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<double, 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<std::complex<int> , 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<std::complex<short> , 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<std::complex<float> , 2>;
+extern template class OTBImageBase_EXPORT_TEMPLATE VectorImage<std::complex<double> , 2>;
 
 }
 
diff --git a/Modules/Core/ImageBase/src/otbImage.cxx b/Modules/Core/ImageBase/src/otbImage.cxx
index 5ca6443b65172abc03c69a8d18c3572c462ab213..af7d4ccdef86682ae88bcca89b94c3735e6bd5b7 100644
--- a/Modules/Core/ImageBase/src/otbImage.cxx
+++ b/Modules/Core/ImageBase/src/otbImage.cxx
@@ -23,12 +23,16 @@
 namespace otb {
 
 // Explicit instanciation of common types
-template class Image<unsigned int, 2>;
-template class Image<int, 2>;
-template class Image<unsigned char, 2>;
-template class Image<char, 2>;
-template class Image<unsigned short, 2>;
-template class Image<short, 2>;
-template class Image<float, 2>;
-template class Image<double, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<unsigned int, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<int, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<unsigned char, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<char, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<unsigned short, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<short, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<float, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<double, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<std::complex<int>, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<std::complex<short>, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<std::complex<float>, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE Image<std::complex<double>, 2>;
 }
diff --git a/Modules/Core/ImageBase/src/otbVectorImage.cxx b/Modules/Core/ImageBase/src/otbVectorImage.cxx
index 46c827d4e0936b1def9357e888ce53908e552c3e..f80d3df6f1c6efce94bfd652944aaa49adab8356 100644
--- a/Modules/Core/ImageBase/src/otbVectorImage.cxx
+++ b/Modules/Core/ImageBase/src/otbVectorImage.cxx
@@ -23,14 +23,18 @@
 namespace otb {
 
 // Explicit instanciation of common types
-template class VectorImage<unsigned int, 2>;
-template class VectorImage<int, 2>;
-template class VectorImage<unsigned char, 2>;
-template class VectorImage<char, 2>;
-template class VectorImage<unsigned short, 2>;
-template class VectorImage<short, 2>;
-template class VectorImage<float, 2>;
-template class VectorImage<double, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<unsigned int, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<int, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<unsigned char, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<char, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<unsigned short, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<short, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<float, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<double, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<std::complex<int>, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<std::complex<short>, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<std::complex<float>, 2>;
+template class OTBImageBase_EXPORT_EXPLICIT_TEMPLATE VectorImage<std::complex<double>, 2>;
 
 }