What the brain does

Four ways to move a white point

Every chromatic adaptation transform is the same three lines with a different matrix. The matrices disagree by more than any tolerance a supplier is held to, and the oldest one — still shipping, still called von Kries — is not a cone basis at all.

Assumes Constancy is the default.

16 min read 5 figures Computed, not quotedSay which colour

Everything in colour management that crosses a white point runs through a chromatic adaptation transform. Converting an image from a D65 working space to a D50 print profile does it; every ICC profile contains a matrix that is one; every appearance model begins with one.

There are at least five in current use, they give different answers, and almost nobody choosing between them knows which one they have.

Four adaptation transforms, measured against CAT16 (D65 to D50). Twenty-seven colours moved from D65 to D50 by each transform, compared with the current recommendation. Bars are the worst disagreement in CIELAB, the number beside each is the mean. Plain XYZ scaling — still shipping, still called von Kries by people who have not read von Kries — misses by up to ΔE 13.7, which is many times any tolerance a supplier would be held to.
Fig. 1 Twenty-seven colours moved from D65 to D50 by four transforms, measured against the current recommendation. The bars are the worst disagreement in CIELAB and the number beside each is the mean. Plain XYZ scaling misses by more than ten times the tolerance a supplier would be held to.

The same comparison has three other forms worth putting beside it, and none of them is a different question.

Four adaptation transforms, measured against CAT16 (D50 to D65). Twenty-seven colours moved from D50 to D65 by each transform, compared with the current recommendation. Bars are the worst disagreement in CIELAB, the number beside each is the mean. Plain XYZ scaling — still shipping, still called von Kries by people who have not read von Kries — misses by up to ΔE 16.4, which is many times any tolerance a supplier would be held to.
Fig. 2 The same move run the other way. Each of the four is a linear map with an inverse, so this is the check that nothing in the comparison depends on which end it is started from.

Changing the observer is the other axis, and it is the one that decides which numbers the four transforms are handed in the first place.

Four adaptation transforms, measured against CAT16 (D65 to D50). Twenty-seven colours moved from D65 to D50 by each transform, compared with the current recommendation. Bars are the worst disagreement in CIELAB, the number beside each is the mean. Plain XYZ scaling — still shipping, still called von Kries by people who have not read von Kries — misses by up to ΔE 13.7, which is many times any tolerance a supplier would be held to.
Fig. 3 And under the ten-degree observer, which a surface-colour laboratory is required to use. The transforms are defined on tristimulus values, so changing the observer changes the numbers they are handed rather than the transforms themselves.

Which leaves one corner of the square, and a comparison whose ranking moved across any of the four would not be a comparison worth quoting.

Four adaptation transforms, measured against CAT16 (D50 to D65). Twenty-seven colours moved from D50 to D65 by each transform, compared with the current recommendation. Bars are the worst disagreement in CIELAB, the number beside each is the mean. Plain XYZ scaling — still shipping, still called von Kries by people who have not read von Kries — misses by up to ΔE 16.4, which is many times any tolerance a supplier would be held to.
Fig. 4 The fourth corner of the same square, for completeness. Two observers and two directions give four measurements of one disagreement, and a transform whose ranking moved between them would not be a transform anybody could quote.
Four adaptation transforms, measured against CAT16 (D65 to D50). Twenty-seven colours moved from D65 to D50 by each transform, compared with the current recommendation. Bars are the worst disagreement in CIELAB, the number beside each is the mean. Plain XYZ scaling — still shipping, still called von Kries by people who have not read von Kries — misses by up to ΔE 13.7, which is many times any tolerance a supplier would be held to.
Fig. 5 The fourth corner of the square: the original direction under the ten-degree observer. Two observers and two directions give four measurements of one disagreement, and none of the four reorders the transforms.

They are all the same three lines

The striking thing about the family is how little separates its members structurally. Every one of them does exactly this:

Move XYZ into some basis. Scale each of the three channels by the ratio of the destination white to the source white, in that basis. Move back.

That is it. There is no other content. The differences between the transforms are entirely differences of which basis, and the range of choices is wider than the shared structure suggests.

The scaling step is the physiological claim, and it is old. Johannes von Kries proposed in 1902 that adaptation works by independently adjusting the gain of each receptor type — that the eye does not perform some global correction but simply turns each cone’s sensitivity up or down until the scene’s white reads as white. It is a remarkably simple hypothesis for a remarkably complicated phenomenon, and it is approximately right.

Whether it is exactly right is a separate question, and the answer is no, which is why the fitted transforms below exist.

