Depending on your particular artistic intentions for an image, some images are more likely than others to benefit from being tone mapped using floating point “Colors/Exposure”. Your mileage may vary, but typically the procedure described on this page works best for photographs of scenes with a pronounced tonal difference between the highlights and shadows, as per typical sunny day “sky-ground” photographs.
For adding just one stop of positive exposure compensation, the procedure described on this page works really well. Depending on the image you might want to blur the mask using an edge-respecting blur algorithm, and/or tweak the mask using “Colors/Exposure”, Curves, etc. But only modify the mask after using Auto Stretch Contrast on the mask. Otherwise results will be unpredictable: Gamma adjustments produce odd results when operating on out of gamut values, and Curves will summarily clip out of gamut values.
For adding more than one stop of exposure compensation, you can use one or more than one positive-exposure-compensation layers. Either way the layer mask(s) will need careful tweaking that’s very image-specific and also specific to your intended result. Figure 7 shows an example of using two exposure compensation layers to add two and a half stops of exposure compensation to the shadows and midtones of an image:
Using GIMP’s floating point unbounded Levels plus layer masks to add two stops of positive exposure compensation to the shadows and midtones of a photograph of an apple orchard truck that was taken in bright sunshine.
Figure 7
Image from the camera, underexposed to avoid blowing out highlights.
After tone mapping/shadow recovery using high bit depth GIMP's floating point "Color/Exposure".
For comparison, Mantuik tone mapping using the GEGL default settings.
Using GIMP’s floating point “Colors/Exposure” plus layer masks to add two and a half stops of positive exposure compensation to the shadows and midtones of a “bright sun” photograph of an apple orchard truck.
A screenshot of the layer stack that I used to tone-map the photograph of the apple orchard truck. Tone-mapping by hand gives you complete control over the resulting image. Mantuik and other “automagic” tone-mapping algorithms are CPU-intensive, unpredictable, and often produce unnatural-looking results.
Before using “Colors/Exposure” to add positive exposure compensation, the base layer should already be stretched to its maximum dynamic range. The easiest way to stretch the base layer to its maximum dynamic range is to do “Colors/Auto/Stretch Contrast” and make sure that “Keep colors” is checked.
If you’ve never used an unbounded floating point image editor before, “Colors/Auto/Stretch Contrast” can produce an unexpected result: The image might actually end up with a severely reduced dynamic range, having either lighter shadows or darker highlights or both:
Before and after doing “Colors/Auto/Stretch Contrast” on the base layer, plus the final image after tone mapping using “Colors/Exposure”:
Figure 8
1. Image from the camera
2. After doing "Colors/Auto/Stretch Contrast".
3. Final "Power lines" image.
This scene-referred interpolated raw file from the PhotoFlow raw processor (which provides a GIMP plug-in for easy opening of raw files) has out-of-display-range RGB channel values that will be brought back into the display range by doing “Colors/Auto/Stretch Contrast”.
After doing “Colors/Auto/Stretch Contrast”, shadows are lighter and highlights are darker because the dynamic range has been compressed to fit within the display range. This looks like an editing step in the wrong direction! but actually it’s necessary.
Here’s the final “Power lines” image after tone mapping the scene-referred interpolated raw file using the procedure described in this tutorial.
As captured by the raw file, this picture of power lines marching into the distance is a typical result of taking a photograph at noon on a bright sunny day: The sky and clouds looked pretty good right out of the camera, but the ground was far too dark. So the image could benefit from some tone mapping to raise the shadows and midtones. The first step is to do “Colors/Auto/Stretch Contrast” to bring any channel values that are less than 0.0f or greater than 1.0f back within the display range of 0.0 to 1.0 floating point.
Performing “Auto/Stretch Contrast” to bring the channel values back inside the display range doesn’t exactly look like an editing step in the right direction for tone-mapping this particular image! but really it is. Using “Colors/Exposure” to add positive exposure compensation to the shadows and midtones won’t work if the image has channel values that fall outside the display range.
Dispensing with “useless” shadow and highlight information: Sometimes interpolated raw files of photographs of high dynamic range scenes end up with a sprinkling of highlight and shadow pixels that contains essentially no useful information. The easiest thing to do with such pixels is to use “Colors/Exposure” to set the desired black and white points, and then clip the resulting out of gamut channel information.
Useless highlight information: For the “Power lines” picture shown in Figure 8 above, after doing “Color/Auto/Stretch Contrast”, a measly 48 pixels occupied nearly half the tonal range (see the histogram to the right). A little investigation with GIMP’s Threshold tool revealed that all 48 pixels are the peak values of specular highlights on the ceramic insulators on the power line pole in the foreground.
In cases where nearly half the histogram is occupied by a sprinkling of specular highlights, clipping the pixels is often the best and easiest solution. For the “Power lines” image, the 48 pixels in question carried essentially zero information. So I used “Colors/Exposure” to raise the white point, and then used “Colors/Clip RGB” to actually clip the channel information in the highlights (this time making sure the “Clip high pixel values” box was checked).
Useless shadow information: Some raw processors can output images with negative channel values. And previous edits using high bit depth GIMP might have produced negative channel values. If doing an “Auto/Stretch Contrast” on your base image layer makes the image a whole lot lighter in the shadows, the problem is negative RGB channel values. One solution is to use “Colors/Exposure” to move the black point to where you want it to be, and then clip the negative channel values. Here are two ways to clip negative channel values:
Use “Colors/Clip RGB...”, making sure to uncheck the “Clip high pixel values” box.
Or else create a solid black layer above your base image layer, set the blend mode to “Lighten only”, and make a “New from Visible” layer.
Blurring the mask to restore micro contrast: Putting an inverse mask on a layer that’s used to add positive exposure compensation necessarily slightly flattens micro contrast. Depending on your artistic intentions for the image, you might want to blur the mask to restore micro contrast. The trick is how to blur the mask without introducing “halos” around the edges of objects in the image. Small radius Gaussian blurs produce small but distressingly obvious halos around dark edges. A large radius gaussian blur sometimes works but just as often produces a large obvious halo separating the brighter and darker portions of the image. For many images a better solution is to blur the mask use an edge-respecting filter such as the GIMP G’MIC bilateral smooth filter:
Adding exposure compensation with and without bilateral smoothing of the mask.
Figure 9
Without applying bilateral smoothing to the mask, micro contrast is flattened.
After applying bilateral smoothing to the mask, micro contrast is restored.
Adding exposure compensation combined with an inverse grayscale mask does flatten micro contrast, which might or might not be desirable depending on your artistic intentions for the image. To restore micro contrast, try using an edge-respecting blur such as G’MIC’s bilateral smoothing filter. GIMP G’MIC doesn’t work on layer masks. A workaround is to to turn the unblurred mask into a selection, save the selection as a channel, and then drag the channel to the layer stack for blurring.
An essential component of the procedure for using “Colors/Exposure” to add positive exposure compensation to images with dark shadows and midtones needs to be explicitly mentioned: Not only is the high bit depth GIMP’s “Colors/Exposure” operation unbounded at floating point precision — layer masks are also unbounded.
If the inverted grayscale masks were summarily clipped (as is the case when editing at integer precision), then the procedure described in this tutorial wouldn’t work.