From 3324f40de0dba078a63a5cde9a5984481293845c Mon Sep 17 00:00:00 2001 From: Jonathan Guinet <jonathan.guinet@c-s.fr> Date: Mon, 2 Jul 2012 14:47:39 +0200 Subject: [PATCH] ENH: NCC is calculated in double precision, and then casted to image pixel type. --- .../otbPixelWiseBlockMatchingImageFilter.h | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h index 0674370dff..a4980b4b48 100644 --- a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h +++ b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h @@ -79,29 +79,39 @@ public: // Implement the NCC operator inline MetricValueType operator()(ConstNeighborhoodIteratorType & a, ConstNeighborhoodIteratorType & b) const { - MetricValueType meanA(0),meanB(0), sigmaA(0), sigmaB(0), cov(0), ncc(0); - + //MetricValueType meanA(0),meanB(0), sigmaA(0), sigmaB(0), cov(0), ncc(0); + double meanA=0.0; + double meanB=0.0; + double sigmaA=0.0; + double sigmaB=0.0; + double cov=0.0; + double ncc=0.0; + double valueA; + double valueB; + double size=a.Size(); // For some reason, iterators do not work on neighborhoods - for(unsigned int i = 0; i<a.Size(); ++i) + for(unsigned int i = 0; i<size; ++i) { - meanA+=a.GetPixel(i); - meanB+=b.GetPixel(i); + meanA+=static_cast<double>(a.GetPixel(i)); + meanB+=static_cast<double>(b.GetPixel(i)); } // Compute mean - meanA/=a.Size(); - meanB/=b.Size(); + meanA/=size; + meanB/=size; - for(unsigned int i = 0; i<a.Size(); ++i) + for(unsigned int i = 0; i<size; ++i) { - cov+=(a.GetPixel(i)-meanA)*(b.GetPixel(i)-meanB); - sigmaA+=(a.GetPixel(i)-meanA)*(a.GetPixel(i)-meanA); - sigmaB+=(b.GetPixel(i)-meanB)*(b.GetPixel(i)-meanB); + valueA=static_cast<double>(a.GetPixel(i)); + valueB=static_cast<double>(b.GetPixel(i)); + cov+=(valueA-meanA)*(valueB-meanB); + sigmaA+=(valueA-meanA)*(valueA-meanA); + sigmaB+=(valueB-meanB)*(valueB-meanB); } - cov/=a.Size()-1; - sigmaA/=a.Size()-1; - sigmaB/=a.Size()-1; + cov/=size-1; + sigmaA/=size-1; + sigmaB/=size-1; sigmaA = vcl_sqrt(sigmaA); sigmaB = vcl_sqrt(sigmaB); @@ -114,7 +124,7 @@ public: ncc = 0; } - return ncc; + return static_cast<MetricValueType>(ncc); } }; -- GitLab