The bases, and what each claims

XYZ scaling does not change basis at all. It scales X, Y and Z directly. This is the oldest implementation, it is still shipping in a startling amount of software, and it is frequently labelled “von Kries” by people who have not read von Kries — whose entire point was that the scaling happens in the receptor basis, which XYZ is not. Scaling XYZ is scaling three arbitrary linear combinations of cone responses, which has no physiological interpretation whatsoever.

Von Kries proper uses the Hunt–Pointer–Estevez cone fundamentals, normalised to equal energy. This is the transform the hypothesis actually describes: the basis is the receptors, and the scaling is receptor gain.

Bradford was derived by fitting to corresponding-colour datasets — pairs of stimuli that observers judged to match across a change of illuminant. It is not a cone basis and does not claim to be, and it has negative matrix entries no cone response could have. It is what most colour management uses today, largely because it is what ICC standardised.

CAT02 is CIECAM02’s transform, fitted the same way to a larger dataset. It was withdrawn: it could produce negative tristimulus values for saturated colours under some viewing conditions, which broke real software rather than merely being inelegant.

CAT16 is the current recommendation and the adaptation step inside CIECAM16. It was constructed specifically to remove CAT02’s failure mode while keeping its fit quality.

What the choice costs

The comparison above is the answer, and the shape of it is worth reading carefully.

The four fitted or physiological transforms — von Kries, Bradford, CAT02, CAT16 — agree with each other to a mean of about 1.7 to 1.8 ΔE across a spread of colours moved from D65 to D50. That is not nothing; it is above the threshold usually quoted for a just-noticeable difference and comfortably above the ΔE 1 that supply contracts specify. But it is the same order of magnitude, and a practitioner switching between them is making a modest change.

XYZ scaling is not in that group. Its worst case is over 13 ΔE, which is not a subtle difference — it is a visibly different colour — and its mean is more than twice the others’.

So the practical advice is unusually clean for this subject. Which of the four cone-like transforms is used matters at the margin. Whether one of them is used at all matters a great deal, and the default in older code is the one that does not.

Where XYZ scaling goes wrong

The failure is not uniform across the space, and knowing where it lands makes it recognisable in the wild.

XYZ scaling’s error is worst in the blues, and this is the origin of a complaint that predates any of the fitted transforms: adapted blues turn purple. Convert a blue from a daylight white to a warmer one by scaling XYZ and the result comes out shifted toward magenta, visibly and consistently.

The reason is that the Z axis is not a cone response. The S cone’s sensitivity is a broad curve peaking near 440 nm; Z is a matching function shaped to be non-negative, and the two are related by a transformation that is far from the identity. Scaling Z therefore does not scale the S cone’s gain — it scales a mixture, and the mixture’s other components come along.

The one thing they all get exactly right

Whatever the basis, one property is definitional rather than fitted: the source white must land exactly on the destination white.

This is checked here, for all five transforms, to within 4 × 10⁻¹⁶. It sounds trivial and it is worth checking, because the failure mode is quiet. A matrix and its inverse that do not quite correspond — a transposition, a stale copy of one but not the other — leave the whites almost right and everything else tinted, and “almost right” on a white is very hard to see. The colours it wrecks are not the ones anybody inspects first.

That the property is exact for all five is also the reason the comparison above is meaningful. Any two transforms agree perfectly on the white and disagree progressively further from it, so the disagreement being measured is genuinely about the transform rather than about a mismatched endpoint.

The assumption underneath all of them

Every transform on this page assumes the observer is completely adapted to the source white and will be completely adapted to the destination white. That is what “move this colour from D65 to D50” means: the colour that will look the same to a fully D50-adapted observer as this one does to a fully D65-adapted one.

Nobody is ever completely adapted.

The appearance model handles this by carrying a degree of adaptation, computed from the adapting luminance and the surround, and at an ordinary indoor level it comes out at 0.94. The remaining 6% is the illuminant that does not get discounted, and its consequence is that a neutral card under a coloured light does not come out neutral — which matches everybody’s experience of a tungsten-lit room, and does not match what any transform on this page would predict.

So the transforms are answering a slightly idealised question. That is defensible for colour management, where the goal is to produce a file that will look right when viewed under the destination conditions by somebody who has been sitting there for a while. It is not defensible for predicting what something looks like now, to somebody who has just walked in, and the difference between those two uses is the difference between a matching calculation and an appearance calculation.

The move that happens most often, and is least examined

