Source code for colour.characterisation.dataset.colour_checkers.chromaticity_coordinates

# -*- coding: utf-8 -*-
"""
ColourCheckers Chromaticity Coordinates
=======================================

Defines *ColourCheckers* chromaticity coordinates in *CIE xyY* colourspace.

Each *ColourChecker* data is in the form of a list of an :class:`OrderedDict`
class instance of 24 samples as follows::

    {'name': 'xyY', ..., 'name': 'xyY'}

The following *ColourCheckers* data is available:

-   :attr:`colour.characterisation.dataset.colour_checkers.\
chromaticity_coordinates.COLORCHECKER_1976`: *ColourChecker* developed by
    *McCamy et al.* at Macbeth, a Division of Kollmorgen.
-   :attr:`colour.characterisation.dataset.colour_checkers.\
chromaticity_coordinates.COLORCHECKER_2005`: Reference data from
    *GretagMacbeth* published in 2005.
-   :attr:`colour.characterisation.dataset.colour_checkers.\
chromaticity_coordinates.BABELCOLOR_AVERAGE`: Average data derived from
    measurements of 30 *ColourChecker* charts.
-   :attr:`colour.characterisation.dataset.colour_checkers.\
chromaticity_coordinates.COLORCHECKER24_BEFORE_NOV2014`: Reference data from
    *X-Rite* published in 2015 and matching the data from *GretagMacbeth*
    published in 2005.
-   :attr:`colour.characterisation.dataset.colour_checkers.\
chromaticity_coordinates.COLORCHECKER24_AFTER_NOV2014`: Reference data from
    *X-Rite* published in 2015 and matching the *ColourChecker* edition after
    November 2014.

See Also
--------
`Colour Fitting Jupyter Notebook
<http://nbviewer.jupyter.org/github/colour-science/colour-notebooks/\
blob/master/notebooks/characterisation/fitting.ipynb>`_

References
----------
-   :cite:`BabelColor2012b` : BabelColor. (2012). The ColorChecker
    (since 1976!). Retrieved September 26, 2014, from
    http://www.babelcolor.com/main_level/ColorChecker.htm
-   :cite:`BabelColor2012c` : BabelColor. (2012). ColorChecker RGB and spectra.
    Retrieved from http://www.babelcolor.com/download/\
ColorChecker_RGB_and_spectra.xls
-   :cite:`X-Rite2015` : X-Rite. (2015). New color specifications for
    ColorChecker SG and Classic Charts. Retrieved October 29, 2018,
    from http://xritephoto.com/ph_product_overview.aspx?\
ID=938&Action=Support&SupportID=5884#
"""

from __future__ import division, unicode_literals

import numpy as np
from collections import OrderedDict, namedtuple

from colour.colorimetry import ILLUMINANTS
from colour.models import Lab_to_XYZ, XYZ_to_xyY
from colour.utilities import CaseInsensitiveMapping

__author__ = 'Colour Developers, Danny Pascale '
__copyright__ = 'Copyright (C) 2013-2019 - Colour Developers'
__copyright__ += ', '
__copyright__ += (
    'BabelColor ColorChecker data: Copyright (C) 2004-2012 Danny Pascale '
    '(www.babelcolor.com); used by permission.')
__license__ = 'New BSD License - https://opensource.org/licenses/BSD-3-Clause'
__maintainer__ = 'Colour Developers'
__email__ = 'colour-science@googlegroups.com'
__status__ = 'Production'

__all__ = [
    'ColourChecker', 'COLORCHECKER_1976_DATA', 'COLORCHECKER_1976_ILLUMINANT',
    'COLORCHECKER_1976', 'COLORCHECKER_2005_DATA',
    'COLORCHECKER_2005_ILLUMINANT', 'COLORCHECKER_2005',
    'BABELCOLOR_AVERAGE_DATA', 'BABELCOLOR_AVERAGE_ILLUMINANT',
    'BABELCOLOR_AVERAGE', 'COLORCHECKER24_BEFORE_NOV2014_LAB_DATA',
    'COLORCHECKER24_BEFORE_NOV2014_DATA',
    'COLORCHECKER24_BEFORE_NOV2014_ILLUMINANT',
    'COLORCHECKER24_BEFORE_NOV2014', 'COLORCHECKER24_AFTER_NOV2014_LAB_DATA',
    'COLORCHECKER24_AFTER_NOV2014_DATA',
    'COLORCHECKER24_AFTER_NOV2014_ILLUMINANT', 'COLORCHECKER24_AFTER_NOV2014',
    'COLOURCHECKERS'
]


