RFC, fix overexposing white balance

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

RFC, fix overexposing white balance

pochini
Hi all!

IMHO the white balance tool is quite useless in its current form because it
overexposes and clips at least one of the rgb components almost always. The
exposure compensation thing does not help because it is applied on the
already clipped image. I wrote the simple patch below that makes the wb
tool useable by scaling down the wb multipiers just enough to prevent
clipping.

The biggest problem is that the final result can be quite a lot dimmer than
the preview image because the scaler smooths the (usually tiny) brightest
spots of the photo.



--- digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp__orig 2010-11-22 18:47:36.000000000 +0100
+++ digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp 2010-12-06 22:37:29.000000000 +0100
@@ -294,6 +294,38 @@ void WBFilter::adjustWhiteBalance(uchar*
         uchar  red, green, blue;
         uchar* ptr = data;
 
+
+        int maxr, maxg, maxb, max;
+        double adjust;
+
+        // Look for the maximum r, g, b values in the given image
+        maxr = maxg = maxb = 0;
+        for (j = 0 ; j < size; ++j) {
+            if (maxb < ptr[0])  maxb = ptr[0];
+            if (maxg < ptr[1])  maxg = ptr[1];
+            if (maxr < ptr[2])  maxr = ptr[2];
+            ptr += 4;
+        }
+printf("maxrgb=%d, %d, %d\n", maxr, maxg, maxb);
+printf("mrgb=%f, %f, %f\n", d->mr, d->mg, d->mb);
+        // White balance them and find the most overexposed one
+        maxr *= d->mr;
+        maxg *= d->mg;
+        maxb *= d->mb;
+        max = qMax(maxb, maxg);
+        max = qMax(max, maxr);
+printf("m*maxrgb=%d, %d, %d  m*max=%d clamp_at=%d\n", maxr, maxg, maxb, max, d->rgbMax-1);
+        // Scale wb coefficients down if needed
+        if (max > d->rgbMax-1) {
+            adjust = (double)(d->rgbMax-1) / max;
+printf("adjust=%f\n", adjust);
+            d->mb = d->mb * adjust; // Overwrites d->mx !!
+            d->mg = d->mg * adjust;
+            d->mr = d->mr * adjust;
+        }
+        ptr = data;
+
+
         for (j = 0 ; runningFlag() && (j < size) ; ++j)
         {
             int v, rv[3];




--
Giuliano.
_______________________________________________
Digikam-devel mailing list
[hidden email]
https://mail.kde.org/mailman/listinfo/digikam-devel
Reply | Threaded
Open this post in threaded view
|

Re: RFC, fix overexposing white balance

Gilles Caulier-4
Thanks Giuliano for you patch.

Please file a bug in KDE bugzilla system and attach your patch. We
will review later. Look here for details :

http://www.digikam.org/drupal/contrib

It's always better to use bugzilla instead to post on maillist. We use
Bugzilla file ID for AQ stuff. It's the real story of the project.
It's difficult to link source code to a mailing list post.

Also, take a care to use code from svn trunk to create patch.

Thanks in advance

Gilles Caulier



2010/12/6 Giuliano Pochini <[hidden email]>:

> Hi all!
>
> IMHO the white balance tool is quite useless in its current form because it
> overexposes and clips at least one of the rgb components almost always. The
> exposure compensation thing does not help because it is applied on the
> already clipped image. I wrote the simple patch below that makes the wb
> tool useable by scaling down the wb multipiers just enough to prevent
> clipping.
>
> The biggest problem is that the final result can be quite a lot dimmer than
> the preview image because the scaler smooths the (usually tiny) brightest
> spots of the photo.
>
>
>
> --- digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp__orig       2010-11-22 18:47:36.000000000 +0100
> +++ digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp     2010-12-06 22:37:29.000000000 +0100
> @@ -294,6 +294,38 @@ void WBFilter::adjustWhiteBalance(uchar*
>         uchar  red, green, blue;
>         uchar* ptr = data;
>
> +
> +        int maxr, maxg, maxb, max;
> +        double adjust;
> +
> +        // Look for the maximum r, g, b values in the given image
> +        maxr = maxg = maxb = 0;
> +        for (j = 0 ; j < size; ++j) {
> +            if (maxb < ptr[0])  maxb = ptr[0];
> +            if (maxg < ptr[1])  maxg = ptr[1];
> +            if (maxr < ptr[2])  maxr = ptr[2];
> +            ptr += 4;
> +        }
> +printf("maxrgb=%d, %d, %d\n", maxr, maxg, maxb);
> +printf("mrgb=%f, %f, %f\n", d->mr, d->mg, d->mb);
> +        // White balance them and find the most overexposed one
> +        maxr *= d->mr;
> +        maxg *= d->mg;
> +        maxb *= d->mb;
> +        max = qMax(maxb, maxg);
> +        max = qMax(max, maxr);
> +printf("m*maxrgb=%d, %d, %d  m*max=%d clamp_at=%d\n", maxr, maxg, maxb, max, d->rgbMax-1);
> +        // Scale wb coefficients down if needed
> +        if (max > d->rgbMax-1) {
> +            adjust = (double)(d->rgbMax-1) / max;
> +printf("adjust=%f\n", adjust);
> +            d->mb = d->mb * adjust;            // Overwrites d->mx !!
> +            d->mg = d->mg * adjust;
> +            d->mr = d->mr * adjust;
> +        }
> +        ptr = data;
> +
> +
>         for (j = 0 ; runningFlag() && (j < size) ; ++j)
>         {
>             int v, rv[3];
>
>
>
>
> --
> Giuliano.
> _______________________________________________
> Digikam-devel mailing list
> [hidden email]
> https://mail.kde.org/mailman/listinfo/digikam-devel
>
_______________________________________________
Digikam-devel mailing list
[hidden email]
https://mail.kde.org/mailman/listinfo/digikam-devel
Reply | Threaded
Open this post in threaded view
|

Re: RFC, fix overexposing white balance

pochini
On Tue, 7 Dec 2010 09:04:02 +0100
Gilles Caulier <[hidden email]> wrote:

> Thanks Giuliano for you patch.
>
> Please file a bug in KDE bugzilla system and attach your patch. We
> will review later. Look here for details :
>
> http://www.digikam.org/drupal/contrib
>
> It's always better to use bugzilla instead to post on maillist. We use
> Bugzilla file ID for AQ stuff. It's the real story of the project.
> It's difficult to link source code to a mailing list post.
>
> Also, take a care to use code from svn trunk to create patch.

Done,  thanks.


--
Giuliano.
_______________________________________________
Digikam-devel mailing list
[hidden email]
https://mail.kde.org/mailman/listinfo/digikam-devel