The D65-to-D50 conversion in the figure above is not an arbitrary example. It is the single most-performed chromatic adaptation in the world, because it is the one between the working space of essentially all digital imaging and the reference white of essentially all printing.

Every time an image prepared on a screen is sent to print, that transform runs. It runs inside the ICC pipeline, using whatever matrix the profiles specify, and the person pressing the button chooses neither the transform nor usually knows one is happening. A print that comes back looking slightly wrong in the blues has a candidate explanation that nobody looks at, because the conversion is invisible and was performed correctly according to whichever transform was embedded.

The reason the industries diverged is worth knowing and is not about colour science. Printing standardised on D50 because print is viewed by reflection under a light source, and a standard viewing booth was specified for the purpose; displays standardised on D65 because it approximates average daylight and television standards were written when the ambient a television competed with was daylight through a window. Both choices are defensible and they are not the same choice, and the gap between them has been paid for by a transform ever since.

What “corresponding colours” means, and why it is hard to measure

Bradford and CAT02 were fitted to corresponding-colour data, and it is worth understanding what such an experiment involves, because the difficulty explains why the transforms disagree.

A corresponding-colour pair is two stimuli — one under illuminant A, one under illuminant B — that an observer adapted to A judges the first to look like, and adapted to B judges the second to look like. The judgement is not a match: the two stimuli are never seen together, because seeing them together would require being adapted to both at once, which is the thing that cannot happen.

So the experiment is either successive, adapting the observer to one illuminant, showing a sample, adapting them to the other over some minutes, and asking them to reproduce what they remember; or haploscopic, adapting each eye to a different illuminant and asking for a match between them. The first depends on colour memory, which is poor and systematically biased. The second assumes the two eyes adapt independently and that a binocular match means anything, both of which are contested.

Neither method is good. Both are the best available. The transforms fitted to their results inherit the uncertainty, and the fact that four independently fitted transforms land within about 1.8 ΔE of one another is better agreement than the underlying data obviously supports.

This is the honest context for the comparison in this essay. The spread between the cone-like transforms is of the same order as the uncertainty in the measurements they were fitted to, which is a reason to care less about choosing between them than the existence of five candidates suggests — and no reason at all to relax about the fifth.

What the numbers actually depend on

Three qualifications on the comparison, because a single number for “how far apart are these transforms” would be too clean.

The white pair matters. D65 to D50 is a short move — both are daylight, both are near the Planckian locus. D65 to illuminant A is far longer, and the transforms diverge substantially more over it. Any figure quoted for adaptation error is a figure for a particular pair of whites.

The colours matter. The sample set here spans the sRGB cube at three levels per channel. A set concentrated near the neutral axis would show the transforms agreeing closely; a set of saturated blues would show them at their worst. This is the same sensitivity that decides a lamp’s rendering score, arriving in a different calculation.

The metric matters. CIELAB ΔE is used here because it is what a specification would use. Measured in CAM16-UCS the ordering is the same and the magnitudes differ, which is a reminder that “how far apart” is itself a question with a fitted answer.

What was computed here

Every matrix in this essay is applied by the same three-line function, which takes the basis as a parameter. That is not a tidiness measure — it is the argument. If each transform were implemented separately, a difference between two of them could be a difference in their implementations, and the whole comparison would be measuring the wrong thing.

The five bases are the only difference between the five transforms, and the code makes that structurally true rather than merely intended.

Two assertions run in the gate. The white-mapping property is checked for all five to 10⁻¹², in the direction that catches a mismatched inverse. And the transforms are required to disagree by more than a threshold — because a comparison in which everything agreed would be reporting that the choice does not matter, and the essay claims it does. An assertion that only checked agreement would pass an implementation in which all five matrices had been quietly replaced by the identity.

The transform builder also rejects a method it has no matrix for, rather than silently falling back to a default. A fallback would mean a caller asking for a transform that does not exist would get an answer, and the answer would be attributed to the transform requested.

Where the model stops

The largest limitation is that this whole family is a linear model of a nonlinear process.

Receptor gain control is not a simple multiplication. Adaptation has a time course, it is spatially local rather than global, and it interacts with the response compression that makes cone output a compressive function of intensity in the first place. A single diagonal scaling in a fixed basis is a first-order approximation that works well enough to have survived a century.

The evidence that it is only first-order is in the fitted transforms themselves. Bradford and CAT02 have negative matrix entries. A cone response cannot be negative, so a basis with negative entries is not a receptor basis, and the fact that fitting to human data produces such a basis is direct evidence that whatever the visual system is doing is not exactly receptor gain control. The fits are absorbing the discrepancy into the basis, which works and explains nothing.

