semmixcolor and perception

Saturation

Saturation tells how much a color differs from gray, relative to its own brightness. That is the colorimetric definition. HSV, HSL and HSI each have their own, different formula for S and give different results for the same color.

Saturation, chroma, colorfulness

Colorimetry separates three ideas that everyday speech lumps together (see color measures):

Saturation in RGB-based models

max = max(R, G, B), min = min(R, G, B), d = max - min HSV: S = d / max HSL: S = d / (1 - |max + min - 1|) HSI: S = 1 - min / I, I = (R + G + B) / 3

For RGB (200, 80, 40), #c85028:

HSV: S = 0.6275 / 0.7843 = 80.0% HSL: S = 0.6275 / 0.9412 = 66.7% HSI: S = 1 - 0.1569 / 0.4183 = 62.5%

The HSL trap

In HSL saturation is divided by the distance to the nearest end of the lightness axis, black or white. For very light and very dark colors that denominator is small, so S climbs to 100% even when the color is almost gray:

RGB (255, 250, 250), nearly white with a hint of pink: HSV: S = 2.0% HSL: S = 100% (L = 99.0%)

To HSL this color is "fully saturated", because at L = 99% it cannot get any pinker. To the eye it is white. That is why HSL's S is unsuitable for comparing the colorfulness of colors with different lightness. HSV behaves more sensibly here, but it also ignores the eye's sensitivity.

Saturation in CIELUV and CIELAB

The CIE defined saturation only in CIELUV, as the distance from white on the u'v' diagram:

s_uv = 13 · √((u' - u'_n)² + (v' - v'_n)²) = C*_uv / L* for our color: s_uv = 13 · √((0.3472 - 0.1978)² + (0.5243 - 0.4683)²) = 2.07

CIELAB has no official definition. The most common choice is the ratio of chroma to lightness:

s_ab = C*_ab / L* = 65.11 / 49.71 = 1.31

Both measures account for perception and so work for comparisons, but they have no upper limit of 100%. The values depend on hue: pure blues and reds reach the highest.