Crushed Display Blacks

Often people create a display profile, and then notice that when they try and display some images using the profile, that the darkest blacks in the image all get crushed into the black of the display. Why does this happen ?

There are many reasons this may happen, but here is a common one:

The image has blacks that are darker than the black of the display, and the color management intent being used clips out of gamut colors. So all the blacks that are darker than the display black get mapped to the display black. To avoid this, some sort of Gamut Mapping that maps that black of the source image to the black of the display, while preserving the distinction between all the rest of the colors needs to be used.

Some popular synthetic colorspaces have a perfect (and unrealistic) zero black, for instance sRGB and AdobeRGB. Real world display profiles have non-zero blacks, so transforming between these two using a colorimetric intent will clip the blacks, and loose the shadow details.

What performs gamut mapping ?

Typically there are only two mechanisms available to perform gamut mapping. The main one is a pre-cooked (static) gamut mapping built into cLUT type ICC profiles. The second is an on-the-fly (dynamic) gamut mapping performed by the CMM (Color Management Module). A limited form of the latter is Adobe BPC (Black point compensation), which is also available sometimes with applications or systems that use lcms. (Little cms).

How do I fix it ?

There are two ways of avoiding the black crush. One is to turn on BPC if it is available in the system you are using. Sometimes it may only be available for certain intents.

The second way of fixing it is to create your display profile with appropriate gamut mapping, and make sure that it gets used.

Shaper/Matrix type ICC profiles do not support gamut mapping, since there is only one transformation in them and it does not have the necessary flexibility to incorporate gamut mapping. Shaper/Matrix profiles are always colorimetric intent. So it is necessary to create a cLUT based Display profile if gamut mapping is to be incorporated into the profile. (Note that not all systems accept cLUT based Display profiles). Creating cLUT profiles that incorporate appropriate gamut mapping depends on the profile creation tools, and not all tools give adequate control over gamut mapping to reliably fix this problem.

OK, so how do I fix it using Argyll ?

You can usually fix this problem using Argyll by simply creating a cLUT based profile (the default), and telling colprof what the source colorspace is going to be.

i.e. say your source images are in sRGB space, then:

    colprof -v -S sRGB.icm -D "My Display" MyDisplayProfile

[It's usually safer to use the sRGB profile provided by Argyll than use an sRGB profile of unknown origin. Find it in the ref directory.]

This will create 3 separate B2A cLUT tables, one for colorimetric intent, one for Perceptual intent, and one for Saturation intent. Both Perceptual and Saturation tables will have appropriate gamut mapping for a source colorspace of sRGB. So it is just a matter of making sure that either Perceptual or Saturation intent is used when making use of the display profile.