What the pictures cannot show

The comparison here is between predictions, and there is no ground truth on this page.

What would settle which transform is best is corresponding-colour data: pairs of stimuli that observers actually judged to match across an illuminant change. Bradford and CAT02 were fitted to exactly that. This site does not have those datasets, so what it can show is how far the transforms are from each other and from the current recommendation — which establishes that the choice matters and does not establish which choice is right.

That is a real limit and it is worth being clear that the essay’s conclusion respects it. The claim made here is that XYZ scaling is far outside the family and that the other four are close together. The claim not made is that CAT16 is correct; it is used as the reference because it is the current recommendation, and if it were replaced tomorrow the figure would be redrawn against its successor.

Adapting is not the same as converting

A confusion worth separating out, because it produces wrong pipelines rather than merely wrong understanding.

Converting between two colour spaces with the same white point — sRGB to Display P3, both at D65 — is a change of primaries. It is exact, it is invertible, and no adaptation is involved: the same physical stimulus is being described in two coordinate systems.

Converting between two spaces with different white points is two operations, and only the first is exact. The change of primaries is arithmetic. The change of white point is a model of what an observer’s visual system will do, and it is a fitted approximation to a nonlinear process.

Software presents both as a single conversion, so the distinction disappears at the point of use. An image converted from sRGB to Display P3 is the same colours in new coordinates. An image converted from sRGB to a D50 print space is different colours, chosen so that they will look like the originals to somebody adapted differently — which is a much stronger claim and one that can be wrong.

The practical consequence is a rule about round trips. Converting sRGB to P3 and back returns the original values exactly. Converting to a D50 space and back returns values that are close and not identical, and repeating the cycle accumulates. Any workflow that crosses a white point repeatedly — screen to print to scan to screen — is applying a fitted approximation several times in both directions, and the errors do not cancel.

What the transforms are used on

Almost every application of a chromatic adaptation transform is one of four, and they place very different demands on it.

Colour management, moving an image between working spaces with different white points. The most common by volume, and the most forgiving: the destination is a file, the viewer will be adapted to the destination white, and the idealisation the transforms make is close to the situation.

Camera white balance. A sensor records a stimulus; a person adapts. The correction applied in raw processing is an adaptation transform with the source white estimated from the image rather than known, so the estimation error usually dominates the choice of transform.

The first stage of an appearance model. CIECAM16 begins with CAT16, with a degree of adaptation rather than complete adaptation, which is the only one of the four uses that does not make the idealisation.

Rendering a scene under a different light, which is where the transforms are least appropriate and most used. Adapting a rendered image to simulate a different illuminant is not the same calculation as multiplying a reflectance by a different spectrum, and the two give different answers because the second knows the spectra and the first only knows three numbers.

That last distinction is the one worth carrying away. An adaptation transform operates on three numbers. Two lights of the same white point but different spectra are identical to it, and everything under them is not. A transform cannot recover what the collapse to three numbers threw away, and using one to simulate a change of illuminant assumes the discarded information did not matter.

Who found it, and when

Von Kries stated the hypothesis in 1902, in a paper more concerned with the general problem of sensory adaptation than with colour reproduction. The transform bearing his name predates any of the apparatus that made it useful by half a century.

Bradford was developed at the University of Bradford in the late 1980s and standardised through ICC’s profile format, which is why it is the transform most working colour pipelines actually use. CAT02 arrived with CIECAM02 in 2002 and was withdrawn after its negative-value behaviour was documented in practical use. CAT16 accompanied CIECAM16 in 2016.

The persistence of XYZ scaling in production code, decades after it was known to be wrong, is the most interesting fact in the history and the least documented. It survives because it is the implementation somebody would write without reading anything, and because its failure mode — blues going purple — is easy to attribute to the display.

Where this goes next

What the visual system is doing that these transforms approximate is constancy is the default. The model that carries a degree of adaptation rather than assuming completeness is a viewing condition is an argument. And the reason a white point has to be moved at all — that a colour is a property of a surface and a light — is the illuminant is half the answer.

What this makes readable

Essays that name this one as a prerequisite.

Named alongside this one

Essays reaching for the same objects. Nobody chose these; they are what the index of named objects makes visible.

What links here

The 8 essays that link to this one and share the most of its objects, of 31 that link here.

The objects this essay names

Each one links to every other essay that touches it.

AdaptationThe Bradford transformCAT16Chromatic adaptationColour managementΔEIlluminantThe von Kries transformWhite pointXYZ