colour.colorimetry.tristimulus Module

Tristimulus Values

Defines objects for tristimulus values computation from spectral data.

colour.colorimetry.tristimulus.spectral_to_XYZ(spd, cmfs=<colour.colorimetry.cmfs.XYZ_ColourMatchingFunctions object>, illuminant=None)[source]

Converts given spectral power distribution to CIE XYZ tristimulus values using given colour matching functions and illuminant.

Parameters:
Returns:

CIE XYZ tristimulus values.

Return type:

ndarray, (3,)

Warning

The output domain of that definition is non standard!

Notes

  • Output CIE XYZ tristimulus values are in domain [0, 100].

References

[1]Wyszecki, G., & Stiles, W. S. (2000). Integration Replace by Summation. In Color Science: Concepts and Methods, Quantitative Data and Formulae (pp. 158–163). Wiley. ISBN:978-0471399186

Examples

>>> from colour import (
...     CMFS, ILLUMINANTS_RELATIVE_SPDS, SpectralPowerDistribution)
>>> cmfs = CMFS.get('CIE 1931 2 Degree Standard Observer')
>>> data = {380: 0.0600, 390: 0.0600}
>>> spd = SpectralPowerDistribution('Custom', data)
>>> illuminant = ILLUMINANTS_RELATIVE_SPDS.get('D50')
>>> spectral_to_XYZ(spd, cmfs, illuminant)  
array([  4.5764852...e-04,   1.2964866...e-05,   2.1615807...e-03])
colour.colorimetry.tristimulus.wavelength_to_XYZ(wavelength, cmfs=<colour.colorimetry.cmfs.XYZ_ColourMatchingFunctions object>, method=None)[source]

Converts given wavelength \(\lambda\) to CIE XYZ tristimulus values using given colour matching functions.

If the wavelength \(\lambda\) is not available in the colour matching function, its value will be calculated using CIE recommendations: The method developed by Sprague (1880) should be used for interpolating functions having a uniformly spaced independent variable and a Cubic Spline method for non-uniformly spaced independent variable.

Parameters:
  • wavelength (numeric or array_like) – Wavelength \(\lambda\) in nm.
  • cmfs (XYZ_ColourMatchingFunctions, optional) – Standard observer colour matching functions.
  • method (unicode, optional) – {None, ‘Cubic Spline’, ‘Linear’, ‘Pchip’, ‘Sprague’}, Enforce given interpolation method.
Returns:

CIE XYZ tristimulus values.

Return type:

ndarray

Raises:
  • RuntimeError – If Sprague (1880) interpolation method is forced with a non-uniformly spaced independent variable.
  • ValueError – If the interpolation method is not defined or if wavelength \(\lambda\) is not contained in the colour matching functions domain.

Notes

  • Output CIE XYZ tristimulus values are in domain [0, 1].
  • If scipy is not unavailable the Cubic Spline method will fallback to legacy Linear interpolation.
  • Sprague (1880) interpolator cannot be used for interpolating functions having a non-uniformly spaced independent variable.

Warning

  • If scipy is not unavailable the Cubic Spline method will fallback to legacy Linear interpolation.
  • Cubic Spline interpolator requires at least 3 wavelengths \(\lambda_n\) for interpolation.
  • Linear interpolator requires at least 2 wavelengths \(\lambda_n\) for interpolation.
  • Pchip interpolator requires at least 2 wavelengths \(\lambda_n\) for interpolation.
  • Sprague (1880) interpolator requires at least 6 wavelengths \(\lambda_n\) for interpolation.

Examples

Uniform data is using Sprague (1880) interpolation by default:

>>> from colour import CMFS
>>> cmfs = CMFS.get('CIE 1931 2 Degree Standard Observer')
>>> wavelength_to_XYZ(480, cmfs)  
array([ 0.09564  ,  0.13902  ,  0.812950...])
>>> wavelength_to_XYZ(480.5, cmfs)  
array([ 0.0914287...,  0.1418350...,  0.7915726...])

Enforcing Cubic Spline interpolation:

>>> wavelength_to_XYZ(480.5, cmfs, 'Cubic Spline')  
array([ 0.0914288...,  0.1418351...,  0.7915729...])

Enforcing Linear interpolation:

>>> wavelength_to_XYZ(480.5, cmfs, 'Linear')  
array([ 0.0914697...,  0.1418482...,  0.7917337...])

Enforcing Pchip interpolation:

>>> wavelength_to_XYZ(480.5, cmfs, 'Pchip')  
array([ 0.0914280...,  0.1418341...,  0.7915711...])