diff --git a/Code/BasicFilters/otbConvolutionImageFilter.h b/Code/BasicFilters/otbConvolutionImageFilter.h
index da0db56ed929f131f9fcaf91d4b51a8928df788a..8fb10486981d37475933efd86ba7408fa225ca61 100644
--- a/Code/BasicFilters/otbConvolutionImageFilter.h
+++ b/Code/BasicFilters/otbConvolutionImageFilter.h
@@ -59,7 +59,8 @@ namespace otb
  * \ingroup MultiThreaded
  */
 template <class TInputImage, class TOutputImage, class TBoundaryCondition =
-            itk::ZeroFluxNeumannBoundaryCondition<TInputImage> >
+            itk::ZeroFluxNeumannBoundaryCondition<TInputImage>,
+          class TFilterPrecision = typename itk::NumericTraits<typename TInputImage::InternalPixelType>::RealType >
 class ITK_EXPORT ConvolutionImageFilter :
   public itk::ImageToImageFilter<TInputImage, TOutputImage>
 {
@@ -93,7 +94,8 @@ public:
   typedef typename InputImageType::RegionType                   InputImageRegionType;
   typedef typename OutputImageType::RegionType                  OutputImageRegionType;
   typedef typename InputImageType::SizeType                     InputSizeType;
-  typedef typename itk::Array<InputRealType>                    ArrayType;
+  typedef TFilterPrecision                                      FilterPrecisionType;
+  typedef typename itk::Array<FilterPrecisionType>              ArrayType;
   typedef TBoundaryCondition                                    BoundaryConditionType;
 
   /** Set the radius of the neighborhood of the filter */
diff --git a/Code/BasicFilters/otbConvolutionImageFilter.txx b/Code/BasicFilters/otbConvolutionImageFilter.txx
index 122d9911361858b7a18a1124373d6bcbf18f7066..85c1fe94f1ed606759ba1a07626628b506fb15ee 100644
--- a/Code/BasicFilters/otbConvolutionImageFilter.txx
+++ b/Code/BasicFilters/otbConvolutionImageFilter.txx
@@ -32,8 +32,8 @@
 namespace otb
 {
 
-template <class TInputImage, class TOutputImage, class TBoundaryCondition>
-ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
+template <class TInputImage, class TOutputImage, class TBoundaryCondition, class TFilterPrecision>
+ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition, TFilterPrecision>
 ::ConvolutionImageFilter()
 {
   m_Radius.Fill(1);
@@ -42,9 +42,9 @@ ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
   m_NormalizeFilter = false;
 }
 
-template <class TInputImage, class TOutputImage, class TBoundaryCondition>
+template <class TInputImage, class TOutputImage, class TBoundaryCondition, class TFilterPrecision>
 void
-ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
+ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition, TFilterPrecision>
 ::GenerateInputRequestedRegion() throw (itk::InvalidRequestedRegionError)
   {
   // call the superclass' implementation of this method
@@ -93,9 +93,9 @@ ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
     }
   }
 
-template<class TInputImage, class TOutputImage, class TBoundaryCondition>
+template<class TInputImage, class TOutputImage, class TBoundaryCondition, class TFilterPrecision>
 void
-ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
+ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition, TFilterPrecision>
 ::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
                        int threadId)
 {
@@ -158,9 +158,9 @@ ConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
 /**
  * Standard "PrintSelf" method
  */
-template <class TInputImage, class TOutput, class TBoundaryCondition>
+template <class TInputImage, class TOutput, class TBoundaryCondition, class TFilterPrecision>
 void
-ConvolutionImageFilter<TInputImage, TOutput, TBoundaryCondition>
+ConvolutionImageFilter<TInputImage, TOutput, TBoundaryCondition, TFilterPrecision>
 ::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
   Superclass::PrintSelf(os, indent);