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
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
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
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
[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.