colour.XYZ_to_sd#

colour.XYZ_to_sd(XYZ: ArrayLike, method: Literal['Gaussian', 'Jakob 2019', 'Mallett 2019', 'Meng 2015', 'Otsu 2018', 'Smits 1999'] | str = 'Meng 2015', **kwargs: Any) SpectralDistribution[source]#

Recover the spectral distribution of the specified CIE XYZ tristimulus values using the specified method.

Parameters:
Returns:

Recovered spectral distribution.

Return type:

colour.SpectralDistribution

Notes

Domain

Scale - Reference

Scale - 1

XYZ

1

1

  • Gaussian and Smits (1999) methods will internally convert specified CIE XYZ tristimulus values to RGB colourspace array assuming sRGB primaries and equal energy illuminant E.

References

[JH19], [MY19], [MSHD15], [OYH18], [Smi99]

Examples

Gaussian reflectance recovery:

>>> import numpy as np
>>> from colour import MSDS_CMFS, SDS_ILLUMINANTS, SpectralShape
>>> from colour.colorimetry import sd_to_XYZ_integration
>>> from colour.utilities import numpy_print_options
>>> XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
>>> cmfs = (
...     MSDS_CMFS["CIE 1931 2 Degree Standard Observer"]
...     .copy()
...     .align(SpectralShape(360, 780, 10))
... )
>>> illuminant = SDS_ILLUMINANTS["E"].copy().align(cmfs.shape)
>>> sd = XYZ_to_sd(XYZ, method="Gaussian").align(SpectralShape(360, 780, 10))
>>> with numpy_print_options(suppress=True):
...     sd
SpectralDistribution([[360.        ,   0.04502009],
                      [370.        ,   0.04501988],
                      [380.        ,   0.04501914],
                      [390.        ,   0.0450168 ],
                      [400.        ,   0.04500998],
                      [410.        ,   0.04499185],
                      [420.        ,   0.0449477 ],
                      [430.        ,   0.0448493 ],
                      [440.        ,   0.04464874],
                      [450.        ,   0.04427526],
                      [460.        ,   0.04364072],
                      [470.        ,   0.04265916],
                      [480.        ,   0.04128144],
                      [490.        ,   0.03953613],
                      [500.        ,   0.03755869],
                      [510.        ,   0.03558836],
                      [520.        ,   0.03392457],
                      [530.        ,   0.03287194],
                      [540.        ,   0.03279225],
                      [550.        ,   0.03461775],
                      [560.        ,   0.04157706],
                      [570.        ,   0.06103056],
                      [580.        ,   0.10398511],
                      [590.        ,   0.17707942],
                      [600.        ,   0.26899683],
                      [610.        ,   0.34699756],
                      [620.        ,   0.37718472],
                      [630.        ,   0.37785039],
                      [640.        ,   0.37824584],
                      [650.        ,   0.37846014],
                      [660.        ,   0.37856623],
                      [670.        ,   0.37861426],
                      [680.        ,   0.37863415],
                      [690.        ,   0.3786417 ],
                      [700.        ,   0.37864431],
                      [710.        ,   0.37864515],
                      [720.        ,   0.37864539],
                      [730.        ,   0.37864545],
                      [740.        ,   0.37864547],
                      [750.        ,   0.37864547],
                      [760.        ,   0.37864547],
                      [770.        ,   0.37864547],
                      [780.        ,   0.37864547]],
                     SpragueInterpolator,
                     {},
                     Extrapolator,
                     {'method': 'Constant', 'left': None, 'right': None})
>>> sd_to_XYZ_integration(sd, cmfs, illuminant) / 100
array([0.19324..., 0.11592..., 0.04332...])

Jakob and Hanika (2019) reflectance recovery:

