Selected CIE Colorimetric Tables

Source Notebook

Standard illuminants, colorimetric observer curves, and daylight components for working with visible light spectra and illumination, from Publication CIE 15:2004

Details

The data is for visible wavelengths (380nm - 780nm). It includes spectral power functions for CIE Standard Illuminants A and D65, as well as the Standard Daylight Components, S0, S1, and S2, as tables of wavelengths and values. These spectra, along with the CIE observer curves for X, Y and Z color components can be used to visualize the color of a spectrum.
The default content is a List containing the CIE 1964 observer curves for X, Y and Z color components.
Additional content elements include:
"CIE1964"CIE 1964 Colorimetric Observer Functions (default)
"CIE1931"CIE 1931 Colorimetric Observer Functions
"IlluminantA"Standard Illuminant A
"IlluminantD65"Standard Illuminant D65
"DaylightS0S1S2"D Series Spectral Power Distributions

(81 elements)

Examples

Basic Examples (1) 

Retrieve the default data, the CIE Color Matching Functions :

In[1]:=
CIE1964 = ResourceData[\!\(\*
TagBox["\"\<Selected CIE Colorimetric Tables\>\"",
#& ,
BoxID -> "ResourceTag-Selected CIE Colorimetric Tables-Input",
AutoDelete->True]\)];
ListPlot[{CIE1964[[All, {1, 2}]], CIE1964[[All, {1, 3}]], CIE1964[[All, {1, 4}]]}, PlotLabel -> "CIE 1964 Color Matching Functions", AxesLabel -> {"\[Lambda] (nm)", ""}, PlotLegends -> Placed[{"\!\(\*OverscriptBox[\(x\), \(_\)]\)(\[Lambda])", "\!\(\*OverscriptBox[\(y\), \(_\)]\)(\[Lambda])", "\!\(\*OverscriptBox[\(z\), \(_\)]\)(\[Lambda])"}, {{0.85, 0.98}, {1, 1}}
   ]]
Out[2]=

Scope & Additional Elements (1) 

The standard illuminants are spectra for studying lighting. Illuminant A represents indoor, incandescent lighting, with the power spectrum of a black body at 2856° Kelvin. Illuminant D65 represents daylight at 6504° Kelvin. The relative spectral power distributions, S0, S1, and S2 of the Illuminant D series can be used to compose alternate illuminant variations.

In[3]:=
CIE1931 = ResourceData[\!\(\*
TagBox["\"\<Selected CIE Colorimetric Tables\>\"",
#& ,
BoxID -> "ResourceTag-Selected CIE Colorimetric Tables-Input",
AutoDelete->True]\), "CIE1931"];
SIA = ResourceData[\!\(\*
TagBox["\"\<Selected CIE Colorimetric Tables\>\"",
#& ,
BoxID -> "ResourceTag-Selected CIE Colorimetric Tables-Input",
AutoDelete->True]\), "IlluminantA"];
SID65 = ResourceData[\!\(\*
TagBox["\"\<Selected CIE Colorimetric Tables\>\"",
#& ,
BoxID -> "ResourceTag-Selected CIE Colorimetric Tables-Input",
AutoDelete->True]\), "IlluminantD65"];
S0S1S2 = ResourceData[\!\(\*
TagBox["\"\<Selected CIE Colorimetric Tables\>\"",
#& ,
BoxID -> "ResourceTag-Selected CIE Colorimetric Tables-Input",
AutoDelete->True]\), "DaylightS0S1S2"];

Visualizations

In[4]:=

ListPlot[{CIE1931[[All, {1, 2}]], CIE1931[[All, {1, 3}]], CIE1931[[All, {1, 4}]]}, PlotLabel -> "CIE 1931 Color Matching Functions", AxesLabel -> {"\[Lambda] (nm)", ""}, PlotLegends -> Placed[{"\!\(\*OverscriptBox[\(x\), \(_\)]\)(\[Lambda])", "\!\(\*OverscriptBox[\(y\), \(_\)]\)(\[Lambda])", "\!\(\*OverscriptBox[\(z\), \(_\)]\)(\[Lambda])"}, {{0.85, 0.98}, {1, 1}}
   ]]
