colour-science 0.4.7
Colour Science for Python
License: BSD-3-Clause
Requires Python: <3.15,>=3.11
Keywords: color, color-science, color-space, color-spaces, colorspace, colorspaces, colour, colour-science, colour-space, colour-spaces, colourspace, colourspaces, data, dataset, datasets, python, spectral-data, spectral-dataset, spectral-datasets

..  image:: https://raw.githubusercontent.com/colour-science/colour-branding/master/images/Colour_Logo_001.png


|

.. start-badges

|NumFOCUS| |actions| |coveralls| |codacy| |version| |zenodo|

.. |NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat-square&colorA=E1523D&colorB=007D8A
    :target: http://numfocus.org
    :alt: Powered by NumFOCUS
.. |actions| image:: https://img.shields.io/github/actions/workflow/status/colour-science/colour/.github/workflows/continuous-integration-quality-unit-tests.yml?branch=develop&style=flat-square
    :target: https://github.com/colour-science/colour/actions
    :alt: Develop Build Status
.. |coveralls| image:: http://img.shields.io/coveralls/colour-science/colour/develop.svg?style=flat-square
    :target: https://coveralls.io/r/colour-science/colour
    :alt: Coverage Status
.. |codacy| image:: https://img.shields.io/codacy/grade/1f3b8d3bba7440ba9ebc1170589628b1/develop.svg?style=flat-square
    :target: https://app.codacy.com/gh/colour-science/colour
    :alt: Code Grade
.. |version| image:: https://img.shields.io/pypi/v/colour-science.svg?style=flat-square
    :target: https://pypi.org/project/colour-science
    :alt: Package Version
.. |zenodo| image:: https://img.shields.io/badge/DOI-10.5281/zenodo.17837391-blue.svg?style=flat-square
    :target: https://dx.doi.org/10.5281/zenodo.17837391
    :alt: DOI

.. end-badges

`Colour <https://github.com/colour-science/colour>`__ is an open-source
`Python <https://www.python.org>`__ package providing a comprehensive number
of algorithms and datasets for colour science.

It is freely available under the
`BSD-3-Clause <https://opensource.org/licenses/BSD-3-Clause>`__ terms.

**Colour** is an affiliated project of `NumFOCUS <https://numfocus.org>`__, a
501(c)(3) nonprofit in the United States.

.. contents:: **Table of Contents**
    :backlinks: none
    :depth: 2

.. sectnum::

Draft Release Notes
-------------------

The draft release notes of the
`develop <https://github.com/colour-science/colour/tree/develop>`__
branch are available at this
`url <https://gist.github.com/KelSolaar/4a6ebe9ec3d389f0934b154fec8df51d>`__.

Sponsors
--------

We are grateful 💖 for the support of our
`sponsors <https://github.com/colour-science/colour/blob/develop/SPONSORS.rst>`__.
If you'd like to join them, please consider
`becoming a sponsor on OpenCollective <https://opencollective.com/colour-science>`__.



Features
--------

Most of the objects are available from the ``colour`` namespace:

.. code-block:: python

    import colour

Automatic Colour Conversion Graph - ``colour.graph``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

..  image:: https://colour.readthedocs.io/en/develop/_static/Examples_Colour_Automatic_Conversion_Graph.png

.. code-block:: python

    import colour

    sd = colour.SDS_COLOURCHECKERS["ColorChecker N Ohta"]["dark skin"]
    colour.convert(sd, "Spectral Distribution", "sRGB", verbose={"mode": "Short"})

.. code-block:: text

    ===============================================================================
    *                                                                             *
    *   [ Conversion Path ]                                                       *
    *                                                                             *
    *   "sd_to_XYZ" --> "XYZ_to_sRGB"                                             *
    *                                                                             *
    ===============================================================================
    [ 0.49034776  0.30185875  0.23587685]

.. code-block:: python

    import colour

    sd = colour.SDS_COLOURCHECKERS["ColorChecker N Ohta"]["dark skin"]
    illuminant = colour.SDS_ILLUMINANTS["FL2"]
    colour.convert(
        sd,
        "Spectral Distribution",
        "sRGB",
        sd_to_XYZ={"illuminant": illuminant},
    )

.. code-block:: text

    [ 0.47924575  0.31676968  0.17362725]

Chromatic Adaptation - ``colour.adaptation``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

    import colour

    XYZ = [0.20654008, 0.12197225, 0.05136952]
    D65 = colour.CCS_ILLUMINANTS["CIE 1931 2 Degree Standard Observer"]["D65"]
    A = colour.CCS_ILLUMINANTS["CIE 1931 2 Degree Standard Observer"]["A"]
    colour.chromatic_adaptation(XYZ, colour.xy_to_XYZ(D65), colour.xy_to_XYZ(A))

.. code-block:: text

    [ 0.25331034  0.13765286  0.01543185]

.. code-block:: python

    import colour

    sorted(colour.CHROMATIC_ADAPTATION_METHODS)

.. code-block:: text

    ['CIE 1994', 'CMCCAT2000', 'Fairchild 1990', 'Li 2025', 'Von Kries', 'Zhai 2018', 'vK20']

Algebra - ``colour.algebra``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Kernel Interpolation
********************