>>> cmfs = (
...     MSDS_CMFS["CIE 1931 2 Degree Standard Observer"]
...     .copy()
...     .align(SpectralShape(360, 780, 10))
... )
>>> illuminant = SDS_ILLUMINANTS["D65"].copy().align(cmfs.shape)
>>> sd = XYZ_to_sd(XYZ, method="Jakob 2019", cmfs=cmfs, illuminant=illuminant)
>>> with numpy_print_options(suppress=True):
...     sd
SpectralDistribution([[360.        ,   0.4893773...],
                      [370.        ,   0.3258214...],
                      [380.        ,   0.2147792...],
                      [390.        ,   0.1482413...],
                      [400.        ,   0.1086169...],
                      [410.        ,   0.0841255...],
                      [420.        ,   0.0683114...],
                      [430.        ,   0.0577144...],
                      [440.        ,   0.0504267...],
                      [450.        ,   0.0453552...],
                      [460.        ,   0.0418520...],
                      [470.        ,   0.0395259...],
                      [480.        ,   0.0381430...],
                      [490.        ,   0.0375741...],
                      [500.        ,   0.0377685...],
                      [510.        ,   0.0387432...],
                      [520.        ,   0.0405871...],
                      [530.        ,   0.0434783...],
                      [540.        ,   0.0477225...],
                      [550.        ,   0.0538256...],
                      [560.        ,   0.0626314...],
                      [570.        ,   0.0755869...],
                      [580.        ,   0.0952675...],
                      [590.        ,   0.1264265...],
                      [600.        ,   0.1779272...],
                      [610.        ,   0.2649393...],
                      [620.        ,   0.4039779...],
                      [630.        ,   0.5832105...],
                      [640.        ,   0.7445440...],
                      [650.        ,   0.8499970...],
                      [660.        ,   0.9094792...],
                      [670.        ,   0.9425378...],
                      [680.        ,   0.9616376...],
                      [690.        ,   0.9732481...],
                      [700.        ,   0.9806562...],
                      [710.        ,   0.9855873...],
                      [720.        ,   0.9889903...],
                      [730.        ,   0.9914117...],
                      [740.        ,   0.9931801...],
                      [750.        ,   0.9945009...],
                      [760.        ,   0.9955066...],
                      [770.        ,   0.9962855...],
                      [780.        ,   0.9968976...]],
                     SpragueInterpolator,
                     {},
                     Extrapolator,
                     {'method': 'Constant', 'left': None, 'right': None})
>>> sd_to_XYZ_integration(sd, cmfs, illuminant) / 100
array([0.2066217..., 0.1220128..., 0.0513958...])

Mallett and Yuksel (2019) reflectance recovery:

>>> cmfs = (
...     MSDS_CMFS["CIE 1931 2 Degree Standard Observer"]
...     .copy()
...     .align(SPECTRAL_SHAPE_sRGB_MALLETT2019)
... )
>>> illuminant = SDS_ILLUMINANTS["D65"].copy().align(cmfs.shape)
>>> sd = XYZ_to_sd(XYZ, method="Mallett 2019")
>>> with numpy_print_options(suppress=True):
...     sd
SpectralDistribution([[380.        ,   0.1735531...],
                      [385.        ,   0.1720357...],
                      [390.        ,   0.1677721...],
                      [395.        ,   0.1576605...],
                      [400.        ,   0.1372829...],
                      [405.        ,   0.1170849...],
                      [410.        ,   0.0895694...],
                      [415.        ,   0.0706232...],
                      [420.        ,   0.0585765...],
                      [425.        ,   0.0523959...],
                      [430.        ,   0.0497598...],
                      [435.        ,   0.0476057...],
                      [440.        ,   0.0465079...],
                      [445.        ,   0.0460337...],
                      [450.        ,   0.0455839...],
                      [455.        ,   0.0452872...],
                      [460.        ,   0.0450981...],
                      [465.        ,   0.0448895...],
                      [470.        ,   0.0449257...],
                      [475.        ,   0.0448987...],
                      [480.        ,   0.0446834...],
                      [485.        ,   0.0441372...],
                      [490.        ,   0.0417137...],
                      [495.        ,   0.0373832...],
                      [500.        ,   0.0357657...],
                      [505.        ,   0.0348263...],
                      [510.        ,   0.0341953...],
                      [515.        ,   0.0337683...],
                      [520.        ,   0.0334979...],
                      [525.        ,   0.0332991...],
                      [530.        ,   0.0331909...],
                      [535.        ,   0.0332181...],
                      [540.        ,   0.0333387...],
                      [545.        ,   0.0334970...],
                      [550.        ,   0.0337381...],
                      [555.        ,   0.0341847...],
                      [560.        ,   0.0346447...],
                      [565.        ,   0.0353993...],
                      [570.        ,   0.0367367...],
                      [575.        ,   0.0392007...],
                      [580.        ,   0.0445902...],
                      [585.        ,   0.0625633...],
                      [590.        ,   0.2965381...],
                      [595.        ,   0.4215576...],
                      [600.        ,   0.4347139...],
                      [605.        ,   0.4385134...],
                      [610.        ,   0.4385184...],
                      [615.        ,   0.4385249...],
                      [620.        ,   0.4374694...],
                      [625.        ,   0.4384672...],
                      [630.        ,   0.4368251...],
                      [635.        ,   0.4340867...],
                      [640.        ,   0.4303219...],
                      [645.        ,   0.4243257...],
                      [650.        ,   0.4159482...],
                      [655.        ,   0.4057443...],
                      [660.        ,   0.3919874...],
                      [665.        ,   0.3742784...],
                      [670.        ,   0.3518421...],
                      [675.        ,   0.3240127...],
                      [680.        ,   0.2955145...],
                      [685.        ,   0.2625658...],
                      [690.        ,   0.2343423...],
                      [695.        ,   0.2174830...],
                      [700.        ,   0.2060461...],
                      [705.        ,   0.1977437...],
                      [710.        ,   0.1916846...],
                      [715.        ,   0.1861020...],
                      [720.        ,   0.1823908...],
                      [725.        ,   0.1807923...],
                      [730.        ,   0.1795571...],
                      [735.        ,   0.1785623...],
                      [740.        ,   0.1775758...],
                      [745.        ,   0.1771614...],
                      [750.        ,   0.1767431...],
                      [755.        ,   0.1764319...],
                      [760.        ,   0.1762597...],
                      [765.        ,   0.1762209...],
                      [770.        ,   0.1761803...],
                      [775.        ,   0.1761195...],
                      [780.        ,   0.1760763...]],
                     SpragueInterpolator,
                     {},
                     Extrapolator,
                     {'method': 'Constant', 'left': None, 'right': None})
