avoid possible problems with zero values in tone mapping algorithms (http://code...
authorVadim Pisarevsky <vadim.pisarevsky@gmail.com>
Thu, 14 May 2015 16:32:25 +0000 (19:32 +0300)
committerVadim Pisarevsky <vadim.pisarevsky@gmail.com>
Thu, 14 May 2015 16:32:25 +0000 (19:32 +0300)
modules/photo/src/tonemap.cpp

index af930ab..e475482 100644 (file)
 namespace cv
 {
 
+inline void log_(const Mat& src, Mat& dst)
+{
+    max(src, Scalar::all(1e-4), dst);
+    log(dst, dst);
+}
+
 class TonemapImpl : public Tonemap
 {
 public:
@@ -122,7 +128,7 @@ public:
         Mat gray_img;
         cvtColor(img, gray_img, COLOR_RGB2GRAY);
         Mat log_img;
-        log(gray_img, log_img);
+        log_(gray_img, log_img);
         float mean = expf(static_cast<float>(sum(log_img)[0]) / log_img.total());
         gray_img /= mean;
         log_img.release();
@@ -205,7 +211,7 @@ public:
         Mat gray_img;
         cvtColor(img, gray_img, COLOR_RGB2GRAY);
         Mat log_img;
-        log(gray_img, log_img);
+        log_(gray_img, log_img);
         Mat map_img;
         bilateralFilter(log_img, map_img, -1, sigma_color, sigma_space);
 
@@ -289,7 +295,7 @@ public:
         Mat gray_img;
         cvtColor(img, gray_img, COLOR_RGB2GRAY);
         Mat log_img;
-        log(gray_img, log_img);
+        log_(gray_img, log_img);
 
         float log_mean = static_cast<float>(sum(log_img)[0] / log_img.total());
         double log_min, log_max;
@@ -383,7 +389,7 @@ public:
         Mat gray_img;
         cvtColor(img, gray_img, COLOR_RGB2GRAY);
         Mat log_img;
-        log(gray_img, log_img);
+        log_(gray_img, log_img);
 
         std::vector<Mat> x_contrast, y_contrast;
         getContrast(log_img, x_contrast, y_contrast);