diff --git a/Modules/Core/ImageBase/include/otbMultiToMonoChannelExtractROI.txx b/Modules/Core/ImageBase/include/otbMultiToMonoChannelExtractROI.txx
index c80108c525815170c9f2b56e7568defd33067634..095008aef1a9edf6dcfd34906c1765bd5ae13604 100644
--- a/Modules/Core/ImageBase/include/otbMultiToMonoChannelExtractROI.txx
+++ b/Modules/Core/ImageBase/include/otbMultiToMonoChannelExtractROI.txx
@@ -99,14 +99,13 @@ MultiToMonoChannelExtractROI<TInputPixelType, TOutputPixelType>
   InputIterator inIt(inputPtr, inputRegionForThread);
 
   // Parcours des canaux a traiter
-  unsigned int channelIn(m_Channel - 1);
+  const unsigned int channelIn(m_Channel - 1);
 
-  InputImagePixelType pixelInput;
   while (!outIt.IsAtEnd())
     {
-    OutputImagePixelType pixelOutput;
-    pixelInput = inIt.Get();
-    pixelOutput = static_cast<OutputValueType>(pixelInput[channelIn]);
+
+    InputImagePixelType const& pixelInput = inIt.Get();
+    OutputImagePixelType const pixelOutput = static_cast<OutputValueType>(pixelInput[channelIn]);
     outIt.Set(pixelOutput);
     ++outIt;
     ++inIt;
diff --git a/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.h
index 0b99e1edbd85638311ac7223cb314bc5eeab18de..6e179ae3cf56514f0e909142720d9f4ce94d6e8e 100644
--- a/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.h
@@ -55,6 +55,9 @@ public:
   typedef typename InputImage2Type::Pointer InputImage2PointerType;
   typedef typename OutputImageType::Pointer OutputImagePointerType;
 
+  typedef typename InputImage1Type::PixelType         InputPixel1Type;
+  typedef typename InputImage2Type::PixelType         InputPixel2Type;
+
   typedef typename OutputImageType::PixelType         OutputPixelType;
   typedef typename OutputImageType::InternalPixelType OutputInternalPixelType;
   typedef typename OutputImageType::RegionType        OutputImageRegionType;
diff --git a/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.txx
index dd116781d78fd61833c742f32e5cddabe37e4fa6..d956787de224486cc914c07ad6bc65faf6fdbcd7 100644
--- a/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbConcatenateVectorImageFilter.txx
@@ -157,31 +157,38 @@ ConcatenateVectorImageFilter<TInputImage1, TInputImage2, TOutputImage>
   input2It.GoToBegin();
   outputIt.GoToBegin();
 
+  typename OutputImageType::PixelType outputPix(outputIt.Get().GetSize());
+  // Retrieve the size of each input pixel
+  const unsigned int l1 = input1It.Get().GetSize();
+  const unsigned int l2 = input2It.Get().GetSize();
+
   // Iterate through the pixel
   while (!outputIt.IsAtEnd())
     {
-    // define an output pixel
-    typename OutputImageType::PixelType outpix;
-    // Retrieve the size of each input pixel
-    unsigned int l1 = input1It.Get().GetSize();
-    unsigned int l2 = input2It.Get().GetSize();
-    // Set the output pixel size
-    outpix.SetSize(l1 + l2);
+
+    // Check the size of each input pixel
+    assert(l1 == input1It.Get().GetSize());
+    assert(l2 == input2It.Get().GetSize());
+    // Check the size of the output pixel
+    assert(l1 + l2 == outputPix.GetSize());
+    // References to the input pixels
+    InputPixel1Type const& pix1 = input1It.Get();
+    InputPixel2Type const& pix2 = input2It.Get();
+
     // Loop through each band of the first image
     for (unsigned int i = 0; i < l1; ++i)
       {
       // Fill the output pixel
-      outpix[i] = static_cast<typename OutputImageType::InternalPixelType>(input1It.Get()[i]);
+      outputPix[i] = static_cast<typename OutputImageType::InternalPixelType>(pix1[i]);
       }
     // Loop though each band of the second image
     for (unsigned int i = 0; i < l2; ++i)
       {
       // Fill the output pixel
-
-      outpix[i + l1] = static_cast<typename OutputImageType::InternalPixelType>(input2It.Get()[i]);
+      outputPix[i + l1] = static_cast<typename OutputImageType::InternalPixelType>(pix2[i]);
       }
     // Set the output pixel
-    outputIt.Set(outpix);
+    outputIt.Set(outputPix);
     // Increment the iterator
     ++input1It;
     ++input2It;
diff --git a/Modules/Filtering/MathParser/include/otbBandMathImageFilter.txx b/Modules/Filtering/MathParser/include/otbBandMathImageFilter.txx
index 7e2b9b01c7ee430d298499fd28b85940f2381f50..8bc0e54ee7f236388aee45d6c5c6e777685d391a 100644
--- a/Modules/Filtering/MathParser/include/otbBandMathImageFilter.txx
+++ b/Modules/Filtering/MathParser/include/otbBandMathImageFilter.txx
@@ -155,10 +155,12 @@ void BandMathImageFilter<TImage>
   std::vector< std::string > tmpIdxVarNames;
 
   tmpIdxVarNames.resize(nbAccessIndex);
-  tmpIdxVarNames.at(0) = "idxX";
-  tmpIdxVarNames.at(1) = "idxY";
-  tmpIdxVarNames.at(2) = "idxPhyX";
-  tmpIdxVarNames.at(3) = "idxPhyY";
+
+  tmpIdxVarNames.resize(nbAccessIndex);
+  tmpIdxVarNames[0] = "idxX";
+  tmpIdxVarNames[1] = "idxY";
+  tmpIdxVarNames[2] = "idxPhyX";
+  tmpIdxVarNames[3] = "idxPhyY";
 
   // Check if input image dimensions matches
   inputSize[0] = this->GetNthInput(0)->GetLargestPossibleRegion().GetSize(0);
@@ -198,18 +200,18 @@ void BandMathImageFilter<TImage>
 
   for(i = 0; i < nbThreads; ++i)
     {
-    m_AImage.at(i).resize(m_NbVar);
-    m_VParser.at(i)->SetExpr(m_Expression);
+    m_AImage[i].resize(m_NbVar);
+    m_VParser[i]->SetExpr(m_Expression);
 
     for(j=0; j < nbInputImages; ++j)
       {
-      m_VParser.at(i)->DefineVar(m_VVarName.at(j), &(m_AImage.at(i).at(j)));
+      m_VParser[i]->DefineVar(m_VVarName[j], &(m_AImage[i][j]));
       }
 
     for(j=nbInputImages; j < nbInputImages+nbAccessIndex; ++j)
       {
-      m_VVarName.at(j) = tmpIdxVarNames.at(j-nbInputImages);
-      m_VParser.at(i)->DefineVar(m_VVarName.at(j), &(m_AImage.at(i).at(j)));
+      m_VVarName[j] = tmpIdxVarNames[j-nbInputImages];
+      m_VParser[i]->DefineVar(m_VVarName[j], &(m_AImage[i][j]));
       }
     }
 }
@@ -252,8 +254,9 @@ void BandMathImageFilter<TImage>
 
   typedef itk::ImageRegionConstIterator<TImage> ImageRegionConstIteratorType;
 
-  std::vector< ImageRegionConstIteratorType > Vit;
-  Vit.resize(nbInputImages);
+  assert(nbInputImages);
+  std::vector< ImageRegionConstIteratorType > Vit(nbInputImages);
+
   for(j=0; j < nbInputImages; ++j)
     {
     Vit[j] = ImageRegionConstIteratorType (this->GetNthInput(j), outputRegionForThread);
@@ -264,27 +267,33 @@ void BandMathImageFilter<TImage>
   // support progress methods/callbacks
   itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
 
-  while(!Vit.at(0).IsAtEnd())
-    {
-    for(j=0; j < nbInputImages; ++j)
-      {
-      m_AImage.at(threadId).at(j) = static_cast<double>(Vit.at(j).Get());
-      }
+  std::vector<double>      & threadImage     = m_AImage[threadId];
+  ParserType::Pointer const& threadParser    = m_VParser[threadId];
+  long                     & threadUnderflow = m_ThreadUnderflow[threadId];
+  long                     & threadOverflow  = m_ThreadOverflow[threadId];
+  ImageRegionConstIteratorType & firstImageRegion = Vit.front(); // alias for better perfs
+  while(!firstImageRegion.IsAtEnd())
+     {
+     for(j=0; j < nbInputImages; ++j)
+       {
+       threadImage[j] = static_cast<double>(Vit[j].Get());
+       }
 
     // Image Indexes
     for(j=0; j < 2; ++j)
       {
-      m_AImage.at(threadId).at(nbInputImages+j)   = static_cast<double>(Vit.at(0).GetIndex()[j]);
+      threadImage[nbInputImages+j]   = static_cast<double>(firstImageRegion.GetIndex()[j]);
       }
     for(j=0; j < 2; ++j)
       {
-      m_AImage.at(threadId).at(nbInputImages+2+j) = static_cast<double>(m_Origin[j])
-        +static_cast<double>(Vit.at(0).GetIndex()[j]) * static_cast<double>(m_Spacing[j]);
+      threadImage[nbInputImages+2+j] = static_cast<double>(m_Origin[j])
+        + static_cast<double>(firstImageRegion.GetIndex()[j]) * static_cast<double>(m_Spacing[j]);
       }
 
     try
       {
-      value = m_VParser.at(threadId)->Eval();
+
+      value = threadParser->Eval();
       }
     catch(itk::ExceptionObject& err)
       {
@@ -296,14 +305,14 @@ void BandMathImageFilter<TImage>
     if (value < double(itk::NumericTraits<PixelType>::NonpositiveMin()))
       {
       ot.Set(itk::NumericTraits<PixelType>::NonpositiveMin());
-      m_ThreadUnderflow[threadId]++;
+      threadUnderflow++;
       }
     // Case value is equal to inf or superior to the maximum value
     // allowed by the pixelType cast
     else if (value > double(itk::NumericTraits<PixelType>::max()))
       {
       ot.Set(itk::NumericTraits<PixelType>::max());
-      m_ThreadOverflow[threadId]++;
+      threadOverflow++;
       }
     else
       {
@@ -312,12 +321,13 @@ void BandMathImageFilter<TImage>
 
     for(j=0; j < nbInputImages; ++j)
       {
-      ++(Vit.at(j));
+      ++Vit[j];
       }
 
     ++ot;
 
     progress.CompletedPixel();
+
     }
 }