Skip to content

Lightness Linearity — Why Equal Steps Look Unequal ​

Open a color palette tool. Set 12 shades of blue, evenly spaced from L*=95 down to L*=10 in CIELAB. Export, put them on screen.

They don't look evenly spaced. The light shades feel bunched. The midrange is compressed. Somewhere between shade 4 and shade 7 there's a cluster where the steps feel too small.

The L* values are correct — perfectly linear. But the palette looks wrong.

What L* Measures ​

CIELAB's L* is designed to be perceptually uniform for achromatic colors — grays. Two grays that are 10 units apart in L* should look equally different, regardless of where you are on the scale.

For gray, L* does its job. For chromatic colors — blues, reds, yellows — it breaks down.

The Helmholtz–Kohlrausch Effect ​

A saturated blue at L*=50 looks brighter than a neutral gray at L*=50.

The chroma is contributing perceived brightness that L* doesn't account for. High-saturation colors appear lighter than their measured lightness.

This is the Helmholtz–Kohlrausch effect, documented since the 19th century. A blue ramp built on linear L* spacing will have its chromatic shades appear lighter than expected — pushing the perceived midpoint lower and making the upper range feel compressed.

EAL: The Corrected Measurement ​

The corrected metric is Equivalent Achromatic Lightness (EAL), from High et al. (2023):

L_EAL = L* + (f_BY(h) + f_R(h)) × C*
  • L* — standard CIELAB lightness
  • C* — chroma (saturation)
  • h — hue angle
  • f_BY, f_R — hue-dependent correction coefficients

The correction adds a chroma-scaled offset that varies by hue. Blue gets a larger correction than olive. A high-saturation blue at L*=50 might have EAL=56 — its perceived lightness is 6 units higher than L* says.

Measuring Linearity ​

Lightness linearity measures how evenly EAL progresses across the palette, not L*.

  1. Compute EAL for each swatch
  2. Fit a line: EAL ≈ α × step + β (linear regression)
  3. Measure RMSE between actual EAL values and the fitted line
  4. Normalize → score ∈ [0, 1]

A score of 1.0 means the palette's perceived lightness progresses evenly from end to end. A score below 0.85 means there are visible clusters or gaps.

Why This Matters in Practice ​

Uneven perceived lightness means:

  • Nested containers don't feel "one level deeper" — the depth progression is irregular
  • Hover states feel closer or farther than expected — the perceptual gap between base and hover varies depending on where in the palette you're working
  • Dark mode requires a separately hand-tuned palette because the light and dark halves have different perceptual densities

Designers who build palettes by eye in CIELAB or HSL often over-correct for the Helmholtz–Kohlrausch effect intuitively — without knowing why certain shades feel "off" and need manual adjustment.

EAL-based linearity makes the cause explicit and measurable.

→ Chroma Smoothness