.. code-block:: python

    import colour

    y = [5.9200, 9.3700, 10.8135, 4.5100, 69.5900, 27.8007, 86.0500]
    x = range(len(y))
    colour.KernelInterpolator(x, y)([0.25, 0.75, 5.50])

.. code-block:: text

    [  6.18062083   8.08238488  57.85783403]

Sprague (1880) Interpolation
****************************

.. code-block:: python

    import colour

    y = [5.9200, 9.3700, 10.8135, 4.5100, 69.5900, 27.8007, 86.0500]
    x = range(len(y))
    colour.SpragueInterpolator(x, y)([0.25, 0.75, 5.50])

.. code-block:: text

    [  6.72951612   7.81406251  43.77379185]

Colour Appearance Models - ``colour.appearance``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_CIECAM02(XYZ, XYZ_w, L_A, Y_b)

.. code-block:: text

    CAM_Specification_CIECAM02(J=34.434525727858997, C=67.365010921125915, h=22.279164147957076, s=62.814855853327131, Q=177.47124941102123, M=70.024939419291385, H=2.689608534423904, HC=None)

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_CIECAM16(XYZ, XYZ_w, L_A, Y_b)

.. code-block:: text

    CAM_Specification_CIECAM16(J=33.880368498111686, C=69.444353357408033, h=19.510887327451748, s=64.03612114840314, Q=176.03752758512178, M=72.18638534116765, H=399.52975599115319, HC=None)

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_CAM16(XYZ, XYZ_w, L_A, Y_b)

.. code-block:: text

    CAM_Specification_CAM16(J=33.880368498111686, C=69.444353357408033, h=19.510887327451748, s=64.03612114840314, Q=176.03752758512178, M=72.18638534116765, H=399.52975599115319, HC=None)

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_Hellwig2022(XYZ, XYZ_w, L_A, Y_b)

.. code-block:: text

    CAM_Specification_Hellwig2022(J=33.880368498111686, C=37.579419116276348, h=19.510887327451748, s=109.33343382561695, Q=45.34489577734751, M=49.577131618021212, H=399.52975599115319, HC=None, J_HK=39.41741758094139, Q_HK=52.755585941150315)

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_Kim2009(XYZ, XYZ_w, L_A)

.. code-block:: text

    CAM_Specification_Kim2009(J=19.879918542450937, C=55.83905525087696, h=22.013388165090031, s=112.9797935493912, Q=36.309026130161513, M=46.346415858227871, H=2.3543198369639753, HC=None)

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_sCAM(XYZ, XYZ_w, L_A, Y_b)

.. code-block:: text

    CAM_Specification_sCAM(J=42.550992142462782, C=40.419439198593302, h=20.904455433026421, Q=175.74578999778015, M=14.325369984981474, H=7.1106008503613021, HC=None, V=81.92545469934403, K=18.07454530065597, W=0.023675944970833029, D=99.976324055029167)

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_ZCAM(XYZ, XYZ_w, L_A, Y_b)

.. code-block:: text

    CAM_Specification_ZCAM(J=38.347186278956357, C=21.121389892085183, h=33.711578931095183, s=81.444585609489536, Q=76.986725284523772, M=42.403805833900513, H=0.45779200212217158, HC=None, V=43.623590687423551, K=43.20894953152817, W=34.829588380192149)

Colour Blindness - ``colour.blindness``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

    import colour

    cmfs = colour.colorimetry.MSDS_CMFS_LMS["Stockman & Sharpe 2 Degree Cone Fundamentals"]
    colour.msds_cmfs_anomalous_trichromacy_Machado2009(cmfs, [15, 0, 0])[450]

.. code-block:: text

    [ 0.08912884  0.0870524   0.955393  ]

.. code-block:: python

    import colour

    cmfs = colour.colorimetry.MSDS_CMFS_LMS["Stockman & Sharpe 2 Degree Cone Fundamentals"]
    primaries = colour.MSDS_DISPLAY_PRIMARIES["Apple Studio Display"]
    d_LMS = (15, 0, 0)
    colour.matrix_anomalous_trichromacy_Machado2009(cmfs, primaries, d_LMS)

.. code-block:: text

    [[-0.27774652  2.65150084 -1.37375432]
     [ 0.27189369  0.20047862  0.52762768]
     [ 0.00644047  0.25921579  0.73434374]]

Colour Correction - ``colour characterisation``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

    import colour
    import numpy as np

    RGB = [0.17224810, 0.09170660, 0.06416938]
    M_T = np.random.random((24, 3))
    M_R = M_T + (np.random.random((24, 3)) - 0.5) * 0.5
    colour.colour_correction(RGB, M_T, M_R)

.. code-block:: text

    [ 0.17960686  0.08935744  0.06766639]  # (results will vary due to random inputs)

.. code-block:: python

    import colour

    sorted(colour.COLOUR_CORRECTION_METHODS)

.. code-block:: text

    ['Cheung 2004', 'Finlayson 2015', 'Vandermonde']

ACES Input Transform - ``colour characterisation``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

    import colour

    sensitivities = colour.MSDS_CAMERA_SENSITIVITIES["Nikon 5100 (NPL)"]
    illuminant = colour.SDS_ILLUMINANTS["D55"]
    colour.matrix_idt(sensitivities, illuminant)