[docs]class ColourChecker( namedtuple('ColourChecker', ('name', 'data', 'illuminant'))): """ *ColourChecker* data. Parameters ---------- name : unicode *ColourChecker* name. data : OrderedDict chromaticity coordinates in *CIE xyY* colourspace. illuminant : array_like *ColourChecker* illuminant chromaticity coordinates. """
COLORCHECKER_1976_DATA = OrderedDict(( ('dark skin', np.array([0.4002, 0.3504, 0.1005])), ('light skin', np.array([0.3773, 0.3446, 0.3582])), ('blue sky', np.array([0.2470, 0.2514, 0.1933])), ('foliage', np.array([0.3372, 0.4220, 0.1329])), ('blue flower', np.array([0.2651, 0.2400, 0.2427])), ('bluish green', np.array([0.2608, 0.3430, 0.4306])), ('orange', np.array([0.5060, 0.4070, 0.3005])), ('purplish blue', np.array([0.2110, 0.1750, 0.1200])), ('moderate red', np.array([0.4533, 0.3058, 0.1977])), ('purple', np.array([0.2845, 0.2020, 0.0656])), ('yellow green', np.array([0.3800, 0.4887, 0.4429])), ('orange yellow', np.array([0.4729, 0.4375, 0.4306])), ('blue', np.array([0.1866, 0.1285, 0.0611])), ('green', np.array([0.3046, 0.4782, 0.2339])), ('red', np.array([0.5385, 0.3129, 0.1200])), ('yellow', np.array([0.4480, 0.4703, 0.5910])), ('magenta', np.array([0.3635, 0.2325, 0.1977])), ('cyan', np.array([0.1958, 0.2519, 0.1977])), ('white 9.5 (.05 D)', np.array([0.3101, 0.3163, 0.9001])), ('neutral 8 (.23 D)', np.array([0.3101, 0.3163, 0.5910])), ('neutral 6.5 (.44 D)', np.array([0.3101, 0.3163, 0.3620])), ('neutral 5 (.70 D)', np.array([0.3101, 0.3163, 0.1977])), ('neutral 3.5 (1.05 D)', np.array([0.3101, 0.3163, 0.0900])), ('black 2 (1.5 D)', np.array([0.3101, 0.3163, 0.0313])), )) COLORCHECKER_1976_ILLUMINANT = ( ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['C']) """ *ColorChecker 1976* illuminant. COLORCHECKER_1976_ILLUMINANT : ndarray """ COLORCHECKER_1976 = ColourChecker('ColorChecker 1976', COLORCHECKER_1976_DATA, COLORCHECKER_1976_ILLUMINANT) """ *ColourChecker* developed by *McCamy et al.* at Macbeth, a Division of Kollmorgen. COLORCHECKER_1976 : ColourChecker """ COLORCHECKER_2005_DATA = OrderedDict(( ('dark skin', np.array([0.4316, 0.3777, 0.1008])), ('light skin', np.array([0.4197, 0.3744, 0.3495])), ('blue sky', np.array([0.2760, 0.3016, 0.1836])), ('foliage', np.array([0.3703, 0.4499, 0.1325])), ('blue flower', np.array([0.2999, 0.2856, 0.2304])), ('bluish green', np.array([0.2848, 0.3911, 0.4178])), ('orange', np.array([0.5295, 0.4055, 0.3118])), ('purplish blue', np.array([0.2305, 0.2106, 0.1126])), ('moderate red', np.array([0.5012, 0.3273, 0.1938])), ('purple', np.array([0.3319, 0.2482, 0.0637])), ('yellow green', np.array([0.3984, 0.5008, 0.4446])), ('orange yellow', np.array([0.4957, 0.4427, 0.4357])), ('blue', np.array([0.2018, 0.1692, 0.0575])), ('green', np.array([0.3253, 0.5032, 0.2318])), ('red', np.array([0.5686, 0.3303, 0.1257])), ('yellow', np.array([0.4697, 0.4734, 0.5981])), ('magenta', np.array([0.4159, 0.2688, 0.2009])), ('cyan', np.array([0.2131, 0.3023, 0.1930])), ('white 9.5 (.05 D)', np.array([0.3469, 0.3608, 0.9131])), ('neutral 8 (.23 D)', np.array([0.3440, 0.3584, 0.5894])), ('neutral 6.5 (.44 D)', np.array([0.3432, 0.3581, 0.3632])), ('neutral 5 (.70 D)', np.array([0.3446, 0.3579, 0.1915])), ('neutral 3.5 (1.05 D)', np.array([0.3401, 0.3548, 0.0883])), ('black 2 (1.5 D)', np.array([0.3406, 0.3537, 0.0311])), )) COLORCHECKER_2005_ILLUMINANT = ( ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['D50']) """ *ColorChecker 2005* illuminant. COLORCHECKER_2005_ILLUMINANT : ndarray """ COLORCHECKER_2005 = ColourChecker('ColorChecker 2005', COLORCHECKER_2005_DATA, COLORCHECKER_2005_ILLUMINANT) """ Reference data from *GretagMacbeth (2005)*. COLORCHECKER_2005 : ColourChecker """ BABELCOLOR_AVERAGE_DATA = OrderedDict(( ('dark skin', np.array([0.4325, 0.3788, 0.1034])), ('light skin', np.array([0.4191, 0.3748, 0.3525])), ('blue sky', np.array([0.2761, 0.3004, 0.1847])), ('foliage', np.array([0.3700, 0.4501, 0.1335])), ('blue flower', np.array([0.3020, 0.2877, 0.2324])), ('bluish green', np.array([0.2856, 0.3910, 0.4174])), ('orange', np.array([0.5291, 0.4075, 0.3117])), ('purplish blue', np.array([0.2339, 0.2155, 0.1140])), ('moderate red', np.array([0.5008, 0.3293, 0.1979])), ('purple', np.array([0.3326, 0.2556, 0.0644])), ('yellow green', np.array([0.3989, 0.4998, 0.4435])), ('orange yellow', np.array([0.4962, 0.4428, 0.4358])), ('blue', np.array([0.2040, 0.1696, 0.0579])), ('green', np.array([0.3270, 0.5033, 0.2307])), ('red', np.array([0.5709, 0.3298, 0.1268])), ('yellow', np.array([0.4694, 0.4732, 0.6081])), ('magenta', np.array([0.4177, 0.2704, 0.2007])), ('cyan', np.array([0.2151, 0.3037, 0.1903])), ('white 9.5 (.05 D)', np.array([0.3488, 0.3628, 0.9129])), ('neutral 8 (.23 D)', np.array([0.3451, 0.3596, 0.5885])), ('neutral 6.5 (.44 D)', np.array([0.3446, 0.3590, 0.3595])), ('neutral 5 (.70 D)', np.array([0.3438, 0.3589, 0.1912])), ('neutral 3.5 (1.05 D)', np.array([0.3423, 0.3576, 0.0893])), ('black 2 (1.5 D)', np.array([0.3439, 0.3565, 0.0320])), )) BABELCOLOR_AVERAGE_ILLUMINANT = ( ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['D50']) """ *BabelColor Average* illuminant. BABELCOLOR_AVERAGE_ILLUMINANT : ndarray """ BABELCOLOR_AVERAGE = ColourChecker('BabelColor Average', BABELCOLOR_AVERAGE_DATA, BABELCOLOR_AVERAGE_ILLUMINANT) """ Average data derived from measurements of 30 *ColourChecker* charts. BABELCOLOR_AVERAGE : ColourChecker """ COLORCHECKER24_BEFORE_NOV2014_LAB_DATA = OrderedDict(( ('dark skin', np.array([37.986, 13.555, 14.059])), ('light skin', np.array([65.711, 18.13, 17.81])), ('blue sky', np.array([49.927, -4.88, -21.905])), ('foliage', np.array([43.139, -13.095, 21.905])), ('blue flower', np.array([55.112, 8.844, -25.399])), ('bluish green', np.array([70.719, -33.397, -0.199])), ('orange', np.array([62.661, 36.067, 57.096])), ('purplish blue', np.array([40.02, 10.41, -45.964])), ('moderate red', np.array([51.124, 48.239, 16.248])), ('purple', np.array([30.325, 22.976, -21.587])), ('yellow green', np.array([72.532, -23.709, 57.255])), ('orange yellow', np.array([71.941, 19.363, 67.857])), ('blue', np.array([28.778, 14.179, -50.297])), ('green', np.array([55.261, -38.342, 31.37])), ('red', np.array([42.101, 53.378, 28.19])), ('yellow', np.array([81.733, 4.039, 79.819])), ('magenta', np.array([51.935, 49.986, -14.574])), ('cyan', np.array([51.038, -28.631, -28.638])), ('white 9.5 (.05 D)', np.array([96.539, -0.425, 1.186])), ('neutral 8 (.23 D)', np.array([81.257, -0.638, -0.335])), ('neutral 6.5 (.44 D)', np.array([66.766, -0.734, -0.504])), ('neutral 5 (.70 D)', np.array([50.867, -0.153, -0.27])), ('neutral 3.5 (1.05 D)', np.array([35.656, -0.421, -1.231])), ('black 2 (1.5 D)', np.array([20.461, -0.079, -0.973])), )) """ *ColorChecker24 - Before November 2014* illuminant. Notes ----- - *X-Rite* data is given as *CIE L\\*a\\*b\\** colourspace values under *CIE Illuminant D Series D50* for the *CIE 1931 2 Degree Standard Observer*. COLORCHECKER24_BEFORE_NOV2014_LAB_DATA : ndarray """ COLORCHECKER24_BEFORE_NOV2014_DATA = OrderedDict( zip( COLORCHECKER24_BEFORE_NOV2014_LAB_DATA.keys(), XYZ_to_xyY( Lab_to_XYZ( list(COLORCHECKER24_BEFORE_NOV2014_LAB_DATA.values()), ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['D50'])))) COLORCHECKER24_BEFORE_NOV2014_ILLUMINANT = ( ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['D50']) """ *ColorChecker24 - Before November 2014* illuminant. COLORCHECKER24_BEFORE_NOV2014_ILLUMINANT : ndarray """ COLORCHECKER24_BEFORE_NOV2014 = ColourChecker( 'ColorChecker24 - Before November 2014', COLORCHECKER24_BEFORE_NOV2014_DATA, COLORCHECKER24_BEFORE_NOV2014_ILLUMINANT) """ Reference *ColourChecker* data from *X-Rite (2015)*. Notes ----- - The rounded *ColorChecker24 - Before November 2014* values should match the *ColorChecker 2005* values. They are given for reference of the original *CIE L\\*a\\*b\\** colourspace values. COLORCHECKER24_BEFORE_NOV2014 : ColourChecker """ COLORCHECKER24_AFTER_NOV2014_LAB_DATA = OrderedDict(( ('dark skin', np.array([37.54, 14.37, 14.92])), ('light skin', np.array([64.66, 19.27, 17.5])), ('blue sky', np.array([49.32, -3.82, -22.54])), ('foliage', np.array([43.46, -12.74, 22.72])), ('blue flower', np.array([54.94, 9.61, -24.79])), ('bluish green', np.array([70.48, -32.26, -0.37])), ('orange', np.array([62.73, 35.83, 56.5])), ('purplish blue', np.array([39.43, 10.75, -45.17])), ('moderate red', np.array([50.57, 48.64, 16.67])), ('purple', np.array([30.1, 22.54, -20.87])), ('yellow green', np.array([71.77, -24.13, 58.19])), ('orange yellow', np.array([71.51, 18.24, 67.37])), ('blue', np.array([28.37, 15.42, -49.8])), ('green', np.array([54.38, -39.72, 32.27])), ('red', np.array([42.43, 51.05, 28.62])), ('yellow', np.array([81.8, 2.67, 80.41])), ('magenta', np.array([50.63, 51.28, -14.12])), ('cyan', np.array([49.57, -29.71, -28.32])), ('white 9.5 (.05 D)', np.array([95.19, -1.03, 2.93])), ('neutral 8 (.23 D)', np.array([81.29, -0.57, 0.44])), ('neutral 6.5 (.44 D)', np.array([66.89, -0.75, -0.06])), ('neutral 5 (.70 D)', np.array([50.76, -0.13, 0.14])), ('neutral 3.5 (1.05 D)', np.array([35.63, -0.46, -0.48])), ('black 2 (1.5 D)', np.array([20.64, 0.07, -0.46])), )) """ *ColorChecker24 - After November 2014* illuminant. Notes ----- - *X-Rite* data is given as *CIE L\\*a\\*b\\** colourspace values under *CIE Illuminant D Series D50* for the *CIE 1931 2 Degree Standard Observer*. COLORCHECKER24_AFTER_NOV2014_LAB_DATA : ndarray """ COLORCHECKER24_AFTER_NOV2014_DATA = OrderedDict( zip( COLORCHECKER24_AFTER_NOV2014_LAB_DATA.keys(), XYZ_to_xyY( Lab_to_XYZ( list(COLORCHECKER24_AFTER_NOV2014_LAB_DATA.values()), ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['D50'])))) COLORCHECKER24_AFTER_NOV2014_ILLUMINANT = ( ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['D50']) """ *ColorChecker24 - After November 2014* illuminant. COLORCHECKER24_AFTER_NOV2014_ILLUMINANT : ndarray """ COLORCHECKER24_AFTER_NOV2014 = ColourChecker( 'ColorChecker24 - After November 2014', COLORCHECKER24_AFTER_NOV2014_DATA, COLORCHECKER24_AFTER_NOV2014_ILLUMINANT) """ Reference *ColourChecker* data from *X-Rite (2015)* and matching the *ColourChecker* edition after November 2014. COLORCHECKER24_AFTER_NOV2014 : ColourChecker """ COLOURCHECKERS = CaseInsensitiveMapping({ 'ColorChecker 1976': COLORCHECKER_1976, 'ColorChecker 2005': COLORCHECKER_2005, 'BabelColor Average': BABELCOLOR_AVERAGE, 'ColorChecker24 - Before November 2014': COLORCHECKER24_BEFORE_NOV2014, 'ColorChecker24 - After November 2014': COLORCHECKER24_AFTER_NOV2014, }) COLOURCHECKERS.__doc__ = """ Aggregated *ColourCheckers* chromaticity coordinates. References ---------- :cite:`BabelColor2012b`, :cite:`BabelColor2012c`, :cite:`X-Rite2015` COLOURCHECKERS : CaseInsensitiveMapping **{'ColorChecker 1976', 'ColorChecker 2005', 'BabelColor Average', 'ColorChecker24 - Before November 2014', 'ColorChecker24 - After November 2014'}** Aliases: - 'babel_average': 'BabelColor Average' - 'cc2005': 'ColorChecker 2005' - 'ccb2014': 'ColorChecker24 - Before November 2014' - 'cca2014': 'ColorChecker24 - After November 2014' """ COLOURCHECKERS['babel_average'] = COLOURCHECKERS['BabelColor Average'] COLOURCHECKERS['cc2005'] = COLOURCHECKERS['ColorChecker 2005'] COLOURCHECKERS['ccb2014'] = COLOURCHECKERS[ 'ColorChecker24 - Before November 2014'] COLOURCHECKERS['cca2014'] = COLOURCHECKERS[ 'ColorChecker24 - After November 2014']