>>> sd_to_XYZ_integration(sd, cmfs, illuminant) / 100
...
array([0.2065436..., 0.1219996..., 0.0513764...])

Meng (2015) reflectance recovery:

>>> cmfs = (
...     MSDS_CMFS["CIE 1931 2 Degree Standard Observer"]
...     .copy()
...     .align(SpectralShape(360, 780, 10))
... )
>>> illuminant = SDS_ILLUMINANTS["D65"].copy().align(cmfs.shape)
>>> sd = XYZ_to_sd(XYZ, method="Meng 2015", cmfs=cmfs, illuminant=illuminant)
>>> with numpy_print_options(suppress=True):
...     sd
SpectralDistribution([[ 360.        ,    0.0762005...],
                      [ 370.        ,    0.0761792...],
                      [ 380.        ,    0.0761363...],
                      [ 390.        ,    0.0761194...],
                      [ 400.        ,    0.0762539...],
                      [ 410.        ,    0.0761671...],
                      [ 420.        ,    0.0754649...],
                      [ 430.        ,    0.0731519...],
                      [ 440.        ,    0.0676701...],
                      [ 450.        ,    0.0577800...],
                      [ 460.        ,    0.0441993...],
                      [ 470.        ,    0.0285064...],
                      [ 480.        ,    0.0138728...],
                      [ 490.        ,    0.0033585...],
                      [ 500.        ,    0.       ...],
                      [ 510.        ,    0.       ...],
                      [ 520.        ,    0.       ...],
                      [ 530.        ,    0.       ...],
                      [ 540.        ,    0.0055767...],
                      [ 550.        ,    0.0317581...],
                      [ 560.        ,    0.0754491...],
                      [ 570.        ,    0.1314115...],
                      [ 580.        ,    0.1937649...],
                      [ 590.        ,    0.2559311...],
                      [ 600.        ,    0.3123173...],
                      [ 610.        ,    0.3584966...],
                      [ 620.        ,    0.3927335...],
                      [ 630.        ,    0.4159458...],
                      [ 640.        ,    0.4306660...],
                      [ 650.        ,    0.4391040...],
                      [ 660.        ,    0.4439497...],
                      [ 670.        ,    0.4463618...],
                      [ 680.        ,    0.4474625...],
                      [ 690.        ,    0.4479868...],
                      [ 700.        ,    0.4482116...],
                      [ 710.        ,    0.4482800...],
                      [ 720.        ,    0.4483472...],
                      [ 730.        ,    0.4484251...],
                      [ 740.        ,    0.4484633...],
                      [ 750.        ,    0.4485071...],
                      [ 760.        ,    0.4484969...],
                      [ 770.        ,    0.4484853...],
                      [ 780.        ,    0.4485134...]],
                     SpragueInterpolator,
                     {},
                     Extrapolator,
                     {'method': 'Constant', 'left': None, 'right': None})