.. code-block:: text

    (array([[ 0.59368175,  0.30418373,  0.10213451],
           [ 0.0045798 ,  1.14946005, -0.15403985],
           [ 0.03552214, -0.16312291,  1.12760078]]), array([ 1.58214188,  1.        ,  1.28910346]))

Colorimetry - ``colour.colorimetry``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Spectral Computations
*********************

.. code-block:: python

    import colour

    colour.sd_to_XYZ(colour.SDS_LIGHT_SOURCES["Neodimium Incandescent"])

.. code-block:: text

    [ 36.94726204  32.62076174  13.0143849 ]

.. code-block:: python

    import colour

    sorted(colour.SD_TO_XYZ_METHODS)

.. code-block:: text

    ['ASTM E308', 'Integration', 'astm2015']

Multi-Spectral Computations
***************************

.. code-block:: python

    import colour

    msds = [
        [
            [
                0.01367208,
                0.09127947,
                0.01524376,
                0.02810712,
                0.19176012,
                0.04299992,
            ],
            [
                0.00959792,
                0.25822842,
                0.41388571,
                0.22275120,
                0.00407416,
                0.37439537,
            ],
            [
                0.01791409,
                0.29707789,
                0.56295109,
                0.23752193,
                0.00236515,
                0.58190280,
            ],
        ],
        [
            [
                0.01492332,
                0.10421912,
                0.02240025,
                0.03735409,
                0.57663846,
                0.32416266,
            ],
            [
                0.04180972,
                0.26402685,
                0.03572137,
                0.00413520,
                0.41808194,
                0.24696727,
            ],
            [
                0.00628672,
                0.11454948,
                0.02198825,
                0.39906919,
                0.63640803,
                0.01139849,
            ],
        ],
        [
            [
                0.04325933,
                0.26825359,
                0.23732357,
                0.05175860,
                0.01181048,
                0.08233768,
            ],
            [
                0.02484169,
                0.12027161,
                0.00541695,
                0.00654612,
                0.18603799,
                0.36247808,
            ],
            [
                0.03102159,
                0.16815442,
                0.37186235,
                0.08610666,
                0.00413520,
                0.78492409,
            ],
        ],
        [
            [
                0.11682307,
                0.78883040,
                0.74468607,
                0.83375293,
                0.90571451,
                0.70054168,
            ],
            [
                0.06321812,
                0.41898224,
                0.15190357,
                0.24591440,
                0.55301750,
                0.00657664,
            ],
            [
                0.00305180,
                0.11288624,
                0.11357290,
                0.12924391,
                0.00195315,
                0.21771573,
            ],
        ],
    ]

    colour.msds_to_XYZ(
        msds,
        method="Integration",
        shape=colour.SpectralShape(400, 700, 60),
    )

.. code-block:: text

    [[[  7.68544647   4.09414317   8.49324254]
      [ 17.12567298  27.77681821  25.52573685]
      [ 19.10280411  34.45851476  29.76319628]]
     [[ 18.03375827   8.62340812   9.71702574]
      [ 15.03110867   6.54001068  24.53208465]
      [ 37.68269495  26.4411103   10.66361816]]
     [[  8.09532373  12.75333339  25.79613956]
      [  7.09620297   2.79257389  11.15039854]
      [  8.933163    19.39985815  17.14915636]]
     [[ 80.00969553  80.39810464  76.08184429]
      [ 33.27611427  24.38947838  39.34919287]
      [  8.89425686  11.05185138  10.86767594]]]

.. code-block:: python

    import colour

    sorted(colour.MSDS_TO_XYZ_METHODS)

.. code-block:: text

    ['ASTM E308', 'Integration', 'astm2015']

Blackbody Spectral Radiance Computation
***************************************

.. code-block:: python

    import colour

    colour.sd_blackbody(5000)

.. code-block:: text

    [[   360.           6654.27827064]
     [   361.           6709.60527925]
     [   362.           6764.82512152]
     ...
     [   780.          10573.85196369]]

Dominant, Complementary Wavelength & Colour Purity Computation
**************************************************************

.. code-block:: python

    import colour

    xy = [0.54369557, 0.32107944]
    xy_n = [0.31270000, 0.32900000]
    colour.dominant_wavelength(xy, xy_n)

.. code-block:: text

    (array(616.0), array([ 0.68354746,  0.31628409]), array([ 0.68354746,  0.31628409]))

Lightness Computation
*********************

.. code-block:: python

    import colour

    colour.lightness(12.19722535)

.. code-block:: text

    41.5278758447

.. code-block:: python

    import colour

    sorted(colour.LIGHTNESS_METHODS)

.. code-block:: text

    ['Abebe 2017', 'CIE 1976', 'Fairchild 2010', 'Fairchild 2011', 'Glasser 1958', 'Lstar1976', 'Wyszecki 1963']

Luminance Computation
*********************

.. code-block:: python

    import colour

    colour.luminance(41.52787585)

.. code-block:: text

    12.1972253534

.. code-block:: python

    import colour

    sorted(colour.LUMINANCE_METHODS)

.. code-block:: text

    ['ASTM D1535', 'Abebe 2017', 'CIE 1976', 'Fairchild 2010', 'Fairchild 2011', 'Newhall 1943', 'astm2008', 'cie1976']

