Source code for colour.corresponding.prediction

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Corresponding Chromaticities Prediction
=======================================

Defines objects to compute corresponding chromaticities prediction.

See Also
--------
`Corresponding Chromaticities Prediction IPython Notebook
<http://nbviewer.ipython.org/github/colour-science/colour-ipython/blob/master/notebooks/corresponding/prediction.ipynb>`_  # noqa

References
----------
.. [1]  Breneman, E. J. (1987). Corresponding chromaticities for different
        states of adaptation to complex visual fields. JOSA A, 4(6). Retrieved
        from http://www.opticsinfobase.org/josaa/fulltext.cfm?uri=josaa-4-6-1115&id=2783  # noqa
"""

from __future__ import division, unicode_literals

from collections import namedtuple

from colour.adaptation import (
    chromatic_adaptation_VonKries,
    chromatic_adaptation_CIE1994,
    chromatic_adaptation_CMCCAT2000,
    chromatic_adaptation_Fairchild1990)
from colour.corresponding import (
    BRENEMAN_EXPERIMENTS,
    BRENEMAN_EXPERIMENTS_PRIMARIES_CHROMATICITIES)
from colour.models import (
    XYZ_to_xy,
    XYZ_to_Luv,
    Luv_to_uv,
    Luv_uv_to_xy,
    xy_to_XYZ)
from colour.utilities import CaseInsensitiveMapping

__author__ = 'Colour Developers'
__copyright__ = 'Copyright (C) 2013 - 2015 - Colour Developers'
__license__ = 'New BSD License - http://opensource.org/licenses/BSD-3-Clause'
__maintainer__ = 'Colour Developers'
__email__ = 'colour-science@googlegroups.com'
__status__ = 'Production'

__all__ = ['CorrespondingChromaticitiesPrediction',
           'corresponding_chromaticities_prediction_VonKries',
           'corresponding_chromaticities_prediction_CIE1994',
           'corresponding_chromaticities_prediction_CMCCAT2000',
           'corresponding_chromaticities_prediction_Fairchild1990',
           'CORRESPONDING_CHROMATICITIES_PREDICTION_MODELS']


[docs]class CorrespondingChromaticitiesPrediction( namedtuple('CorrespondingChromaticitiesPrediction', ('name', 'uvp_t', 'uvp_m', 'uvp_p'))): """ Defines a chromatic adaptation model prediction. Parameters ---------- name : unicode Test colour name. uvp_t : numeric Chromaticity coordinates :math:`uv_t^p` of test colour. uvp_m : array_like, (2,) Chromaticity coordinates :math:`uv_m^p` of matching colour. uvp_p : array_like, (2,) Chromaticity coordinates :math:`uv_p^p` of predicted colour. """
[docs]def corresponding_chromaticities_prediction_VonKries(experiment=1, transform='CAT02'): """ Returns the corresponding chromaticities prediction for Von Kries chromatic adaptation model using given transform. Parameters ---------- experiment : integer, optional {1, 2, 3, 4, 6, 8, 9, 11, 12} Breneman (1987) experiment number. transform : unicode, optional {'CAT02', 'XYZ Scaling', 'Von Kries', 'Bradford', 'Sharp', 'Fairchild, 'CMCCAT97', 'CMCCAT2000', 'CAT02_BRILL_CAT', 'Bianco', 'Bianco PC'}, Chromatic adaptation transform. Returns ------- tuple Corresponding chromaticities prediction. Examples -------- >>> from pprint import pprint >>> pr = corresponding_chromaticities_prediction_VonKries(2, 'Bradford') >>> pr = [(p.uvp_m, p.uvp_p) for p in pr] >>> pprint(pr) # doctest: +SKIP [((0.207, 0.486), (0.20820148430638033, 0.47229226819364528)), ((0.449, 0.511), (0.44891022948064191, 0.50716028901449561)), ((0.263, 0.505), (0.26435459360846608, 0.49596314494922683)), ((0.322, 0.545), (0.33487309037107632, 0.54712207251983425)), ((0.316, 0.537), (0.32487581236911361, 0.53905899356457776)), ((0.265, 0.553), (0.27331050571632376, 0.55550280647813977)), ((0.221, 0.538), (0.22714800102072819, 0.53313179748041983)), ((0.135, 0.532), (0.14427303768336433, 0.52268044497913713)), ((0.145, 0.472), (0.14987451889726533, 0.45507852741116867)), ((0.163, 0.331), (0.15649757464732098, 0.31487959772753954)), ((0.176, 0.431), (0.17605936460371163, 0.41037722722471409)), ((0.244, 0.349), (0.22598059059292835, 0.34652914678030416))] """ experiment_results = list(BRENEMAN_EXPERIMENTS.get(experiment)) illuminants = experiment_results.pop(0) XYZ_w = xy_to_XYZ(Luv_uv_to_xy(illuminants.uvp_t)) XYZ_wr = xy_to_XYZ(Luv_uv_to_xy(illuminants.uvp_m)) xy_wr = XYZ_to_xy(XYZ_wr) prediction = [] for result in experiment_results: XYZ_1 = xy_to_XYZ(Luv_uv_to_xy(result.uvp_t)) XYZ_2 = chromatic_adaptation_VonKries(XYZ_1, XYZ_w, XYZ_wr, transform) uvp = Luv_to_uv(XYZ_to_Luv(XYZ_2, xy_wr), xy_wr) prediction.append(CorrespondingChromaticitiesPrediction( result.name, result.uvp_t, result.uvp_m, uvp)) return tuple(prediction)
[docs]def corresponding_chromaticities_prediction_CIE1994(experiment=1, **kwargs): """ Returns the corresponding chromaticities prediction for CIE 1994 chromatic adaptation model. Parameters ---------- experiment : integer, optional {1, 2, 3, 4, 6, 8, 9, 11, 12} Breneman (1987) experiment number. \*\*kwargs : \*\* Keywords arguments. Returns ------- tuple Corresponding chromaticities prediction. Examples -------- >>> from pprint import pprint >>> pr = corresponding_chromaticities_prediction_CIE1994(2) >>> pr = [(p.uvp_m, p.uvp_p) for p in pr] >>> pprint(pr) # doctest: +SKIP [((0.207, 0.486), (0.21339093279517196, 0.49397945742298016)), ((0.449, 0.511), (0.4450345313098153, 0.5120939085633327)), ((0.263, 0.505), (0.26932620724691858, 0.50832124608390727)), ((0.322, 0.545), (0.33085939370840811, 0.54439408389253441)), ((0.316, 0.537), (0.3225195584183046, 0.53778269440789594)), ((0.265, 0.553), (0.2709737181087471, 0.5513666373694861)), ((0.221, 0.538), (0.22807869730753863, 0.53515923458385406)), ((0.135, 0.532), (0.14394366662060523, 0.53035769204585748)), ((0.145, 0.472), (0.15007438031976222, 0.48428958620888679)), ((0.163, 0.331), (0.15599555781959967, 0.37723798698131394)), ((0.176, 0.431), (0.18063180902005657, 0.45184759430042898)), ((0.244, 0.349), (0.24544456656434688, 0.40180048388092021))] """ experiment_results = list(BRENEMAN_EXPERIMENTS.get(experiment)) illuminants = experiment_results.pop(0) xy_o1 = Luv_uv_to_xy(illuminants.uvp_t) xy_o2 = Luv_uv_to_xy(illuminants.uvp_m) # :math:`Y_o` is set to an arbitrary value in domain [18, 100]. Y_o = 18 E_o1 = E_o2 = BRENEMAN_EXPERIMENTS_PRIMARIES_CHROMATICITIES.get( experiment).Y prediction = [] for result in experiment_results: XYZ_1 = xy_to_XYZ(Luv_uv_to_xy(result.uvp_t)) * 100 XYZ_2 = chromatic_adaptation_CIE1994( XYZ_1, xy_o1, xy_o2, Y_o, E_o1, E_o2) uvp = Luv_to_uv(XYZ_to_Luv(XYZ_2, xy_o2), xy_o2) prediction.append(CorrespondingChromaticitiesPrediction( result.name, result.uvp_t, result.uvp_m, uvp)) return tuple(prediction)
[docs]def corresponding_chromaticities_prediction_CMCCAT2000(experiment=1, **kwargs): """ Returns the corresponding chromaticities prediction for CMCCAT2000 chromatic adaptation model. Parameters ---------- experiment : integer, optional {1, 2, 3, 4, 6, 8, 9, 11, 12} Breneman (1987) experiment number. \*\*kwargs : \*\* Keywords arguments. Returns ------- tuple Corresponding chromaticities prediction. Examples -------- >>> from pprint import pprint >>> pr = corresponding_chromaticities_prediction_CMCCAT2000(2) >>> pr = [(p.uvp_m, p.uvp_p) for p in pr] >>> pprint(pr) # doctest: +SKIP [((0.207, 0.486), (0.20832101929657834, 0.47271680534693694)), ((0.449, 0.511), (0.44592707020371486, 0.50777351504395707)), ((0.263, 0.505), (0.26402624712986333, 0.4955361681706304)), ((0.322, 0.545), (0.33168840090358015, 0.54315801981008516)), ((0.316, 0.537), (0.32226245779851387, 0.53576245377085929)), ((0.265, 0.553), (0.27107058097430181, 0.5501997842556422)), ((0.221, 0.538), (0.22618269421847523, 0.52947407170848704)), ((0.135, 0.532), (0.14396930475660724, 0.51909841743126817)), ((0.145, 0.472), (0.14948357434418671, 0.45567605010224305)), ((0.163, 0.331), (0.15631720730028753, 0.31641514460738623)), ((0.176, 0.431), (0.17631993066748047, 0.41275893424542082)), ((0.244, 0.349), (0.22876382018951744, 0.3499324084859976))] """ experiment_results = list(BRENEMAN_EXPERIMENTS.get(experiment)) illuminants = experiment_results.pop(0) XYZ_w = xy_to_XYZ(Luv_uv_to_xy(illuminants.uvp_t)) * 100 XYZ_wr = xy_to_XYZ(Luv_uv_to_xy(illuminants.uvp_m)) * 100 L_A1 = L_A2 = BRENEMAN_EXPERIMENTS_PRIMARIES_CHROMATICITIES.get( experiment).Y prediction = [] for result in experiment_results: XYZ_1 = xy_to_XYZ(Luv_uv_to_xy(result.uvp_t)) * 100 XYZ_2 = chromatic_adaptation_CMCCAT2000( XYZ_1, XYZ_w, XYZ_wr, L_A1, L_A2) uvp = Luv_to_uv(XYZ_to_Luv(XYZ_2, XYZ_wr), XYZ_wr) prediction.append(CorrespondingChromaticitiesPrediction( result.name, result.uvp_t, result.uvp_m, uvp)) return tuple(prediction)
[docs]def corresponding_chromaticities_prediction_Fairchild1990(experiment=1, **kwargs): """ Returns the corresponding chromaticities prediction for Fairchild (1990) chromatic adaptation model. Parameters ---------- experiment : integer, optional {1, 2, 3, 4, 6, 8, 9, 11, 12} Breneman (1987) experiment number. \*\*kwargs : \*\* Keywords arguments. Returns ------- tuple Corresponding chromaticities prediction. Examples -------- >>> from pprint import pprint >>> pr = corresponding_chromaticities_prediction_Fairchild1990(2) >>> pr = [(p.uvp_m, p.uvp_p) for p in pr] >>> pprint(pr) # doctest: +SKIP [((0.207, 0.486), (0.2089528677990308, 0.47240345174230519)), ((0.449, 0.511), (0.43756528098582792, 0.51210303139041924)), ((0.263, 0.505), (0.26213623665658092, 0.49725385033264224)), ((0.322, 0.545), (0.3235312762825191, 0.54756652922585702)), ((0.316, 0.537), (0.3151390992740366, 0.53983332031574016)), ((0.265, 0.553), (0.26347459238415272, 0.55443357809543037)), ((0.221, 0.538), (0.22115956537655593, 0.53244703908294599)), ((0.135, 0.532), (0.13969494108553854, 0.52072342107668024)), ((0.145, 0.472), (0.1512288710743511, 0.45330415352961834)), ((0.163, 0.331), (0.17156913711903982, 0.30262647410866889)), ((0.176, 0.431), (0.18257922398137369, 0.40778921192793854)), ((0.244, 0.349), (0.24189049501108895, 0.34134012046930529))] """ experiment_results = list(BRENEMAN_EXPERIMENTS.get(experiment)) illuminants = experiment_results.pop(0) XYZ_n = xy_to_XYZ(Luv_uv_to_xy(illuminants.uvp_t)) * 100 XYZ_r = xy_to_XYZ(Luv_uv_to_xy(illuminants.uvp_m)) * 100 Y_n = BRENEMAN_EXPERIMENTS_PRIMARIES_CHROMATICITIES.get(experiment).Y prediction = [] for result in experiment_results: XYZ_1 = xy_to_XYZ(Luv_uv_to_xy(result.uvp_t)) * 100 XYZ_2 = chromatic_adaptation_Fairchild1990( XYZ_1, XYZ_n, XYZ_r, Y_n) uvp = Luv_to_uv(XYZ_to_Luv(XYZ_2, XYZ_r), XYZ_r) prediction.append(CorrespondingChromaticitiesPrediction( result.name, result.uvp_t, result.uvp_m, uvp)) return tuple(prediction)
CORRESPONDING_CHROMATICITIES_PREDICTION_MODELS = CaseInsensitiveMapping( {'Von Kries': corresponding_chromaticities_prediction_VonKries, 'CIE 1994': corresponding_chromaticities_prediction_CIE1994, 'CMCCAT2000': corresponding_chromaticities_prediction_CMCCAT2000, 'Fairchild 1990': corresponding_chromaticities_prediction_Fairchild1990}) """ Aggregated corresponding chromaticities prediction models. CORRESPONDING_CHROMATICITIES_PREDICTION_MODELS : CaseInsensitiveMapping {'Von Kries', 'CIE 1994', 'CMCCAT2000', 'Fairchild 1990'} Aliases: - 'vonkries': 'Von Kries' """ CORRESPONDING_CHROMATICITIES_PREDICTION_MODELS['vonkries'] = ( CORRESPONDING_CHROMATICITIES_PREDICTION_MODELS['Von Kries'])