CIELAB
Perceptually-motivated colour space modeled on opponent-process theory, with red-green and yellow-blue opponent dimensions humans cannot perceive simultaneously.
What it means
CIELAB — written CIE Lab, L*a*b*, or “Lab color space” depending on which doc you’re reading — is a colour space from the 1970s built on the opponent-process theory of human colour perception. Instead of three independent channels like an RGB sensor or an ink cartridge, it spends one axis on lightness (L) and folds the two colour-opponent pairs the visual system actually uses into two more axes: a for red-versus-green, b for yellow-versus-blue. These are called opponent dimensions because a person cannot perceive them simultaneously — you can see something as reddish-yellow, but never as reddish-green or yellowish-blue — so each pair collapses to a single signed axis instead of needing two channels.
Lightness in Lab is not absolute. It is computed relative to a reference white point, and an implementation has to pick one: chroma.js, which ships CIELAB as a constructor, defaults to the D65 white point (standard daylight) unless you tell it otherwise. That choice of white point is part of the space’s definition, not an incidental implementation detail — two Lab values computed against different white points are not directly comparable.
Why it matters in practice
The reason to reach for Lab instead of doing colour math in RGB is exactly what its axes are built from: they track how the visual system separates colour (lightness, then two opponent pairs), not how a screen emits it or a printer mixes it. A straight line through Lab space is a line through the perceptual axes; a straight line through sRGB is a line through raw channel intensities the eye doesn’t weight evenly.
That distinction is why chroma.js doesn’t point you at Cartesian Lab itself for gradients — it recommends Lab’s own cylindrical form, LCH (lightness, chroma, hue), as the mode for interpolating across multiple hues. LCH is the same space as CIELAB with the a/b plane rewritten in polar coordinates instead of Cartesian ones, so hue becomes an angle you can walk around directly rather than two coupled Cartesian values you have to reconstruct hue from.
How it shows up in code
chroma.js constructs a colour straight from its three channels — chroma.lab(40, -20, 50) sets L, a, and b directly, no conversion step required from the caller. L is the lightness you’re placing the colour at; a is where it sits on the red-green opponent axis; b is where it sits on the yellow-blue opponent axis. Because those two axes are signed and centred on the achromatic point, moving a value toward zero desaturates that axis rather than mixing in a third colour — there’s no separate “grey” channel to add.
Works that embody it
The evidence gathered for this page doesn’t include a named artwork built on CIELAB specifically. What it does show is the space presented as one entry in a broader survey — Programming Design Systems introduces it as “another color model,” alongside the others the book covers, rather than as a special case — and chroma.js shipping it as a constructor a caller can invoke directly, chroma.lab(...), on the same footing as the library’s other colour constructors.
Arguments against it
Lab’s own family contains an admission that it isn’t perfect: Oklab is a newer perceptually-motivated L/a/b space built specifically to fix hue-uniformity problems in Lab — cases where two colours the same visual distance apart in hue are not equally spaced in Lab’s numbers. That a fix exists and is still gaining adoption is itself the argument: “perceptually uniform” was always a design target for Lab, not a property verified across the whole space.
Separately, the registry links CIELAB to LCh with a specialization-of edge, but at a modest 0.55 confidence — worth flagging rather than repeating as settled. The more common framing, and the one this page uses above, is the reverse: LCh is Lab’s own a/b plane restated in polar coordinates, not a distinct parent space Lab specialises. The two are the same underlying numbers; only the coordinate system differs. That’s different in kind from the contrast with CIEXYZ, the 1930s reference space every modern colour space — Lab included — defines its gamut against, and different again from the contrast with device-facing models: RGB, the additive channel cube that’s the default in p5.js’s fill()/stroke(); sRGB, the smallest-gamut standard the web and p5.js both default to; and CMYK, the subtractive four-channel model built for pigment, not perception. None of those three are restatements of Lab in different coordinates — they’re built to solve a different problem (emitting or mixing colour) rather than describing how it’s seen.
Connected to
A kind of: Lch