Whiteness Computation
*********************

.. code-block:: python

    import colour

    XYZ = [95.00000000, 100.00000000, 105.00000000]
    XYZ_0 = [94.80966767, 100.00000000, 107.30513595]
    colour.whiteness(XYZ, XYZ_0)

.. code-block:: text

    [ 93.756       -1.33000001]

.. code-block:: python

    import colour

    sorted(colour.WHITENESS_METHODS)

.. code-block:: text

    ['ASTM E313', 'Berger 1959', 'CIE 2004', 'Ganz 1979', 'Stensby 1968', 'Taube 1960', 'cie2004']

Yellowness Computation
**********************

.. code-block:: python

    import colour

    XYZ = [95.00000000, 100.00000000, 105.00000000]
    colour.yellowness(XYZ)

.. code-block:: text

    4.34

.. code-block:: python

    import colour

    sorted(colour.YELLOWNESS_METHODS)

.. code-block:: text

    ['ASTM D1925', 'ASTM E313', 'ASTM E313 Alternative']

Luminous Flux, Efficiency & Efficacy Computation
************************************************

.. code-block:: python

    import colour

    sd = colour.SDS_LIGHT_SOURCES["Neodimium Incandescent"]
    colour.luminous_flux(sd)

.. code-block:: text

    23807.6555274

.. code-block:: python

    import colour

    sd = colour.SDS_LIGHT_SOURCES["Neodimium Incandescent"]
    colour.luminous_efficiency(sd)

.. code-block:: text

    0.199439356245

.. code-block:: python

    import colour

    sd = colour.SDS_LIGHT_SOURCES["Neodimium Incandescent"]
    colour.luminous_efficacy(sd)

.. code-block:: text

    136.217080315

Contrast Sensitivity Function - ``colour.contrast``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

    import colour

    colour.contrast_sensitivity_function(u=4, X_0=60, E=65)

.. code-block:: text

    358.511807899

.. code-block:: python

    import colour

    sorted(colour.CONTRAST_SENSITIVITY_METHODS)

.. code-block:: text

    ['Barten 1999']

Colour Difference - ``colour.difference``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

    import colour

    Lab_1 = [100.00000000, 21.57210357, 272.22819350]
    Lab_2 = [100.00000000, 426.67945353, 72.39590835]
    colour.delta_E(Lab_1, Lab_2)

.. code-block:: text

    94.0356490267

.. code-block:: python

    import colour

    sorted(colour.DELTA_E_METHODS)

.. code-block:: text

    ['CAM02-LCD', 'CAM02-SCD', 'CAM02-UCS', 'CAM16-LCD', 'CAM16-SCD', 'CAM16-UCS', 'CIE 1976', 'CIE 1994', 'CIE 2000', 'CMC', 'DIN99', 'HyAB', 'HyCH', 'ITP', 'cie1976', 'cie1994', 'cie2000']

IO - ``colour.io``
~~~~~~~~~~~~~~~~~~

Images
******

.. code-block:: python

    import colour

    RGB = colour.read_image("Ishihara_Colour_Blindness_Test_Plate_3.png")
    RGB.shape

.. code-block:: text

    (276, 281, 3)

Spectral Images - Fichet et al. (2021)
**************************************

.. code-block:: python

    import colour

    components = colour.read_spectral_image_Fichet2021("Polarised.exr")
    list(components.keys())

.. code-block:: text

    ['S0', 'S1', 'S2', 'S3']

Look Up Table (LUT) Data
************************

.. code-block:: python

    import colour

    LUT = colour.read_LUT("ACES_Proxy_10_to_ACES.cube")
    print(LUT)

.. code-block:: text

    LUT3x1D - ACES Proxy 10 to ACES
    -------------------------------
    Dimensions : 2
    Domain     : [[0 0 0]
                  [1 1 1]]
    Size       : (32, 3)

.. code-block:: python

    import colour

    RGB = [0.17224810, 0.09170660, 0.06416938]
    LUT.apply(RGB)

.. code-block:: text

    [ 0.00575674,  0.00181493,  0.00121419]

Colour Models - ``colour.models``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CIE xyY Colourspace
*******************

