Survey of Free and Open Source ICC RGB Working Space Profiles
This survey assesses the current state (as of January 2014) of free and open source ("floss") ICC RGB working space profiles by comparing and evaluating available floss versions of the four most widely used image editing profiles: AdobeRGB-compatible, ProPhotoRGB, WideGamutRGB, and sRGB.
Procedure for evaluating the quality of floss ICC RGB working space profiles
This survey uses the following criteria for evaluating floss RGB working space profiles:
- How closely do the profile's red, green and blue primaries match the theoretically correct values? Do any of the floss profiles deviate "too far" from their theoretical values?
- How far does the profile deviate from being neutral?
- Excepting intentionally different TRCs, such as a linear gamma version of a standard RGB working space, does the profile have the correct tone response curves? Can the profile be used in unbounded mode ICC profile conversions?
- Did the profile maker use the source white point given in the profile specs?
- Does the profile have the right black point?
Quantifying "how close" and "too far"
The profile evaluation tables in Section B of this survey use a very simple measure of the difference between a given RGB working space profile's primaries and Lindbloom's adapted primaries, which is the sum of the absolute difference between the profile's actual red, green, and blue xyY values and Lindbloom's red, green, and blue xyY values. The same measure is also calculated using selected RGB working space profiles as "reference" profiles.
So much for "how close". One practical effect of deviating "too far" from the theoretically correct adapted primaries is that images visibly change color upon alternately assigning the faulty profile and a good profile. Based on previous informal experiments with camera input profiles, deviations in the third (sometimes) or second (always) decimal places of a profile's xyY values are large enough to visibly alter an image's colors. For this survey, an RGB working space profile's primaries are "too far" from what they should be when its red, green, and blue xyY values deviate from the theoretically correct values xyY values in the third decimal place.
Neutral (color balanced) profiles
RGB working space profiles should be neutral (color balanced). If a profile is neutral, then whenever R=G=B, the resulting color is completely neutral gray, with the equivalent CIELAB value with a*=b*=0.
Adobe's Technical Paper The role of working spaces in Adobe applications by Andrew Rodney very nicely explains the difference between RGB device profiles (in particular, RGB monitor profiles, which typically are not color balanced) and RGB working space profiles, which are (supposed to be) color balanced:
RGB working spaces are mathematically constructed to provide a color space that provides useful and flexible editing qualities. For example, one benefit of synthetically constructed RGB working spaces is that it is easy to define a neutral color. When each value of red, green and blue is equal anywhere within the entire color space, that color is neutral. . . . In a synthetic RGB working space, you are assured that a color is neutral gray when all three values are equal. For example, R5/G5/B5 as well as R200/G200/B200, or any identical set of RGB numbers defines a neutral color.
If a profile's "maximum white" (R=G=B=1.0, assuming floating point) is neutral to six decimal places (the precision provided by Argyllcms' xicclu utility), then the equivalent CIELAB value (relative colorimetric conversion) is L*=100.000000, a*=0.000000, b*=0.000000 (the xicclu L* scale runs from 0 to 100, with a*=b*=0 being completely neutral gray). For the tables in Section B of this survey, a profile's distance from neutral for the RGB value "R=G=B=max white (eg 1.0 for floating point)" was calculated using Lindbloom's Delta E (CIE 1976) equations.
Profile tone response curves
Matching tone response curves in all three channels:
RGB matrix profiles have three tone response curves ("TRCs" for short), one TRC for the red channel, one for the green channel, and one for the blue channel. For all the RGB working space profiles, the TRCs should be identical for all three channels.
Unbounded mode profile conversions and true gamma vs point TRCs:
LCMS2 makes possible unbounded mode ICC profile conversions, which allow for carrying floating RGB values that are less than 0 or greater than 1 across multiple ICC profile conversions. Unbounded mode ICC profile conversions eliminate interim color space clipping, and if the output color space is a linear gamma color space and the output file format can hold RGB values that are less than 0 and greater than 1, then the RGB values aren't clipped at all.
Unbounded mode ICC profile conversions are a huge improvement over traditional bounded mode conversions. But they require that the ICC profiles have the right sort of profile tone response curves. In a point curve there is no necessary relationship between one point and the next, so unbounded mode profile conversions using a point curve would require extrapolation, which LCMS2 as of version 2.5 doesn't do. True gamma curves (gamma=1.00, gamma=1.80, gamma=2.20, etc) don't require extrapolation and so can be used in unbounded mode. Unfortunately some floss ICC profiles included in this survey use point curve substitutes for true gamma curves.
Hexadecimal rounding in tone response curves: V2 vs V4
All the standard RGB working spaces have specified tone response curves ("TRCs"), the most common of which are the sRGB TRC, the gamma=1.80 TRC, and the gamma=2.20 TRC.
Oddly enough, these commonly quoted gamma values are not actually ever found in V2 profiles. All nominally gamma=1.80 V2 profiles that I've ever examined really have gamma=1.800781 TRCs, and asking LCMS2 to make a V2 profile with a gamma=1.80 TRC actually results in the profile having a gamma=1.796875 TRC. And all the nominally gamma=2.20 V2 profiles really have gamma=2.199219 TRCs. These odd values found in V2 profiles result from hexadecimal rounding that happens when the gamma curve value is converted from decimal to hexadecimal during the profile making process.
As an important aside, hexadecimal rounding is not limited to the tone response curves of V2 profiles. It also affects profile XYZ values including the media white point, the primaries, and the chromatic adaptation tag for V2 and V4 profiles. I don't know why the tone response curves of V4 profiles aren't affected by hexadecimal rounding.
To calculate hexadecimal-rounded gamma values for yourself, set up a spreadsheet to calculate as follows: the decimal gamma value to be rounded, multiplied by 256, converted to hexadecimal, converted back to decimal, divided by 256. For openoffice/libreoffice, the spreadsheet formula is:
( HEX2DEC ( DEC2HEX ( XX## * 256 ; 8 ) ) ) / 256
where "XX##" is the cell containing the starting profile gamma curve decimal value (eg, 1.8000, 1.8001, etc).
The following table shows sample hexadecimal rounded gamma values:
Unrounded decimal value | multiply by 256 | convert from decimal to hexadecimal | convert from hexadecimal back to decimal | divide by 256 to get the hexadecimal rounded gamma |
---|---|---|---|---|
1.8000 | 460.8000 | 000001CC | 460.0000 | 1.79687500 |
1.8007 | 460.9792 | 000001CC | 460.0000 | 1.79687500 |
1.8008 | 461.0048 | 000001CD | 461.0000 | 1.80078125 |
1.8046 | 461.9776 | 000001CD | 461.0000 | 1.80078125 |
1.8047 | 462.0032 | 000001CE | 462.0000 | 1.80468750 |
2.1990 | 562.9440 | 00000232 | 562.0000 | 2.19531250 |
2.2000 | 563.2000 | 00000233 | 563.0000 | 2.19921875 |
2.2030 | 563.9680 | 00000233 | 563.0000 | 2.19921875 |
2.2040 | 564.2240 | 00000234 | 564.0000 | 2.20312500 |
Page 10 of the Adobe RGB (1998) Color Image Encoding acknowledges the inevitability of (V2, but not V4) hexadecimal rounding in the TRCs by specifying that:
"The inverse color component transfer function [the profile tone response curve] shall be a simple power-law function using a gamma of 2.19921875 . . . obtained from 2 51/256, or hexadecimal 02.33
V4 profiles use a different (parametric curve) approach to generating profile TRCs, which seems to be immune to the gamma curve hexadecimal rounding errors that happen when making V2 profiles. To maintain consistency across V2 and V4 versions of the same profile, it perhaps would be better to explicitly use the actual V2 profile "hexadecimal rounded" gamma values when making a V4 profile.
In any event, makers and users of floss RGB working space profiles should be aware that this is an area of potential discrepency between V2 and V4 versions of the "same" RGB working space profile. As shown in the above Sample hexadecimal rounding and V2 profile gamma values table, for nominally gamma=1.80 profiles, the actual V2 gamma value is 1.80078125. And for nominally gamma=2.20 profiles, the actual V2 gamma value is 2.19921875. Gamma values of 1.00 (linear gamma) and 2.00 aren't subject to hexadecimal rounding.
Profile white points
As discussed in Section C below, variations in the source white point values used to generate a profile seem to be a major reason why makers of floss profiles distribute different versions of nominally the same profile. So when possible, the tables in Section B show the profile source white point information:
- For true V2 profiles that I was able to duplicate using the ArgyllCMS 1.6.3 sample profile making code, I gave the source white point xy values that were used to make the profiles. For other true V2 profiles, the white point XYZ values were taken from the profile's white point tag and the xy values are calculated using Lindbloom's XYZ to xyY equations.
- For V4 profiles and V2 profiles made according to V4 specifications ("V2-V4" profiles), where possible the white point values are taken from the source code used to generate the profiles.
- For V4 and V2-V4 profiles for which I didn't check the source code, the white point used to generate the profile can be back-calculated from the profile "chad" and "illuminant" tags (within the limits of hexadecimal rounding), but I haven't done this.
Profile black points
For V2 profiles made according to V2 specifications, if there is a black point tag, the X, Y, and Z Black point values should all equal zero (this is not true for all RGB profiles — in particular, device profiles frequently have non-zero black points). For V2 and V4 working space profiles, the black point is implied by the profile's tone response curves, so having or not having a specified black point is somewhat moot, except when the implied and specified black points don't match.
All the profiles in this survey do in fact have zero black points and/or have tone response curves that begin at 0. So the question of profile black points won't be mentioned again in this survey.
Floss RGB working space profile evaluations: Which ones you can trust, which ones to avoid, which ones are closest to selected reference profiles
Reference profiles
As makers of free and open source RGB working space profiles continue to move from making V2 profiles to making V4 and "V2 according to V4 specifications" profiles, it would be nice if existing V2 reference profiles could be identified and selected, that makers of floss RGB working space profiles could agree upon as having exactly the right adapted red, green, and blue primaries and hence the right source white point and the right unadapted primaries.
I used several criteria for identifying reference profiles:
- Does the profile use the right unadapted primaries?
- Does the profile use the right source white point values?
- Does the profile match older V2 reference profiles?
- Is the profile neutral?
To identify the sRGB, AdobeRGB-compatible, and Romm/ProPhoto reference profiles, I consulted the actual profile specifications and also the values found in existing V2 profiles made by floss and proprietary profile makers. I couldn't find specifications for WideGamut, so I relied on values found in existing proprietary V2 profiles.
Profiles labelled as "LCMS2 profile: . . ." are V2-V4 profiles that I made using LCMS2, some of which are functionally equivalent to older V2 profiles, and some of which demonstrate the result of using various source white point values.
Profile Evaluation Tables
In the tables below:
- In the tables below, reference profiles are highlighted.
- "Δ LAB neutral" was calculated by using the Argyllcms xicclu utility to determine the CIELAB values corresponding to the floating point RGB values (1.0, 1.0, 1.0), then using Lindbloom's Delta E (CIE 1976) equations to calculate the distance from the CIELAB value (100.0,0.0,0.0).
- "Sum Δ Lindbloom's xyY" was calculated by summing the absolute differences between the profile's actual red, green, and blue xyY values and Lindbloom's red, green, and blue xyY values. "Sum Δ Reference xyY" similarly. A better measure would have been to convert all the xyY values to CIELAB and calculate the Delta E.
- Some of the table cells are color-coded:
- indicates profiles that are neutral to 6 decimal places.
- indicates profiles that either deviate from being neutral in the second decimal place or have an issue with the profile tone response curves.
- indicates that there is a serious problem with the profile.
- For ProPhoto and WideGamut I indicated two different reference profiles:
- Old V2 ProPhoto profiles seem to be divided equally between profiles that use the source white point specified in the Kodak Romm white paper, and profiles that use source white point values that are approximately (not exactly) equal to the D50 illuminant values. Oddly enough, profiles that seem to have been distributed by Kodak use the approximately D50 illuminant values rather than the values specified in the Kodak Romm white paper. Rather than use a proprietary profile that I can't distribute as the ProPhoto reference profile that uses the source white point values given in the Kodak Romm white paper, I made one using LCMS2.
- All the old proprietary WideGamut profiles I looked at use Pascale's primaries; the second WideGamut reference profile uses Lindbloom's primaries. Rather than use a proprietary profile that I can't distribute as the WideGamut reference profile that uses Pascale's primaries, I made one using LCMS2.
Package name and version Profile name |
Sum Δ Reference xyY |
Sum Δ Lindbloom's xyY |
Δ LAB neutral |
White Point xy values |
Proper TRC? un- bounded mode? |
CMM ICC-spec platform |
---|---|---|---|---|---|---|
Reference profile: argyllcms (all versions except 1.6.1 and 1.6.2) ClayRGB1998.icm 1 |
0.000000 | 0.000074 | 0.000000 | 0.3127, 0.3290 |
Yes Yes |
argl V2, MSFT |
darktable 4.1 built-in Adobe-compatible 1 |
0.000000 | 0.000074 | 0.000000 | 0.3127, 0.3290 |
Yes, Yes |
lcms V2 (built-in) |
shared-color-profiles 0.1.5 icc/Argyll/ClayRGB1998.icm 1 |
0.000000 | 0.000074 | 0.000000 | 0.3127, 0.3290 |
Yes, Yes |
lcms V2 APPL |
openicc 1.3.1 icc/OpenICC/compatibleWithAdobeRGB1998.icc 1 |
0.000000 | 0.000074 | 0.000000 | 0.3127, 0.3290 |
Yes, Yes |
argl V2 *nix |
old (non-floss!) AdobeRGB1998 1, 2 | 0.000000 | 0.000074 | 0.000000 | 0.3127, 0.3290 |
Yes, Yes |
ADOBE V2 APPL |
LCMS2 profile: either modify the illuminant or prequantize the primaries, AdobeRGB1998 specifications white point 1, 3 | 0.000000 | 0.000074 | 0.000000 | 0.3127, 0.3290 |
Yes, Yes |
lcms V2-V4 *nix |
argyllcms (1.6.1 and 1.6.2 only) ClayRGB1998.icm 4 |
0.000003 | 0.000078 | 0.001233 | 0.3127, 0.3290 |
Yes, Yes |
argl V2 MSFT |
colord 1.0.5 icc/colord/AdobeRGB1998-compatible 5 |
0.000417 | 0.000459 | 0.002619 | 0.312721, 0.329126 |
Yes, Yes |
lcms V4 APPL |
rawtherapee 4.0.11.239 RT_Medium_gsRGB.icc 5, 6 |
0.000408 | 0.000447 | 0.000000 | 0.312699, 0.329100 |
srgbtrc, No |
lcms V2 MSFT |
photivo 20131115 linear gamma AdobeRGB1998-compatible 5, 7 |
0.000410 | 0.000432 | 0.0000 (transicc) |
(chad) | linear, Yes |
lcms V4 APPL |
Table Notes:
- The following profiles are functionally identical, meaning they have the exact same red, green, and blue primaries and functionally the same white points:
- argyllcms-1.6.0 ClayRGB1998.icm
- non-floss AdobeRGB1998 profile
- darktable 4.1 built-in Adobe-compatible profile
- shared-color-profiles 0.1.5, icc/Argyll/ClayRGB1998.icm
- openicc 1.3.1, icc/OpenICC/compatibleWithAdobeRGB1998.icc
- LCMS2 profile: modified illuminant (V2-V4)
- If you've ever wondered why floss "AdobeRGB1998-compatible" profiles have such cumbersome and odd names, it's because the name "Adobe RGB (1998)" is trademarked:
Adobe does not permit the use of the Adobe RGB trademark for software, hardware, or other related products from companies other than Adobe, unless the company has obtained a prior written license from Adobe to do so. Companies who are not Adobe licensees but who claim to have technology that is compatible with Adobe RGB (1998) ICC profile software may claim, if true, that their products are "compatible with the Adobe RGB (1998) ICC profile" as long as nothing in the circumstances would create consumer confusion.
- I had to use one of two "tricks" to get the V2-V4 "LCMS2 profile: either modify the illuminant or prequantize the primaries" profile to exactly match the argyllcms-1.6.0 ClayRGB1998.icm reference profile: The first trick was to modify the LCMS2 source code to use the hexadecimal-rounded D50 profile illuminant values from actual ICC profiles, rather than the D50 profile illuminant values given in the ICC profile specifications. The second trick was to "pre-quantize" the unadapted primaries to compensate for hexadecimal rounding during the profile making process.
- The Argyllcms ClayRGB1998.icm profile is very slightly different in Argyllcms versions 1.6.1 and 1.6.2. The differences are very small, but the 1.6.1 and 1.6.2 versions are not neutral to six decimal places. As of Argyllcms-1.6.3, the ClayRGB1998.icm profile matches the version from 1.6.0 and before.
- The colord, rawtherapee, and photivo versions of the AdobeRGB1998-compatible profile are similar to one another. None of them are exact functional equivalents to the reference profile. The colord version uses a D65 "CCT" source white point.
- The rawtherapee profile intentionally has an sRGB tone response curve. As this is a V2 profile, the sRGB tone response curve is a point curve and so can't be used in LCMS2's unbounded mode.
- The photivo profile intentionally has a linear gamma tone response curve.
For the following reasons the right source white point to use for AdobeRGB-compatible profiles really is x=0.3127, y=0.3290:
- The profile specifications in the AdobeRGB1998 white paper clearly state the intended source white point values.
- Most existing V2 profiles honor these source white point values.
- These white point values create a profile that is functionally equivalent to the Adobe RGB 1998 profile.
- These white point values create a profile that is neutral to six decimal places, always a desireable quality in an RGB working space profile.
Unfortunately, the only ways I could find to use LCMS2 to replicate the exact values found in the old V2 Adobe-compatible profiles was either by modifying the LCMS2 source code to use the actual (hexadecimal-rounded) profile illuminant values as the source code illuminant values, or by using the Argyllcms (any version except 1.6.1 and 1.6.2) profile's adapted primaries to calculate "pre-quantized" unadapted primaries that when used with LCMS2, will exactly reproduce the Argyllcms adapted primaries.
Package name and version Profile name |
Sum Δ Reference xyY |
Sum Δ Lindbloom's xyY |
Δ LAB neutral |
White Point xy values |
Proper TRC? un- bounded mode? |
CMM ICC-spec platform |
---|---|---|---|---|---|---|
Reference profile: LCMS2 profile: Kodak Romm specifications white point 1 |
0.000000 | 0.000104 | 0.000000 | 0.3457, 0.3585 |
Yes, Yes |
lcms V2-V4 *nix |
argyllcms 1.6.3 1 2 | 0.000000 | 0.3457, 0.3585 |
?, No |
argl V2 MSFT |
||
old (non-floss!) Adobe ProPhoto 1 | 0.000024 | 0.000126 | 0.000000 | 0.3457, 0.3585 |
Yes, Yes |
ADOBE V2 APPL |
shared-color-profiles 0.1.5 icc/Argyll/ProPhotoRGB.icc 3 |
0.000128 | 0.000113 | 0.002834 | 0.345702, 0.358496 |
Yes, Yes |
lcms V2 APPL |
photivo 20131115 ProPhotoRGBlinear.icc 3 |
0.000386 | 0.000326 | 0.0000 (transicc) |
(chad) | linear, Yes |
lcms V4 APPL |
rawtherapee 4.0.11.239 RT_Large_gBT709.icc 3 |
0.000453 | 0.000351 | 0.001233 | 0.345740, 0.358667 |
rec709trc, No |
lcms V2 MSFT |
rawtherapee 4.0.11.239 RT_Large_gsRGB.icc 3 |
0.000453 | 0.000351 | 0.001233 | 0.345740, 0.358667 |
srgbtrc, No |
lcms V2 MSFT |
rawtherapee 4.0.11.239 RT_Large_g10.icc 3, 4 |
0.000453 | 0.000351 | 0.001233 | 0.345740, 0.358667 |
linear point curve, No |
lcms V2 MSFT |
Alternate reference profile: libkdcraw 4.11 prophoto.icm 5 |
0.000000 (0.000128) |
0.000028 | 0.008051 | 0.345705, 0.358539 |
Yes, Yes |
lcms V2 *nix |
old (non-floss!) Kodak profile 5 | 0.000000 (0.000128) |
0.000028 | 0.002986 | 0.345705, 0.358539 |
Yes, Yes |
KCMS V2 APPL |
colord 1.0.5 icc/colord/ProPhotoRGB.icc 5, 6 |
0.000000 (0.000128) |
0.000028 | 0.002802 | 0.345703, 0.358539 |
Yes, Yes |
lcms V4 APPL |
openicc 1.3.1 icc/OpenICC/ProPhotoRGB.icc 5, 7 |
0.000000 (0.000128) |
0.000028 | 0.008051 | 0.345705, 0.358539 |
Yes, Yes |
lcms V2 *nix |
Table Notes:
- I chose the "LCMS2 profile: Kodak ROMM specifications white point" profile as a ProPhoto reference profile for four reasons:
- This profile uses the primaries and the source white point values given in the Reference Output Medium Metric RGB Color Space (ROMM RGB) White Paper and it seems to me that precedence ought to be given to profile variants that actually do meet the profile's specifications.
- This profile is neutral to six decimal places.
- It almost exactly duplicates an old Adobe ProPhoto profile, which was and probably still is the profile used in Adobe Photoshop, so a very large percentage of professional and enthusiast photographers expect that "ProPhoto" means this particular ProPhoto.
- The Argyllcms profile has the exact same primaries as the reference profile that I made using LCMS2. The tone response curve is a 1024-point TRC, which probably replicates the TRC specified in the Kodak ROMM documentation. Most people aren't aware that the original ROMM specification call for a linear gamma segment in the shadows. Almost all ProPhoto profiles use a true gamma curve instead of the ROMM-specified point curve.
- The following profiles increasingly diverge from the primaries in the reference profile and from Lindbloom's adapted ProPhoto primaries:
- shared-color-profiles 0.1.5, icc/Argyll/ProPhotoRGB.icc
- the linear gamma Photivo ProPhoto profile
- the three rawtherapee ProPhoto profiles
- All RawTherapee profile tone response curves are 4096-point TRCs instead of the profile's standard TRC. The claim is that the increased number of points means greater accuracy, especially in the shadows. This claim sounds plausible for the standard sRGB TRC and the BT-709 TRC, both of which are point curve TRCs according to the V2 profile specifications. It sounds implausible as a substitute for a linear or other true gamma TRC. In any event, because it has a point curve instead of a true gamma curve, this nominally linear gamma version of ProPhoto can't be used in LCMS2's unbounded mode.
- I chose this profile as an alternate reference profile because this is the ProPhoto variant that seems to have been distributed by Kodak and also because this is the ProPhoto variant supplied by several floss profile makers. I don't think this is the right reference profile to use for ProPhoto, for two reasons:
- Even though possibly originating with Kodak, this ProPhoto variant doesn't meet the profile specifications in the Kodak ROMM white paper. Instead of using the ROMM white point values (also used in old D50 WideGamut profiles), it uses values that are approximately equal to the profile D50 illuminant.
- This profile variant isn't neutral to six decimal places. As an aside, because of slight differences in the profile D50 illuminant and white point values from one of the V2 variants to the next, the amount of the deviation from neutral depends in part on whether you use LCMS2's transicc or Argyllcms' xicclu to determine the CIELab values for max white; the two utilities use V4 and V2 ways, respectively, for doing colorimetric conversions from one color space to another.
- The colord ProPhoto profile is a V4 profile. It has a parametric curve gamma=1.80 TRC, which is slightly different from the hexadecimal rounded gamma=1.80078 curve found in old V2 profiles. The two curves are idential at R=G=B=0 and R=G=B=1.0 (floating point values), with a maximum deviation at approximately R=G=B=0.5. As you might expect, the maximum deviation in RGB values is extremely small (less than 3/10ths of a percent).
- The "OpenICC/ProPhotoRGB.icc" profile has "absolute colorimetric" as the default conversion intent, which possibly matches the original Kodak Romm profile. I've lost my own copy of the Kodak profile that used to be available from a download link on the Kodak website, so I can't check to make sure. All of the other ProPhoto-like profiles that I've found have "perceptual" as the default conversion intent. In practice, it probably won't make any difference as most or all color managed editing programs ignore the conversion intent specified in the header. Nonetheless, when using this profile you might want to make sure you've specified relative colorimetric intent unless you really want absolute.
Personally I prefer that my floss ProPhoto profile match the specifications in the ROMM white paper except for having a true gamma curve so it can be used in LCMS unbounded mode, be neutral to six decimal places, and as an added bonus be a very close match to the old Adobe ProPhoto variant, rather than match a ProPhoto variant that doesn't match the ROMM specifications and isn't neutral.
Package name and version Profile name |
Sum Δ Reference xyY |
Sum Δ Lindbloom's xyY |
Δ LAB neutral |
White Point xy values |
Proper TRC? un- bounded mode? |
CMM ICC-spec platform |
---|---|---|---|---|---|---|
Reference profile: LCMS2 profile: Pascale's primaries, Kodak ROMM specifications D50 white point 1 |
0.000000 | 0.002962 | 0.000000 | 0.3457, 0.3585 |
Yes, Yes |
lcms V2-V4 *nix |
old (non-floss!) Adobe WideGamutRGB 1 | 0.000000 | 0.002962 | 0.000000 | 0.3457, 0.3585 |
Yes, Yes |
ADBE V2 APPL |
libkdcraw 4.11 widegamut.icm 2 |
0.000224 | 0.002963 | 0.032421 | 0.345703, 0.358538 |
256 point curve, No |
scrs V2 MSFT |
calligra-2.7.5 icc/krita/WideGamut.icm 2 |
0.000224 | 0.002963 | 0.032421 | 0.345703, 0.358538 |
256 point curve, No |
scrs V2 MSFT |
Alternate reference profile: colord 1.0.5 icc/colord/WideGamutRGB.icc 3 |
0.000000 (0.002906) |
0.000073 | 0.002638 | 0.345703, 0.358539 |
Yes, Yes |
lcms V4 APPL |
photivo 20131115 WideGamutRGBlinear.icc 4 |
0.000302 (0.002928) |
0.000273 | 0.0026 (transicc) |
(chad) | linear, Yes |
lcms V4 APPL |
Table Notes:
- Although Adobe developed the WideGamut profile, I couldn't find Adobe's actual WideGamut profile specifications. If you have a link, please share! Lacking such specifications, the two choices for the profile primaries are Lindbloom's or Pascale's. The only logical choices for the profile source white point are the ICC-specified D50 illuminant or the white point found in old Adobe and Canon D50 WideGamut profiles.
Failing to find any existing floss ICC profiles that exactly matched Pascale's primaries and the old D50 WideGamut white point (the libkdcraw and krita WideGamut profiles come close), I made one using LCMS2 to use as a reference profile. This profile's primaries and white point are an exact match to the primaries and white point found in the old proprietary WideGamut profiles. The white point is the same as the white point given in the Kodak Romm documentation. It's also neutral to six decimal places, always a plus for RGB working space profiles.
- The "libkdcraw 4.11 widegamut.icm" and "calligra-2.7.5 icc/krita/WideGamut.icm" profiles are identical profiles. These profiles are both "scrs" profiles. "scrs" profiles tend to be problematic in one way or another and in some cases are completely faulty. In this case the problems are relatively minor: The "scrs" WideGamut profile is only neutral to two decimal places; most floss RGB working space profiles are neutral to at least 3 decimal places. And the "scrs" profile tone response curve is a 256 point curve instead of a true gamma=2.19922 curve, so the profile can't be used in LCMS2's unbounded mode. The WideGamut profile by specification has a true gamma curve, and so a point curve substitute makes no sense.
- The colord 1.0.5 icc/colord/WideGamutRGB.icc profile was made using the Lindbloom primaries and the ICC-specified D50 source white point. The resulting profile's adapted primaries almost exactly match Lindbloom's adapted primaries. The profile is neutral to 3 decimal places.
- The Photivo WideGamut primaries are a much closer match to the colord reference profile than to the old Adobe/Canon profiles. This profile intentionally is a linear gamma version of WideGamut.
Lacking actual WideGamut profile specifications, I'd prefer that my floss WideGamut profile use Pascale's primaries and the source white point found in old D50 proprietary WideGamut profiles, which is the same source white point found in old proprietary D50 ProPhoto profiles and the Kodak ROMM white paper. The resulting profile is an exact match to old Adobe and Canon WideGamut profiles and is neutral to six decimal places.
Package name and version Profile name |
Sum Δ Reference xyY |
Sum Δ Lindbloom's xyY |
Δ LAB neutral |
White Point xy values |
Proper TRC? un- bounded mode? |
CMM ICC-spec platform |
---|---|---|---|---|---|---|
Reference profile: argyllcms, all versions except 1.6.1 and 1.6.2 sRGB.icm 1 |
0.000000 | 0.000253 | 0.000000 | 0.3127, 0.3290 |
Yes, No |
argl V2 MSFT |
shared-color-profiles 0.1.5 icc/Argyll/sRGB.icm 1 |
0.000000 | 0.000253 | 0.000000 | 0.3127, 0.3290 |
Yes, No |
lcms V2 APPL |
argyllcms-1.6.2 sRGB.icm 2 |
0.000239 | 0.000105 | 0.001233 | 0.3127, 0.3290 |
Yes, No |
argl V2 MSFT |
LCMS2 sRGB profile #1: same white point as the AdobeRGB specs 2 |
0.000239 | 0.000105 | 0.001233 | 0.3127, 0.3290 |
Yes, No |
lcms V2-V4 *nix |
LCMS2 sRGB profile #2: modified illuminant, rounded 6503.6K (CCT) white point. 3 |
0.000526 | 0.000537 | 0.000000 | 0.31271, 0.32912 |
Yes, No |
lcms V2-V4 *nix |
LCMS2 sRGB profile #3: LCMS2 API-specified sRGB white point 4 |
0.000506 | 0.000485 | 0.003446 | 0.3127, 0.3291 |
Yes, No |
lcms V2-V4 *nix |
libkdcraw 4.11 srgb-d65.icm 4 |
0.000506 | 0.000492 | 0.003446 | 0.312713, 0.329120 |
Yes, No |
lcms V2 MSFT |
openicc 1.3.1 icc/OpenICC/sRGB.icc 4 |
0.000506 | 0.000492 | 0.003446 | 0.312713, 0.329120 |
Yes, No |
lcms V2 MSFT |
colord 1.0.5 icc/colord/sRGB.icc 4 |
0.000506 | 0.000492 | 0.003450 | 0.312721, 0.329126 |
Yes, Yes |
lcms V4 APPL |
calligra-2.7.5 icc/krita/krita25_lcms-builtin- sRGB_g100-truegamma.icc 4, 5 |
0.000507 | 0.000493 | 0.0034 (transicc) |
(chad) | linear, Yes |
lcms V4 APPL |
rawtherapee 4.0.11.239 RT_sRGB.icm 4, 6 |
0.000506 | 0.000485 | 0.003446 | 0.312699, 0.329100 |
No, No |
lcms V2 MSFT |
rawtherapee 4.0.11.239 RT_sRGB_g10.icm 4, 6 |
0.000506 | 0.000485 | 0.003446 | 0.312699, 0.329100 |
linear point curve, No |
lcms V2 MSFT |
rawtherapee 4.0.11.239 RT_sRGB_gBT709.icm 4, 6 |
0.000506 | 0.000485 | 0.003446 | 0.312699, 0.329100 |
rec709trc, No |
lcms V2 MSFT |
calligra-2.7.5 icc/krita/sRGB.icm 7 |
0.067698 | 0.067631 | 19.550705 | 0.345703, 0.358538 |
256 point curve, No |
scrs V2 MSFT |
libkdcraw 4.11 srgb.icm 7 |
0.067698 | 0.067631 | 19.550705 | 0.345703, 0.358538 |
256 point curve, No |
scrs V2 MSFT |
calligra-2.7.5 icc/krita/scRGB.icm 8 |
0.099915 | 0.099748 | 0.000000 | 0.345703, 0.358538 |
linear, Yes |
lcms V2 APPL |
photivo 20131115 FlatProfile.icc 8 |
0.099915 | 0.099748 | 0.000000 | 0.345703, 0.358538 |
linear, Yes |
lcms V2 APPL |
Table Notes:
- The argyllcms-1.6.0 and shared-color-profiles 0.1.5 sRGB.icm profiles are functionally identical, meaning they have the same primaries and white point. These two profiles are neutral to six decimal places. Apparently the real, true, original sRGB profile had exactly these primaries and white points. Also, it seems that some tweaking was done to these primaries to compensate for hexadecimal rounding.
In my opinion, this is the real sRGB profile. This sRGB profile can be duplicated using LCMS2 by using unadapted primary values that have been tweaked to compensate for hexadecimal rounding.
- The argyllcms-1.6.2 sRGB profile and "LCMS2 sRGB profile #1: same white point as the sRGB specifications" are also functionally identical. These two profiles are only a little bit different from the argyllcms-1.6.0 profile, in that no tweaking was done. These profiles are not quite neutral. The source white points are, respectively, x=0.3127, y=0.329001 (from the argyllcms-1.6.2 sRGB profile white point tag) and x=0.3127, y=0.3290 (from the sRGB specs).
The Argyllcms sRGB.icm profile changed very slightly between Argyllcms version 1.6.0 and 1.6.1. The differences are very small, but the 1.6.1 and 1.6.2 versions are not neutral to six decimal places. When Argyllcms-1.6.3 was released, the sRGB.icm profile returned to the version from 1.6.0 and before.
- "LCMS2 sRGB profile #2: modified illuminant, rounded 6503.6K (CCT) white point" profile is neutral to six decimal places. This profile's primaries are too far from the original sRGB profile's primaries. So neutral or not, it's not a good sRGB profile.
- These eight sRGB profiles are essentially functionally identical to each other, except for the profiles with deliberately different tone response curves (eg linear gamma sRGB):
- LCMS2 sRGB profile #3: LCMS2 API-specified sRGB white point
- libkdcraw 4.11: srgb-d65.icm
- openicc 1.3.1: icc/OpenICC/sRGB.icc
- colord 1.0.5: icc/colord/sRGB.icc
- calligra-2.7.5: icc/krita/krita25_lcms-builtin-sRGB_g100-truegamma.icc
- rawtherapee 4.0.11.239: RT_sRGB.icm
- rawtherapee 4.0.11.239: RT_sRGB_g10.icm
- rawtherapee 4.0.11.239: RT_sRGB_gBT709.icm
- This is a linear gamma version of the built-in LCMS2 sRGB profile.
- RawTherapee provides three versions of the sRGB profile, all exactly the same except for the tone response curves, which are: a linear 4096-point curve, a 4096-point version of the bt-709 curve, and a 4096-point version of the sRGB point curve. The sRGB curve has 1024 points in (true) V2 sRGB profiles and 4096 points in V2-V4 profiles. These point curves can't be used in LCMS2's unbounded mode. As an aside, for V4 profiles, there is a parametric sRGB tone response curve that can be used in unbounded mode.
- The calligra-2.7.5 krita/sRGB.icm and the libkdcraw-4.11 srgb.icm profiles are identical. This profile has a D50 white point instead of the standard V2 D65 white point. There is no chromaticity tag, so the profile appears to be a V2 profile made according to V2 specifications. This profile has a 256 point tone response curve instead of the standard 1024 point TRC. The profile Red, Green, and Blue "xyY" values are a very close match to the unadapted values from Lindbloom's first chart, but they ought to match the values from the second chart.
This profile is faulty and shouldn't be used for image editing. If you assign it to an untagged sRGB image, the image will acquire a blue color cast. As of libkdcraw-4.12, libkdcraw no longer distributes this faulty profile. This is one of the old and usually problematic "scrs" profiles.
- The calligra-2.7.5 krita/sRGB.icm and photivo 20131115 FlatProfile.icc are identical profiles, with the krita profile being the original. Based on its file name, the "krita/scRGB.icm" is intended to be a linear gamma version of sRGB, so of course it has a linear gamma tone response curve. The profile Red, Green, and Blue "xy" values are a very close match to the unadapted values from Lindbloom's first chart, but the Y values don't match the values from either the adapted or the unadapted chart. The Y values in this profile are very odd — this profile seems to be attempting to do a Bradford transformation by means of manipulating the Y values.
If you assign this profile to an image that is already in a proper linear-gamma sRGB color space (for example, a linear gamma version of the Argyllcms sRGB profile, or a linear gamma version of the lcms built-in sRGB profile), the colors will visibly change, and the more saturated the colors, the more obvious the change. This ICC profile shouldn't be used as a substitute for an actual linear gamma sRGB profile.
The argyllcms-1.6.0 sRGB profile seems to me to be the right sRGB reference profile. The argyllcms-1.6.2 sRGB profile is extremely close and easy to make using LCMS2. I'm very curious as to how the many other floss sRGB variants came to exist, but it would be nice if they were relegated to historical curiosities instead of being distributed along with floss software.
Different ICC specs + different software + different white points = many variants of nominally the same floss RGB working space profile
An RGB working space profile like sRGB or ProPhoto is defined by a set of unadapted primaries and a source white point. Floss profile makers don't all use the same profile-making software or make profiles according to the same ICC specifications, but functionally equivalent profiles can be made using different software and different ICC specs.
Most floss profile makers seem to agree on what primaries should be used when making the various RGB working space profiles. But floss profile makers don't agree on the precise source white point values to use when making the various RGB working space profiles. Variations in source white point values used to make a working space profile such as sRGB or ProPhotoRGB means variations in the resulting profiles.
I find the fact that the floss profile makers don't all use the same source white point values when making any given ICC RGB working space profile to be very odd because usually the correct values are given in the profile's color space specifications and usually the color space specifications are readily available. So why don't all the floss profile makers just consult the relevant color space specification?
Different ICC profile specifications
The International Color Consortium ("the ICC") sets the specifications for ICC profiles. "V2" and "V4" refer to two different ICC profile specifications, with the newer V4 specifications superceding the older V2 specifications. Some floss RGB working space profiles are V2 profiles, some are V4 profiles, and some are V2 profiles made according to V4 specifications profiles (referred to below as "V2-V4" profiles). The situation is further complicated by the fact that the V2 ICC specs underwent considerable revision over time, resulting in different versions of V2 profiles.
Argyllcms makes V2 profiles. LittleCMS version 1 makes V2 profiles. LittleCMS version 2 ("LCMS2") makes V4 or V2-V4 profiles. I think LCMS2 can also make true V2 profiles (ie, with the source white point in the media white point tag and without a chad tag), but I'm not sure how this is done. Sample code for making a V2-V4 ProPhoto profile using LCMS2 is shown in the code box below:
//Sample LCMS2 code for making the ProPhoto RGB //working space profile //Specify the unadapted primaries cmsCIExyYTRIPLE romm_primaries = { {0.7347, 0.2653, 1.0}, {0.1596, 0.8404, 1.0}, {0.0366, 0.0001, 1.0} }; primaries = romm_primaries; //Specify the source whitepoint cmsCIExyY d50_romm_doc_whitepoint = {0.3457, 0.3585, 1.0}; whitepoint = d50_romm_doc_whitepoint; //Specify the tone response curves cmsToneCurve* gamma180[3]; gamma180[0] = gamma180[1] = gamma180[2] = cmsBuildGamma (NULL, 1.80078125); //Create the profile profile = cmsCreateRGBProfile ( &whitepoint, &primaries, tone_curve ); //Set the profile version (defaults to V4) cmsSetProfileVersion(profile, 2.1); //Write the profile to disk filename = "ProPhotoRGB-V2-g18.icc"; cmsSaveProfileToFile(profile, filename);
A major difference between a V2 profile and a V4 or V2-V4 profile is how the profile white point tag is handled. V2 profiles usually put the source white point values that are used to generate the profile directly in the resulting profile's white point tag (the other alternative was to throw this information away, but I've never seen an old V2 profile that actually did this). Unlike (true) V2 profiles, V4 and V2-V4 profiles have the profile illuminant's D50 XYZ values repeated again in the profile's white point tag (which seems to make the white point tag superflous for profiles generated according to V4 specifications, even though it's a required tag). For V2, V4, and V2-V4 profiles, the source white point values are used as follows:
- For all profiles (V2, V2-V4, and V4), the unadapted profile primaries given in the original color space's specifications must be Bradford-adapted from the source white point given in the color space specifications to the destination white point. For ICC profiles, the destination white point is always the ICC-specified D50 profile illuminant. So to make a profile, first the source and destination white point values are used to calculate a Bradford chromatic adaptation matrix, which in turn is used to generate the resulting profile's red, green, and blue adapted primaries, which are written to the resulting profile's red, green, and blue "colorant" tags.
- Then, as already noted, for V2 profiles the source white point values are written directly to the profile's white point tag. For V2-V4 and V4 profiles, the D50 illuminant is written to the profile's white point tag and the Bradford adaptation matrix is written to the profile's chromatic adaptation ("chad") tag. This "chad" tag is a required tag for all profiles (V4 and V2-V4) made according to V4 profile specifications, but it's not required for V2 profiles made according to V2 specifications. If a V2 profile does have a "chad" tag, the source white point information isn't carried in the white point tag, but rather in the "chad" tag.
Except for WideGamut, floss profile makers probably agree on the unadapted RGB primaries
The standard RGB working space profiles have generally accepted and more or less easily accessible criteria that define each profile in terms of the profile's tone response curves, source white point and unadapted red, green, and blue primaries (xyY values). Lindbloom's RGB Working Space Information page is often used as a definitive source for information about the standard RGB working spaces. I confirmed Lindbloom's unadapted red, green, and blue primaries for sRGB, Adobe RGB (1998), and ProPhoto RGB from independent sources, but not for WideGamut RGB:
- The Reference Output Medium Metric RGB Color Space (ROMM RGB) White Paper (ProPhoto) and Adobe® RGB (1998) Color Image Encoding white papers confirm Lindbloom's values for these two profiles.
- Specifications for sRGB are widely available on the internet.
- Lindbloom's sRGB, Adobe and ProPhoto primary values exactly match values published in Pascale's Review of RGB Color Spaces). Pascale gives different values for the WideGamut primaries.
Adobe developed the WideGamut color space to achieve a "large gamut by using pure spectral primary colors". Pascale's values for the WideGamut primaries are slightly different from Lindbloom's values. Having examined old V2 WideGamut profiles distributed by Canon and Adobe, Pascale's WideGamut primaries appear to be the correct primaries to use when making a WideGamut profile.
Floss profile makers disagree about the right profile source white point values
Lindbloom's RGB Working Space Information page has two tables. The first table gives values for the unadapted primaries. These are the values found in the specifications for a profile. The second table gives values that have been Bradford-adapted from the various profile source white points to the D50 destination white point. Lindbloom's second table seems to use ASTM values for D50 and D65, which are not the same as the D50 and D65 white point values given in the various profile specifications or the D50 illuminant values used in actual ICC profiles.
Consequently, the exact values in Lindbloom's second table aren't likely to be found in profiles distributed by the various suppliers of floss RGB working space profiles. However, Lindbloom's second table of chromatically adapted primaries does illustrate the most important reason why there are so many variants of nominally the same RGB working spaces being distributed. For the most part, and as far as I was able to tell looking at the profiles (and in some cases the code used to generate the profiles):
- Except for WideGamut, most floss profile makers seem to start with the same unadapted red, green, and blue primaries as appropriate to the profile.
- As required by the ICC specifications, most floss profile makers use profile-making code that Bradford-adapts the primaries from the source white point to the destination white point.
- As required by the ICC specifications, all floss profile makers use the same ICC specified D50 profile illuminant as the destination white point. (As an aside, some older proprietary V2 profiles use values for the D50 profile illuminant that don't match the ICC specifications.)
- But the various floss profile makers use different values for the D50 and D65 source white points. So the resulting profiles' adapted primaries (the colorant tags) and chad (V4 and V2-V4 profiles) or white point (V2 profiles) tags are different.
Why do the various floss profile makers use different source white point values when making nominally the same profile? As shown in the table just below, different recognized authorities provide different values for the D50 and D65 white points:
Source | D50 | D65 |
---|---|---|
Lindbloom's ASTM values | x=0.345669187 y=0.358496180 |
x=0.312726615 y=0.329023130 |
Values given in the ICC specifications | x=0.345702915 y=0.358538597 (illuminant) |
x=0.312715907 y=0.329001481 |
D50 illuminant values found in actual ICC profiles | x=0.345702921 y=0.358537532 |
— |
D65 sRGB profile white point value given in the LCMS API | — | x=0.3127 y=0.3291 |
Profile white point values from specifications for Romm/ProPhoto (D50) and Adobe RGB 1998 (D65) | x=0.3457 y=0.3585 |
x=0.3127 y=0.3290 |
Profile white point values found in actual old V2 D50 ProPhoto and D65 AdobeRGB-compatible profiles | x=0.345699812 y=0.358500268 |
x=0.312700492 y=0.329000939 |
Correlated Color Temperature ("CCT") values | 5003K: x=0.345653049 y=0.358596160 |
6503.6K: x=0.312714057 y=0.329119099 |
The above table shows a few (not all!) of the different D50 and D65 white point values given by different authoritative sources. The primary purpose of the table is to show you that authorities do differ in what the precise values are for the D50 and D65 white point xyY values. The profile evaluations tables in Section B above include the white point values used to make the various floss profiles.
Hexadecimal rounding
In the above table of Selected D50 and D65 profile white point xyY values, the highlighted values from actual profiles nicely illustrate a peculiar property of values found in ICC profiles: they are subjected to hexadecimal rounding. For example, looking at the values in the table:
- The D50 illuminant xyY values given in the ICC profile specifications (x=0.345702915, y=0.358538597) are not the same as the D50 illuminant xyY values that you find in actual ICC profiles (x=0.345702921, y=0.358537532).
- Asking for a V2 profile D50 source white point of "x=0.3457, y=0.3585" results in an actual profile white point tag with "x=0.345699812, y=0.358500268".
- Asking for a V2 profile D65 source white point of "x=0.3127, y=0.3290" results in an actual profile white point tag with "x=0.312700492, y=0.329000939".
- When making a profile according to V4 specifications, the white point tag always has the (hexadecimal-rounded) ICC-specified D50 white point tag, and the "chad" tag values are also subject to hexadecimal rounding. The color.org website provides a nice illustration of hexadecimal rounding, comparing the calculated D65 to D50 chromatic adaptation matrix to the matrix that appears in the resulting profile's "chad" tag.
- A profile's red, green, and blue adapted primaries are likewise subjected to hexadecimal rounding errors during the profile making process.
Conclusions
- Users of open source imaging software assume and expect that sRGB is sRGB, ProPhoto is ProPhoto, AdobeRGB-compatible is AdobeRGB-compatible, and so on, regardless of the source of the profile. But sadly this is not the case. It would benefit users of floss ICC profiles if distributors could agree on what the proper white point values and hence adapted primaries really are for the standard RGB working spaces. However, the current reality is that for the various RGB working spaces there are multiple variants being distributed (sometimes even by the same supplier), each with its own slightly different white point and primaries. Reasons for this subtle cacophany of profile variants include:
- The various floss profile makers use different xyY/XYZ values for nominally D50 and D65 white points, in the process often ignoring the white point values given in easily available profile specifications.
- Lindbloom and Pascale disagree on the right values for the unadapted WideGamut primaries Many floss profile makers seem to follow Lindbloom, so their profiles don't match existing older Canon and Adobe WideGamut profiles.
- Different software (Argyllcms, LittleCMS, scarse, other floss software?), and different versions of software (eg LittleCMS versions 1 and 2) are used to make ICC profiles.
- A handful of completely faulty floss RGB working space profiles are still being distributed.
- RGB working spaces are supposed to be well behaved (color balanced, neutral). However, many RGB working space profiles are not as neutral as one might hope. To make neutral profiles using LittleCMS, some D50 profiles and probably all non-D50 profiles require profile making code that compensates for hexadecimal rounding. The profile-making code in my article Use LCMS to Make Your Own ICC Profiles provides pre-quantized primaries for several standard RGB working spaces.
- Some floss RGB working space profiles have point curve substitutes for true gamma tone response curves and so can't be used in LCMS2's unbounded mode. Also, V2 and V4 profiles made with the same nominal true gamma=2.22 and true gamma=1.80 TRCs have subtle differences in the resulting profiles' actual gamma curves.
- It would greatly benefit users of open source software if floss RGB working space profiles had more informative file names and profile descriptions.
This survey is subject to revision as I find time to update the tables, add information, and so on. Also, open source software moves fast. Don't expect that everything on this page will necessarily be true by the end of next year or even next month. If you see any mistakes or outdated information in this survey, please let me know and I'll update it ASAP.