Out[4]=
In[5]:=
ListPlot[{S0S1S2[[All, {1, 2}]], S0S1S2[[All, {1, 3}]], S0S1S2[[All, {1, 4}]]}, PlotLabel -> "Spectral Power Distributions:\nD Series Illuminant", AxesLabel -> {"\[Lambda] (nm)", ""}, PlotLegends -> Placed[{"S0(\[Lambda])", "S1(\[Lambda])", "S2(\[Lambda])"}, {{0.925, 0.99}, {1, 1}}
   ]]
Out[5]=
In[6]:=
ListPlot[{SID65, SIA}, PlotLabel -> "CIE Standard Illuminants", AxesLabel -> {"\[Lambda] (nm)", ""}, PlotLegends -> Placed[{"Illuminant D65", "Illuminant A"}, {{0.425, 0.99}, {1, 1}}
   ]]
Out[6]=

Analysis (1) 

Converting a visible spectrum to a color is a matter of integrating the spectrum with each of the three CIE observer functions to get the CIE XYZ coordinates. Mathematica can interpret these with XYZColor[]. It is important to normalize the integrals by the integrals of the observer functions. The resulting XYZ values will represent an irradiance that is probably very bright and would just look white, so we want to normalize the color itself by dividing by Y. As expected, the daylight is cool and the incandescent 'warm'.

In[7]:=
stdD65 = Interpolation[SID65];
stdA = Interpolation[SIA];
CIEX = Interpolation[CIE1964[[All, 1 ;; 2]]];
CIEY = Interpolation[CIE1964[[All, {1, 3}]]];
CIEZ = Interpolation[CIE1964[[All, {1, 4}]]];

Plot[{stdD65[w]/120, stdA[w]/120, CIEX[w], CIEY[w], CIEZ[w]}, {w, 380,
   780}, PlotTheme -> "Minimal", PlotLabel -> "Integrate Standard Illuminants to XYZ Color", PlotStyle -> {{Thickness[0.015], LightBlue}, {Thickness[0.015], LightOrange}, Red, Green, Blue}, ImageSize -> Large,
 PlotLegends -> Placed[{"Illuminant D65", "Illuminant A", "CIE 1964 \!\(\*OverscriptBox[\(x\), \(_\)]\)(\[Lambda])", "\!\(\*OverscriptBox[\(y\), \(_\)]\)(\[Lambda])", "\!\(\*OverscriptBox[\(z\), \(_\)]\)(\[Lambda])"}, {0.48, 0.75}],
 Epilog -> First[Plot[-0.05, {w, 380, 780}, ColorFunction -> (ColorData["VisibleSpectrum", "ColorFunction"][#] &), ColorFunctionScaling -> False, Filling -> Axis, FillingStyle -> Automatic  ]]]
Out[12]=
In[13]:=
NormCIE = NIntegrate[{ CIEX[w], CIEY[w], CIEZ[w]}, {w, 380, 780}];
XYZ = NIntegrate[{ stdD65[w]*CIEX[w], stdD65[w]*CIEY[w], stdD65[w]*CIEZ[w]}, {w, 380, 780}]/NormCIE;
ColorSID65 = XYZColor[XYZ/XYZ[[2]]];
XYZ = NIntegrate[{ stdA[w]*CIEX[w], stdA[w]*CIEY[w], stdA[w]*CIEZ[w]}, {w, 380, 780}]/NormCIE;
ColorSIA = XYZColor[XYZ/XYZ[[2]]];
Graphics[{ColorSID65, Rectangle[{-1.5, -1.5}, {1.5, 1.5}], ColorSIA, Disk[]}]
Out[14]=

Arnito Lappe, "Selected CIE Colorimetric Tables" from the Wolfram Data Repository (2021)  

Data Resource History

Source Metadata

Publisher Information