From e32fe4cc3122f7b5bd385feb05a3ae304cdaa258 Mon Sep 17 00:00:00 2001 From: Emil Martinec Date: Wed, 17 Nov 2010 19:22:45 -0600 Subject: [PATCH] Bugfix for autoWB, WB averaging should be done in linear gamma. --- rtengine/rtthumbnail.cc | 37 +++++++++++++++++++------------------ rtengine/stdimagesource.cc | 12 ++++++++---- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 2e1c2238e..87ef8ec6d 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -162,30 +162,31 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, // histogram computation tpp->aeHistCompression = 3; tpp->aeHistogram = new unsigned int[65536>>tpp->aeHistCompression]; - memset (tpp->aeHistogram, 0, (65536>>tpp->aeHistCompression)*sizeof(int)); - int ix = 0; - for (int i=0; iheight*img->width; i++) { - tpp->aeHistogram[CurveFactory::igamma_srgb (img->data[ix++])>>tpp->aeHistCompression]++; - tpp->aeHistogram[CurveFactory::igamma_srgb (img->data[ix++])>>tpp->aeHistCompression]++; - tpp->aeHistogram[CurveFactory::igamma_srgb (img->data[ix++])>>tpp->aeHistCompression]++; - } - - // autowb computation - double avg_r = 0; + + double avg_r = 0; double avg_g = 0; double avg_b = 0; int n = 0; - for (int i=1; iheight-1; i++) - for (int j=1; jwidth-1; j++) { - int ofs = 3*(i*img->width + j); - int rtmp=img->data[ofs], gtmp=img->data[ofs+1], btmp=img->data[ofs+2]; - if (rtmp>64000 || gtmp>64000 || btmp>64000) - continue; - avg_r += rtmp; + + memset (tpp->aeHistogram, 0, (65536>>tpp->aeHistCompression)*sizeof(int)); + int ix = 0; + for (int i=0; iheight*img->width; i++) { + int rtmp=CurveFactory::igamma_srgb (img->data[ix++]); + int gtmp=CurveFactory::igamma_srgb (img->data[ix++]); + int btmp=CurveFactory::igamma_srgb (img->data[ix++]); + + if (rtmp<64000 && gtmp<64000 && btmp<64000) { + // autowb computation + avg_r += rtmp; avg_g += gtmp; avg_b += btmp; n++; - } + } + tpp->aeHistogram[rtmp>>tpp->aeHistCompression]++; + tpp->aeHistogram[gtmp>>tpp->aeHistCompression]++; + tpp->aeHistogram[btmp>>tpp->aeHistCompression]++; + } + if (n>0) ColorTemp::mul2temp (avg_r/n, avg_g/n, avg_b/n, tpp->autowbTemp, tpp->autowbGreen); diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 3c8e1b55b..695814790 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -464,18 +464,22 @@ ColorTemp StdImageSource::getAutoWB () { double avg_g = 0; double avg_b = 0; int n = 0; - int p = 6; + //int p = 6; for (int i=1; iheight-1; i++) for (int j=1; jwidth-1; j++) { if (img->r[i][j]>64000 || img->g[i][j]>64000 || img->b[i][j]>64000) continue; - avg_r += intpow((double)img->r[i][j], p); + avg_r += SQR((double)img->r[i][j]); + avg_g += SQR((double)img->g[i][j]); + avg_b += SQR((double)img->b[i][j]); + /*avg_r += intpow((double)img->r[i][j], p); avg_g += intpow((double)img->g[i][j], p); - avg_b += intpow((double)img->b[i][j], p); + avg_b += intpow((double)img->b[i][j], p);*/ + n++; } - return ColorTemp (avg_r/n, avg_g/n, avg_b/n); + return ColorTemp (sqrt(avg_r/n), sqrt(avg_g/n), sqrt(avg_b/n)); //return ColorTemp (pow(avg_r/n, 1.0/p), pow(avg_g/n, 1.0/p), pow(avg_b/n, 1.0/p)); }