Making Sense of Satellite Data, Part 5: Saturation & Sharpness
After color correction, there’s a few more image processing steps that can really help a satellite image stand out from a crowd—boosting saturation, local contrast enhancement, and sharpening fine details. These are partly physically-based (accounting for how the atmosphere, optics, sensor, and data processing effect an image)—and partly aesthetic (purely for making an image appealing). Fortunately, these processes can be easily achieved in GIMP or other image editing software with a saturation adjustment, an unsharp mask with a wide radius and low amount, followed by another unsharp mask with a small radius and a large amount.
As an example, here’s a PlanetScope image (you can get additional data via a 14-day trial, Open California, or Planet’s Education and Research program) of Kīlauea Volcano’s Puʻu ʻŌʻō crater (immediately after an explosion covered the area in pink ash) after basic color correction (top) and further enhancement (bottom):
Looks better, right? It’s important to remember that none of these techniques create new information—they just make existing images more attractive and easier to interpret.
The first step in adding the final level of polish of a satellite image is to increase the saturation. This restores the intensity of color lost through atmospheric scattering—think of how distant features in a landscape appear washed out compareded to objects in the foreground. Plus, humans just tend to like vivid colors.
In GIMP you can increase saturation with the
Hue-Saturation palette, found under the
Colors → Hue-Saturation…
It’s best to use a light touch here: saturation increases globally, even for colors that are already very intense. This can lend imagery an unnatural, day-glow quality. I stick to values around 20 or so, depending on the content of the image and how much haze there is. Ideally, the effect should be subtle but still noticeable. Here’s a comparison of the PlanetScope Kilauea image (left) with modest (center) and extreme (right) increases in saturation:
Another subtle effect of the atmosphere on satellite imagery is a loss of overall contrast. Ambient light floods shadows, and the design of some optical telescopes removes contrast in the range of tens of pixels. Borrowing from photography, you can use a technique called local contrast enhancement to help with this. In essence, local contrast enhancement increases the difference in brightness between areas located near each other in an image. This is distinct from global contrast enhancement (one of the steps in color correction), which increases the range of brightness across an entire image. It’s acheived by applying an unsharp mask filter with a high radius and a low amount.
In GIMP, this filter is found by selecting
Filters → Enhance → Unsharp Mask… from the menu.
You’ll get the dialog box displayed on the left. The important controls are
Threshold is more useful when using unsharp mask to sharpen fine details in a noisy image—just leave it at a low value).
As the name implies,
Radius controls the width of the effect. It’s nominally in pixels, but it seems to be applied over a wider range than the displayed number. In any case, for local contrast enhancement use a relatively large value—like 40 or 60.
Amount controls the depth of the effect—larger numbers add more contrast. In GIMP try something in the range of 0.10 to 0.30 (in Photoshop 10 to 30). This is the result:
The sharpened image appears to have slightly darker greens and slightly lighter ash, but the change is subtle, almost imperceptible. That’s because our visual system doesn’t do a great job of processesing gradients at this spatial frequency. We’re very good at edge detection, but not so good at seeing changes in brightness smeared over distance of more than a centimeter or so. So the end result of wide-radius unsharp mask is an overall feeling of “it looks better” that you can’t quite put your finger on.
Unsharp masking is a technique that’s a little weird and counter-intuitive, so I think it’s worth delving into in a little more detail. The basic process is to:
- Create a grayscale version of your image.
- Blur it (the amount of blur is similar to
Radiuscontrol of an unsharp mask).
- Invert the blurred image so dark areas are light and light areas are dark.
- Adjust contrast of the inverted image.
- Use the overlay layer mode to merge the blurred & inverted copy back into the original image. Dark areas in the inverted image become darker in the original, and bright areas become brighter. Because the image is blurred and inverted this adds a gradient along edges—visible as a halo in the center image in the bottom row below.
- As with a saturation adjustment, a little goes a long way, so turn down the opacity of the overlay layer. In this case I used 20 percent. This is similar to the
Amountcontrol of an unsharp mask.
These steps are shown in the image sequence below:
If you still can’t quite picture how it works (don’t worry, it took me years and a few textbooks), check out the examples below. From left to right the amount of the unsharp mask increases, and from top to bottom radius increases. The boundary between the two gray fields is exaggerated because the light side is brightened and the dark side is made even darker. The width of the transition is determined by the radius. Notice how the gradient is easy to see when it’s small, but hard to see when it’s wide. That’s why unsharp masking used to sharpen fine detail in an image is more obvious than unsharp maksing used for local contrast enhancement.
Now that I’ve explained how an unsharp mask works, we’ll use it one more time, with different settings. This time to make enhance fine details and make edges sharper.
Satellite imagery is often soft (slightly blurred) because the pixels in the detector are usually near the diffraction limit of the telescope. The process of orthorectification—warping the image from a satellite-centric view to a maplike projection—also smears pixels a bit. Not to mention the pesky atmosphere, which can remove fine detail as well as reduce overall contrast.
This time apply the unsharp mask with a small
Radius and a large
Amount—to help deal with some of these issues. For PlanetScope imagery I typically use a
Radius around 1.4, and an
Amount between 1 and 2. With SkySat or Landsat data, on the other hand, I might use a
Radius of 0.4 and an
Amount of 3.0—it depends on the exact parameters of the image acquisition, and the state of the atmosphere at the time.
Sharpening also tends to make noise in an image more visible, which can add an unpleasant speckled appearance, like excessive film grain. Mitigate this by increasing the threshold, which prevents the sharpening from being applied to edges with less contrast. As always, be careful not to crank the value too high, because it may create obvious artifacts as high-contrast features are sharpened and low-contrast features remain blurry.
Here’s what the final image looks like, with increased saturation combined with wide- and fine-scale sharpening:
Hopefully you now have the tools to find, open, and process some of the vast amount of satellite data that’s currently available. This imagery has never been more accessible, and provides a new window into our vast and ever-changing home planet.
Making Sense of Satellite Data: An Open Source Workflow