Issues with CIELAB and Perceptual Brightness

The CIELab color space (and the more modern variants like CIECAM02 and Oklab) are designed to be perceptually uniform alternatives to RGB. This is a broad goal, which roughly means that we would like changes in the numbers to match same changes that we observe when performing various studies of human perception.

It’s a bit less 'math’ and more ‘modeling’. We try to fit equations to the observed data with the lowest error possible, across many different axis. It’s helpful to imagine adding the word ‘predicted’ in front of all of the CIELAB terminology (ie. Predicted Perceptual Lightness), because it’s just trying to predict human test results!

This process means that there is some error. For example, ideally, a color with L=50 looks twice as bright as a color with L=25. Except, with very strongly saturated colors like red, this isn’t actually the case in any of these color spaces.

This is what’s called the Helmholtz-Kohlrausch effect. Take a look at the below panel of colors. Most humans agree that the red is quite a bit brighter than the others in the row, and yet they all have the exact same lightness value when calculated with something like CIELAB!

A set of colors demonstrating the Helmholtz-Kohlrausch effect. The red appears more vivid to the human eye.

There is some recent research I found that models this effect and applies an additional transform to account for it, building off of work from Fairchild MD, Pirrotta E in the 90’s. The end result is labeled as the “Predicted Equivalent Achromatic Lightness”, or in other words “The lightness of the gray that most closely matches the perceived lightness”.

This is actually quite a useful value, because it’s precisely the value we want when desaturating an image! Most desaturation operations spit out a [0..1] value which is then (later) rendered as an RGB gray color. Using the L_EAL value instead jumps us right to the end, giving the exact perceptual gray color to place in the resulting desaturated image.

How much of an issue is this? Well, I noticed. I’ve been writing a tool to desaturate game screenshots, to help us evaluate relative brightnesses between art assets, and improve overall game readability. All of the red assets appeared.. strangely dark in the desaturated images, even when using CIELAB!

Before desaturating.

After desaturating.

The reds are a bit darker here, but I think we can agree that they’re not that dark! This is because CIELAB does not account for the Helmholtz-Kohlrausch effect and so it undervalues the amount that red’s saturation contributes to the final lightness. And if we had used this tool to spot check, it might have caused us to make all of our red assets too bright to balance it out. Weird.


Unfortunately, I haven’t been able to find any perceptually uniform color spaces that seem to include these transformations in the final output space. If you’re aware of one, I would love to know.