.. code-block:: python

    import colour

    colour.XYZ_to_xyY([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.54369557  0.32107944  0.12197225]

CIE L*a*b* Colourspace
**********************

.. code-block:: python

    import colour

    colour.XYZ_to_Lab([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 41.52787529  52.63858304  26.92317922]

CIE L*u*v* Colourspace
**********************

.. code-block:: python

    import colour

    colour.XYZ_to_Luv([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 41.52787529  96.83626054  17.75210149]

CIE 1960 UCS Colourspace
************************

.. code-block:: python

    import colour

    colour.XYZ_to_UCS([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.13769339  0.12197225  0.1053731 ]

CIE 1964 U*V*W* Colourspace
***************************

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    colour.XYZ_to_UVW(XYZ)

.. code-block:: text

    [ 94.55035725  11.55536523  40.54757405]

CAM02-LCD, CAM02-SCD, and CAM02-UCS Colourspaces - Luo, Cui and Li (2006)
*************************************************************************

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    surround = colour.VIEWING_CONDITIONS_CIECAM02["Average"]
    specification = colour.XYZ_to_CIECAM02(XYZ, XYZ_w, L_A, Y_b, surround)
    JMh = [specification.J, specification.M, specification.h]
    colour.JMh_CIECAM02_to_CAM02UCS(JMh)

.. code-block:: text

    [ 47.16899898  38.72623785  15.8663383 ]

.. code-block:: python

    import colour

    XYZ = [0.20654008, 0.12197225, 0.05136952]
    XYZ_w = [95.05 / 100, 100.00 / 100, 108.88 / 100]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_CAM02UCS(XYZ, XYZ_w=XYZ_w, L_A=L_A, Y_b=Y_b)

.. code-block:: text

    [ 47.16899898  38.72623785  15.8663383 ]

CAM16-LCD, CAM16-SCD, and CAM16-UCS Colourspaces - Li et al. (2017)
*******************************************************************

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    XYZ_w = [95.05, 100.00, 108.88]
    L_A = 318.31
    Y_b = 20.0
    surround = colour.VIEWING_CONDITIONS_CAM16["Average"]
    specification = colour.XYZ_to_CAM16(XYZ, XYZ_w, L_A, Y_b, surround)
    JMh = [specification.J, specification.M, specification.h]
    colour.JMh_CAM16_to_CAM16UCS(JMh)

.. code-block:: text

    [ 46.55542238  40.22460974  14.25288392]

.. code-block:: python

    import colour

    XYZ = [0.20654008, 0.12197225, 0.05136952]
    XYZ_w = [95.05 / 100, 100.00 / 100, 108.88 / 100]
    L_A = 318.31
    Y_b = 20.0
    colour.XYZ_to_CAM16UCS(XYZ, XYZ_w=XYZ_w, L_A=L_A, Y_b=Y_b)

.. code-block:: text

    [ 46.55542238  40.22460974  14.25288392]

DIN99 Colourspace and DIN99b, DIN99c, DIN99d Refined Formulas
*************************************************************

.. code-block:: python

    import colour

    Lab = [41.52787529, 52.63858304, 26.92317922]
    colour.Lab_to_DIN99(Lab)

.. code-block:: text

    [ 53.22821988  28.41634656   3.89839552]

ICaCb Colourspace
******************

.. code-block:: python

    import colour

    colour.XYZ_to_ICaCb([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.06875297  0.05753352  0.02081548]

IgPgTg Colourspace
******************

.. code-block:: python

    import colour

    colour.XYZ_to_IgPgTg([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.42421258  0.18632491  0.10689223]

IPT Colourspace
***************

.. code-block:: python

    import colour

    colour.XYZ_to_IPT([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.38426191  0.38487306  0.18886838]

Jzazbz Colourspace
******************

.. code-block:: python

    import colour

    colour.XYZ_to_Jzazbz([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.00535048  0.00924302  0.00526007]

Hunter L,a,b Colour Scale
*************************

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    colour.XYZ_to_Hunter_Lab(XYZ)

.. code-block:: text

    [ 34.92452577  47.06189858  14.38615107]

Hunter Rd,a,b Colour Scale
**************************

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    colour.XYZ_to_Hunter_Rdab(XYZ)

.. code-block:: text

    [ 12.197225    57.12537874  17.46241341]

Oklab Colourspace
*****************

.. code-block:: python

    import colour

    colour.XYZ_to_Oklab([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.51634019  0.154695    0.06289579]

OSA UCS Colourspace
*******************

.. code-block:: python

    import colour

    XYZ = [0.20654008 * 100, 0.12197225 * 100, 0.05136952 * 100]
    colour.XYZ_to_OSA_UCS(XYZ)

.. code-block:: text

    [-3.0049979   2.99713697 -9.66784231]

ProLab Colourspace
******************

.. code-block:: python

    import colour

    colour.XYZ_to_ProLab([0.51634019, 0.15469500, 0.06289579])

.. code-block:: text

    [  59.8466286   115.0396354    20.12510352]

Ragoo and Farup (2021) Optimised IPT Colourspace
************************************************

.. code-block:: python

    import colour

    colour.XYZ_to_IPT_Ragoo2021([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.42248243  0.2910514   0.20410663]

Yrg Colourspace - Kirk (2019)
*****************************

.. code-block:: python

    import colour

    colour.XYZ_to_Yrg([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 0.13137801  0.49037645  0.37777388]

hdr-CIELAB Colourspace
**********************

.. code-block:: python

    import colour

    colour.XYZ_to_hdr_CIELab([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 51.87002062  60.4763385  32.14551912]

hdr-IPT Colourspace
*******************

.. code-block:: python

    import colour

    colour.XYZ_to_hdr_IPT([0.20654008, 0.12197225, 0.05136952])

.. code-block:: text

    [ 25.18261761 -22.62111297  3.18511729]

Y'CbCr Colour Encoding
**********************

.. code-block:: python

    import colour

    colour.RGB_to_YCbCr([1.0, 1.0, 1.0])

.. code-block:: text

    [ 0.92156863  0.50196078  0.50196078]

YCoCg Colour Encoding
*********************

.. code-block:: python

    import colour

    colour.RGB_to_YCoCg([0.75, 0.75, 0.0])

.. code-block:: text

    [ 0.5625  0.375   0.1875]

ICtCp Colour Encoding
*********************

.. code-block:: python

    import colour

    colour.RGB_to_ICtCp([0.45620519, 0.03081071, 0.04091952])

.. code-block:: text

    [ 0.07351364  0.00475253  0.09351596]

HSV Colourspace
***************

.. code-block:: python

    import colour

    colour.RGB_to_HSV([0.45620519, 0.03081071, 0.04091952])

.. code-block:: text

    [ 0.99603944  0.93246304  0.45620519]

IHLS Colourspace
****************

.. code-block:: python

    import colour

    colour.RGB_to_IHLS([0.45620519, 0.03081071, 0.04091952])

.. code-block:: text

    [ 6.26236117  0.12197943  0.42539448]

Prismatic Colourspace
*********************

.. code-block:: python

    import colour

    colour.RGB_to_Prismatic([0.25, 0.50, 0.75])

.. code-block:: text

    [ 0.75        0.16666667  0.33333333  0.5       ]

RGB Colourspace and Transformations
***********************************

.. code-block:: python

    import colour

    XYZ = [0.21638819, 0.12570000, 0.03847493]
    illuminant_XYZ = [0.34570, 0.35850]
    illuminant_RGB = [0.31270, 0.32900]
    chromatic_adaptation_transform = "Bradford"
    matrix_XYZ_to_RGB = [
        [3.24062548, -1.53720797, -0.49862860],
        [-0.96893071, 1.87575606, 0.04151752],
        [0.05571012, -0.20402105, 1.05699594],
    ]
    colour.XYZ_to_RGB(
        XYZ,
        illuminant_XYZ,
        illuminant_RGB,
        matrix_XYZ_to_RGB,
        chromatic_adaptation_transform,
    )

.. code-block:: text

    [ 0.45595571  0.03039702  0.04087245]

RGB Colourspace Derivation
**************************

.. code-block:: python

    import colour

    p = [0.73470, 0.26530, 0.00000, 1.00000, 0.00010, -0.07700]
    w = [0.32168, 0.33767]
    colour.normalised_primary_matrix(p, w)

.. code-block:: text

    [[  9.52552396e-01   0.00000000e+00   9.36786317e-05]
     [  3.43966450e-01   7.28166097e-01  -7.21325464e-02]
     [  0.00000000e+00   0.00000000e+00   1.00882518e+00]]

RGB Colourspaces
****************

.. code-block:: python

    import colour

    sorted(colour.RGB_COLOURSPACES)

.. code-block:: text

    ['ACES2065-1', 'ACEScc', 'ACEScct', 'ACEScg', 'ACESproxy', 'ARRI Wide Gamut 3', 'ARRI Wide Gamut 4', 'Adobe RGB (1998)', 'Adobe Wide Gamut RGB', 'Apple RGB', 'Best RGB', 'Beta RGB', 'Blackmagic Wide Gamut', 'CIE RGB', 'CIE XYZ-D65 - Scene-referred', 'Cinema Gamut', 'ColorMatch RGB', 'DCDM XYZ', 'DCI-P3', 'DCI-P3-P', 'DJI D-Gamut', 'DRAGONcolor', 'DRAGONcolor2', 'DaVinci Wide Gamut', 'Display P3', 'Don RGB 4', 'EBU Tech. 3213-E', 'ECI RGB v2', 'ERIMM RGB', 'Ekta Space PS 5', 'F-Gamut', 'F-Gamut C', 'FilmLight E-Gamut', 'FilmLight E-Gamut 2', 'Gamma 1.8 Encoded Rec.709', 'Gamma 2.2 Encoded AP1', 'Gamma 2.2 Encoded AdobeRGB', 'Gamma 2.2 Encoded Rec.709', 'ITU-R BT.2020', 'ITU-R BT.470 - 525', 'ITU-R BT.470 - 625', 'ITU-R BT.709', 'ITU-T H.273 - 22 Unspecified', 'ITU-T H.273 - Generic Film', 'Linear AdobeRGB', 'Linear P3-D65', 'Linear Rec.2020', 'Linear Rec.709 (sRGB)', 'Max RGB', 'N-Gamut', 'NTSC (1953)', 'NTSC (1987)', 'P3-D65', 'PLASA ANSI E1.54', 'Pal/Secam', 'ProPhoto RGB', 'Protune Native', 'REDWideGamutRGB', 'REDcolor', 'REDcolor2', 'REDcolor3', 'REDcolor4', 'RIMM RGB', 'ROMM RGB', 'Russell RGB', 'S-Gamut', 'S-Gamut3', 'S-Gamut3.Cine', 'SMPTE 240M', 'SMPTE C', 'Sharp RGB', 'V-Gamut', 'Venice S-Gamut3', 'Venice S-Gamut3.Cine', 'Xtreme RGB', 'aces', 'adobe1998', 'g18_rec709_scene', 'g22_adobergb_scene', 'g22_ap1_scene', 'g22_rec709_scene', 'lin_adobergb_scene', 'lin_ap0_scene', 'lin_ap1_scene', 'lin_ciexyzd65_scene', 'lin_p3d65_scene', 'lin_rec2020_scene', 'lin_rec709_scene', 'prophoto', 'sRGB', 'sRGB Encoded AP1', 'sRGB Encoded P3-D65', 'sRGB Encoded Rec.709 (sRGB)', 'srgb_ap1_scene', 'srgb_p3d65_scene', 'srgb_rec709_scene']

OETFs
*****

.. code-block:: python

    import colour

    sorted(colour.OETFS)

.. code-block:: text

    ['ARIB STD-B67', 'Blackmagic Film Generation 5', 'DaVinci Intermediate', 'ITU-R BT.2020', 'ITU-R BT.2100 HLG', 'ITU-R BT.2100 PQ', 'ITU-R BT.601', 'ITU-R BT.709', 'ITU-T H.273 IEC 61966-2', 'ITU-T H.273 Log', 'ITU-T H.273 Log Sqrt', 'SMPTE 240M']

EOTFs
*****

.. code-block:: python

    import colour

    sorted(colour.EOTFS)

.. code-block:: text

    ['DCDM', 'DICOM GSDF', 'ITU-R BT.1886', 'ITU-R BT.2100 HLG', 'ITU-R BT.2100 PQ', 'ITU-T H.273 ST.428-1', 'SMPTE 240M', 'ST 2084', 'sRGB']

OOTFs
*****

.. code-block:: python

    import colour

    sorted(colour.OOTFS)

.. code-block:: text

    ['ITU-R BT.2100 HLG', 'ITU-R BT.2100 PQ']

Log Encoding / Decoding
***********************

.. code-block:: python

    import colour

    sorted(colour.LOG_ENCODINGS)

.. code-block:: text

    ['ACEScc', 'ACEScct', 'ACESproxy', 'ARRI LogC3', 'ARRI LogC4', 'Apple Log Profile', 'Canon Log', 'Canon Log 2', 'Canon Log 3', 'Cineon', 'D-Log', 'ERIMM RGB', 'F-Log', 'F-Log2', 'Filmic Pro 6', 'L-Log', 'Log2', 'Log3G10', 'Log3G12', 'Mi-Log', 'N-Log', 'PLog', 'Panalog', 'Protune', 'REDLog', 'REDLogFilm', 'S-Log', 'S-Log2', 'S-Log3', 'T-Log', 'V-Log', 'ViperLog']

CCTFs Encoding / Decoding
*************************

.. code-block:: python

    import colour

    sorted(colour.CCTF_ENCODINGS)

.. code-block:: text

    ['ACEScc', 'ACEScct', 'ACESproxy', 'ARIB STD-B67', 'ARRI LogC3', 'ARRI LogC4', 'Apple Log Profile', 'Blackmagic Film Generation 5', 'Canon Log', 'Canon Log 2', 'Canon Log 3', 'Cineon', 'D-Log', 'DCDM', 'DICOM GSDF', 'DaVinci Intermediate', 'ERIMM RGB', 'F-Log', 'F-Log2', 'Filmic Pro 6', 'Gamma 2.2', 'Gamma 2.4', 'Gamma 2.6', 'ITU-R BT.1886', 'ITU-R BT.2020', 'ITU-R BT.2100 HLG', 'ITU-R BT.2100 PQ', 'ITU-R BT.601', 'ITU-R BT.709', 'ITU-T H.273 IEC 61966-2', 'ITU-T H.273 Log', 'ITU-T H.273 Log Sqrt', 'ITU-T H.273 ST.428-1', 'L-Log', 'Log2', 'Log3G10', 'Log3G12', 'Mi-Log', 'N-Log', 'PLog', 'Panalog', 'ProPhoto RGB', 'Protune', 'REDLog', 'REDLogFilm', 'RIMM RGB', 'ROMM RGB', 'S-Log', 'S-Log2', 'S-Log3', 'SMPTE 240M', 'ST 2084', 'T-Log', 'V-Log', 'ViperLog', 'sRGB']

Recommendation ITU-T H.273 Code points for Video Signal Type Identification
***************************************************************************

.. code-block:: python

    import colour

    colour.COLOUR_PRIMARIES_ITUTH273.keys()

.. code-block:: text

    dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 22, 23])

.. code-block:: python

    import colour

    colour.models.describe_video_signal_colour_primaries(1)

.. code-block:: text

    ===============================================================================
    *                                                                             *
    *   Colour Primaries: 1                                                       *
    *   -------------------                                                       *
    *                                                                             *
    *   Primaries        : [[ 0.64  0.33]                                         *
    *                       [ 0.3   0.6 ]                                         *
    *                       [ 0.15  0.06]]                                        *
    *   Whitepoint       : [ 0.3127  0.329 ]                                      *
    *   Whitepoint Name  : D65                                                    *
    *   NPM              : [[ 0.4123908   0.35758434  0.18048079]                 *
    *                       [ 0.21263901  0.71516868  0.07219232]                 *
    *                       [ 0.01933082  0.11919478  0.95053215]]                *
    *   NPM -1           : [[ 3.24096994 -1.53738318 -0.49861076]                 *
    *                       [-0.96924364  1.8759675   0.04155506]                 *
    *                       [ 0.05563008 -0.20397696  1.05697151]]                *
    *   FFmpeg Constants : ['AVCOL_PRI_BT709', 'BT709']                           *
    *                                                                             *
    ===============================================================================

.. code-block:: python

    import colour

    colour.TRANSFER_CHARACTERISTICS_ITUTH273.keys()

.. code-block:: text

    dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

.. code-block:: python

    import colour

    colour.models.describe_video_signal_transfer_characteristics(1)

.. code-block:: text

    ===============================================================================
    *                                                                             *
    *   Transfer Characteristics: 1                                               *
    *   ---------------------------                                               *
    *                                                                             *
    *   Function         : <function oetf_BT709 at 0x7f7b918776a0>                *
    *   FFmpeg Constants : ['AVCOL_TRC_BT709', 'BT709']                           *
    *                                                                             *
    ===============================================================================

.. code-block:: python

    import colour

    colour.MATRIX_COEFFICIENTS_ITUTH273.keys()

.. code-block:: text

    dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])

.. code-block:: python

    import colour

    colour.models.describe_video_signal_matrix_coefficients(1)

.. code-block:: text

    ===============================================================================
    *                                                                             *
    *   Matrix Coefficients: 1                                                    *
    *   ----------------------                                                    *
    *                                                                             *
    *   Matrix Coefficients : [ 0.2126  0.0722]                                   *
    *   FFmpeg Constants    : ['AVCOL_SPC_BT709', 'BT709']                        *
    *                                                                             *
    ===============================================================================

Colour Notation Systems - ``colour.notation``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Munsell Value
*************

.. code-block:: python

    import colour

    colour.munsell_value(12.23634268)

.. code-block:: text

    4.08244370765

.. code-block:: python

    import colour

    sorted(colour.MUNSELL_VALUE_METHODS)

.. code-block:: text

    ['ASTM D1535', 'Ladd 1955', 'McCamy 1987', 'Moon 1943', 'Munsell 1933', 'Priest 1920', 'Saunderson 1944', 'astm2008']

Munsell Colour
**************

.. code-block:: python

    import colour

    colour.xyY_to_munsell_colour([0.38736945, 0.35751656, 0.59362000])

.. code-block:: text

    4.2YR 8.1/5.3

.. code-block:: python

    import colour

    colour.munsell_colour_to_xyY("4.2YR 8.1/5.3")

.. code-block:: text

    [ 0.38736945  0.35751656  0.59362   ]

Optical Phenomena - ``colour.phenomena``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Rayleigh Scattering
*******************

.. code-block:: python

    import colour

    colour.sd_rayleigh_scattering()

.. code-block:: text

    [[  3.60000000e+02   5.60246579e-01]
     [  3.61000000e+02   5.53748137e-01]
     [  3.62000000e+02   5.47344692e-01]
     ...
     [  7.80000000e+02   2.35336632e-02]]

Thin Film Interference
**********************

.. code-block:: python

    import colour
    import numpy as np

    # Soap film (water, n=1.33) interference
    R, T = colour.thin_film_tmm(
        n=[1.0, 1.33, 1.0],  # [air, film, air]
        t=300,  # 300 nm thickness
        wavelength=np.linspace(380, 780, 10),
        theta=0,  # Normal incidence
    )
    print(R[..., 0])  # s-polarisation reflectance

.. code-block:: text

    [[[0.01800269]]
     [[0.03176697]]
     [[0.0452849 ]]
     [[0.05812178]]
     [[0.06940598]]
     [[0.07834261]]
     [[0.08446072]]
     [[0.08770155]]
     [[0.08842705]]
     [[0.08732785]]]

Light Quality - ``colour.quality``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Colour Fidelity Index
*********************

.. code-block:: python

    import colour

    colour.colour_fidelity_index(colour.SDS_ILLUMINANTS["FL2"])

.. code-block:: text

    70.1208244014

.. code-block:: python

    import colour

    sorted(colour.COLOUR_FIDELITY_INDEX_METHODS)

.. code-block:: text

    ['ANSI/IES TM-30-18', 'CIE 2017']

Colour Quality Scale
********************

.. code-block:: python

    import colour

    colour.colour_quality_scale(colour.SDS_ILLUMINANTS["FL2"])

.. code-block:: text

    64.1118220157

.. code-block:: python

    import colour

    sorted(colour.COLOUR_QUALITY_SCALE_METHODS)

.. code-block:: text

    ['NIST CQS 7.4', 'NIST CQS 9.0']

Colour Rendering Index
**********************

.. code-block:: python

    import colour

    colour.colour_rendering_index(colour.SDS_ILLUMINANTS["FL2"])

.. code-block:: text

    64.2337241217

.. code-block:: python

    import colour

    sorted(colour.COLOUR_RENDERING_INDEX_METHODS)

.. code-block:: text

    ['CIE 1995', 'CIE 2024']

Academy Spectral Similarity Index (SSI)
***************************************

.. code-block:: python

    import colour

    colour.spectral_similarity_index(
        colour.SDS_ILLUMINANTS["C"], colour.SDS_ILLUMINANTS["D65"]
    )

.. code-block:: text

    94.0

Spectral Up-Sampling & Recovery - ``colour.recovery``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Reflectance Recovery
********************

.. code-block:: python

    import colour

    colour.XYZ_to_sd([0.206540