Processing math: 100%

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 at 0x2abef8d86c10>, illuminant=None)[source]

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

Parameters:
  • spd (SpectralPowerDistribution) – Spectral power distribution.
  • cmfs (XYZ_ColourMatchingFunctions) – Standard observer colour matching functions.
  • illuminant (SpectralPowerDistribution, optional) – Illuminant spectral power distribution.
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 at 0x2abef8d86c10>, method=None)[source]

Converts given wavelength λ to CIE XYZ tristimulus values using given colour matching functions.

If the wavelength λ 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 λ 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 λ 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 λn for interpolation.
  • Linear interpolator requires at least 2 wavelengths λn for interpolation.
  • Pchip interpolator requires at least 2 wavelengths λn for interpolation.
  • Sprague (1880) interpolator requires at least 6 wavelengths λ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...])