>>> sd_to_XYZ_integration(sd, cmfs, illuminant) / 100
array([0.2065400..., 0.1219722..., 0.0513695...])

Otsu, Yamamoto and Hachisuka (2018) reflectance recovery:

>>> cmfs = (
...     MSDS_CMFS["CIE 1931 2 Degree Standard Observer"]
...     .copy()
...     .align(SPECTRAL_SHAPE_OTSU2018)
... )
>>> illuminant = SDS_ILLUMINANTS["D65"].copy().align(cmfs.shape)
>>> sd = XYZ_to_sd(XYZ, method="Otsu 2018", cmfs=cmfs, illuminant=illuminant)
>>> with numpy_print_options(suppress=True):
...     sd
SpectralDistribution([[380.        ,   0.0601939...],
                      [390.        ,   0.0568063...],
                      [400.        ,   0.0517429...],
                      [410.        ,   0.0495841...],
                      [420.        ,   0.0502007...],
                      [430.        ,   0.0506489...],
                      [440.        ,   0.0510020...],
                      [450.        ,   0.0493782...],
                      [460.        ,   0.0468046...],
                      [470.        ,   0.0437132...],
                      [480.        ,   0.0416957...],
                      [490.        ,   0.0403783...],
                      [500.        ,   0.0405197...],
                      [510.        ,   0.0406031...],
                      [520.        ,   0.0416912...],
                      [530.        ,   0.0430956...],
                      [540.        ,   0.0444474...],
                      [550.        ,   0.0459336...],
                      [560.        ,   0.0507631...],
                      [570.        ,   0.0628967...],
                      [580.        ,   0.0844661...],
                      [590.        ,   0.1334277...],
                      [600.        ,   0.2262428...],
                      [610.        ,   0.3599330...],
                      [620.        ,   0.4885571...],
                      [630.        ,   0.5752546...],
                      [640.        ,   0.6193023...],
                      [650.        ,   0.6450744...],
                      [660.        ,   0.6610548...],
                      [670.        ,   0.6688673...],
                      [680.        ,   0.6795426...],
                      [690.        ,   0.6887933...],
                      [700.        ,   0.7003469...],
                      [710.        ,   0.7084128...],
                      [720.        ,   0.7154674...],
                      [730.        ,   0.7234334...]],
                     SpragueInterpolator,
                     {},
                     Extrapolator,
                     {'method': 'Constant', 'left': None, 'right': None})
>>> sd_to_XYZ_integration(sd, cmfs, illuminant) / 100
array([0.2065494..., 0.1219712..., 0.0514002...])

Smits (1999) reflectance recovery:

>>> cmfs = (
...     MSDS_CMFS["CIE 1931 2 Degree Standard Observer"]
...     .copy()
...     .align(SpectralShape(360, 780, 10))
... )
>>> illuminant = SDS_ILLUMINANTS["E"].copy().align(cmfs.shape)
>>> sd = XYZ_to_sd(XYZ, method="Smits 1999")
>>> with numpy_print_options(suppress=True):
...     sd
SpectralDistribution([[380.        ,   0.0787830...],
                      [417.7778    ,   0.0622018...],
                      [455.5556    ,   0.0446206...],
                      [493.3333    ,   0.0352220...],
                      [531.1111    ,   0.0324149...],
                      [568.8889    ,   0.0330105...],
                      [606.6667    ,   0.3207115...],
                      [644.4444    ,   0.3836164...],
                      [682.2222    ,   0.3836164...],
                      [720.        ,   0.3835649...]],
                     LinearInterpolator,
                     {},
                     Extrapolator,
                     {'method': 'Constant', 'left': None, 'right': None})
>>> sd_to_XYZ_integration(sd, cmfs, illuminant) / 100
array([0.1894770..., 0.1126470..., 0.0474420...])