Comprehensive Python library providing algorithms and datasets for colour science computations, including chromatic adaptation, colour appearance models, colorimetry, and spectral analysis.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Comprehensive chromatic adaptation functionality for adapting stimuli between different viewing conditions and illuminants using various chromatic adaptation models and transforms.
The primary function for chromatic adaptation with multiple method support.
def chromatic_adaptation(
XYZ: ArrayLike,
XYZ_w: ArrayLike,
XYZ_wr: ArrayLike,
method: Literal["CIE 1994", "CMCCAT2000", "Fairchild 1990", "Von Kries", "Zhai 2018", "vK20"] = "Von Kries",
**kwargs: Any
) -> NDArrayFloat:
"""
Adapt given stimulus from test viewing conditions to reference viewing conditions.
Parameters:
- XYZ: CIE XYZ tristimulus values of stimulus to adapt
- XYZ_w: test viewing condition CIE XYZ tristimulus values of the whitepoint
- XYZ_wr: reference viewing condition CIE XYZ tristimulus values of the whitepoint
- method: chromatic adaptation method to use
- **kwargs: method-specific parameters (see individual methods for details)
Returns:
CIE XYZ_c tristimulus values of the stimulus corresponding colour
Supported Methods:
- "Von Kries": Classical Von Kries chromatic adaptation
- "CIE 1994": CIE 1994 chromatic adaptation model
- "CMCCAT2000": CMC CAT2000 chromatic adaptation transform
- "Fairchild 1990": Fairchild's 1990 incomplete chromatic adaptation model
- "Zhai 2018": Zhai and Luo 2018 two-step chromatic adaptation
- "vK20": Von Kries 2020 evolution with degree of adaptation
Domain/Range: [0, 1] for all XYZ parameters in Scale - 1 mode
"""Classical Von Kries chromatic adaptation model implementation.
def matrix_chromatic_adaptation_VonKries(
XYZ_w: ArrayLike,
XYZ_wr: ArrayLike,
transform: LiteralChromaticAdaptationTransform = "CAT02"
) -> NDArrayFloat:
"""
Compute the chromatic adaptation matrix from test viewing conditions to reference viewing conditions.
Parameters:
- XYZ_w: test viewing conditions CIE XYZ tristimulus values of whitepoint
- XYZ_wr: reference viewing conditions CIE XYZ tristimulus values of whitepoint
- transform: chromatic adaptation transform matrix to use
Returns:
Chromatic adaptation matrix M_cat
Available transforms: "XYZ Scaling", "Von Kries", "Bradford", "Sharp",
"Fairchild", "CMCCAT97", "CMCCAT2000", "CAT02", "CAT02 Brill 2008",
"CAT16", "Bianco 2010", "Bianco PC 2010"
"""
def chromatic_adaptation_VonKries(
XYZ: ArrayLike,
XYZ_w: ArrayLike,
XYZ_wr: ArrayLike,
transform: LiteralChromaticAdaptationTransform = "CAT02"
) -> NDArrayFloat:
"""
Adapt given stimulus CIE XYZ tristimulus values from test viewing conditions
to reference viewing conditions using Von Kries chromatic adaptation model.
Parameters:
- XYZ: CIE XYZ tristimulus values of stimulus to adapt
- XYZ_w: test viewing condition CIE XYZ tristimulus values of whitepoint
- XYZ_wr: reference viewing condition CIE XYZ tristimulus values of whitepoint
- transform: chromatic adaptation transform matrix to use
Returns:
CIE XYZ_c tristimulus values of the stimulus corresponding colour
"""CMC CAT2000 chromatic adaptation transform with viewing condition support.
class InductionFactors_CMCCAT2000:
"""
CMCCAT2000 chromatic adaptation model induction factors.
Attributes:
- F: surround condition factor
"""
F: float
def chromatic_adaptation_CMCCAT2000(
XYZ: ArrayLike,
XYZ_w: ArrayLike,
XYZ_wr: ArrayLike,
L_A1: ArrayLike,
L_A2: ArrayLike,
surround: InductionFactors_CMCCAT2000 = None,
direction: Literal["Forward", "Inverse"] = "Forward"
) -> NDArrayFloat:
"""
Adapt given stimulus CIE XYZ tristimulus values from test viewing conditions
to reference viewing conditions using CMCCAT2000 chromatic adaptation model.
Parameters:
- XYZ: CIE XYZ tristimulus values of the stimulus to adapt
- XYZ_w: test viewing condition CIE XYZ tristimulus values of whitepoint
- XYZ_wr: reference viewing condition CIE XYZ tristimulus values of whitepoint
- L_A1: luminance of test adapting field in cd/m²
- L_A2: luminance of reference adapting field in cd/m²
- surround: surround viewing conditions induction factors
- direction: chromatic adaptation direction ("Forward" or "Inverse")
Returns:
CIE XYZ_c tristimulus values of the stimulus corresponding colour
Domain/Range: [0, 100] for XYZ in reference scale, [0, 1] in scale-1 mode
"""
def chromatic_adaptation_forward_CMCCAT2000(
XYZ: ArrayLike,
XYZ_w: ArrayLike,
XYZ_wr: ArrayLike,
L_A1: ArrayLike,
L_A2: ArrayLike,
surround: InductionFactors_CMCCAT2000 = None
) -> NDArrayFloat:
"""
Forward CMCCAT2000 chromatic adaptation from test to reference conditions.
Parameters same as chromatic_adaptation_CMCCAT2000 with direction="Forward"
"""
def chromatic_adaptation_inverse_CMCCAT2000(
XYZ: ArrayLike,
XYZ_w: ArrayLike,
XYZ_wr: ArrayLike,
L_A1: ArrayLike,
L_A2: ArrayLike,
surround: InductionFactors_CMCCAT2000 = None
) -> NDArrayFloat:
"""
Inverse CMCCAT2000 chromatic adaptation from reference to test conditions.
Parameters same as chromatic_adaptation_CMCCAT2000 with direction="Inverse"
"""CIE 1994 chromatic adaptation model with illuminance considerations.
def chromatic_adaptation_CIE1994(
XYZ_1: ArrayLike,
xy_o1: ArrayLike,
xy_o2: ArrayLike,
Y_o: ArrayLike,
E_o1: ArrayLike,
E_o2: ArrayLike,
n: ArrayLike = 1
) -> NDArrayFloat:
"""
Adapt given stimulus CIE XYZ tristimulus values from test viewing conditions
to reference viewing conditions using CIE 1994 chromatic adaptation model.
Parameters:
- XYZ_1: CIE XYZ tristimulus values of test sample/stimulus
- xy_o1: chromaticity coordinates of test illuminant and background
- xy_o2: chromaticity coordinates of reference illuminant and background
- Y_o: luminance factor of achromatic background as percentage [18, 100]
- E_o1: test illuminance in cd/m²
- E_o2: reference illuminance in cd/m²
- n: noise component in fundamental primary system
Returns:
Adapted CIE XYZ tristimulus values of stimulus
Domain/Range: [0, 100] for XYZ and Y_o in reference scale
"""Fairchild's 1990 incomplete chromatic adaptation model.
def chromatic_adaptation_Fairchild1990(
XYZ_1: ArrayLike,
XYZ_n: ArrayLike,
XYZ_r: ArrayLike,
Y_n: ArrayLike,
discount_illuminant: bool = False
) -> NDArrayFloat:
"""
Adapt given stimulus CIE XYZ tristimulus values from test viewing conditions
to reference viewing conditions using Fairchild (1990) chromatic adaptation model.
Parameters:
- XYZ_1: CIE XYZ tristimulus values of test sample/stimulus
- XYZ_n: test viewing condition CIE XYZ tristimulus values of whitepoint
- XYZ_r: reference viewing condition CIE XYZ tristimulus values of whitepoint
- Y_n: luminance of test adapting stimulus in cd/m²
- discount_illuminant: whether the illuminant should be discounted
Returns:
Adapted CIE XYZ tristimulus values of stimulus
Domain/Range: [0, 100] for XYZ in reference scale, [0, 1] in scale-1 mode
"""Modern evolution of Von Kries adaptation with degree of adaptation coefficients.
class Coefficients_DegreeOfAdaptation_vK20:
"""
Von Kries 2020 (vK20) degree of adaptation coefficients.
Attributes:
- D_n: degree of adaptation for the adapting illuminant
- D_r: degree of adaptation for the reference illuminant
- D_p: degree of adaptation for the previous illuminant
"""
D_n: float
D_r: float
D_p: float
def matrix_chromatic_adaptation_vk20(
XYZ_p: ArrayLike,
XYZ_n: ArrayLike,
XYZ_r: ArrayLike = None,
coefficients: Coefficients_DegreeOfAdaptation_vK20 = None,
transform: LiteralChromaticAdaptationTransform = "CAT02"
) -> NDArrayFloat:
"""
Compute the vK20 chromatic adaptation matrix.
Parameters:
- XYZ_p: previous/test viewing conditions XYZ tristimulus values of whitepoint
- XYZ_n: current viewing conditions XYZ tristimulus values of whitepoint
- XYZ_r: reference viewing conditions XYZ tristimulus values of whitepoint
- coefficients: vK20 degree of adaptation coefficients
- transform: chromatic adaptation transform matrix to use
Returns:
vK20 chromatic adaptation matrix
"""
def chromatic_adaptation_vK20(
XYZ: ArrayLike,
XYZ_p: ArrayLike,
XYZ_n: ArrayLike,
XYZ_r: ArrayLike = None,
coefficients: Coefficients_DegreeOfAdaptation_vK20 = None,
transform: LiteralChromaticAdaptationTransform = "CAT02"
) -> NDArrayFloat:
"""
Adapt given stimulus CIE XYZ tristimulus values using Von Kries 2020 (vK20)
chromatic adaptation model.
Parameters:
- XYZ: CIE XYZ tristimulus values of stimulus to adapt
- XYZ_p: previous/test viewing conditions XYZ tristimulus values of whitepoint
- XYZ_n: current viewing conditions XYZ tristimulus values of whitepoint
- XYZ_r: reference viewing conditions XYZ tristimulus values of whitepoint
- coefficients: vK20 degree of adaptation coefficients
- transform: chromatic adaptation transform matrix to use
Returns:
CIE XYZ_c tristimulus values of the stimulus corresponding colour
"""Two-step chromatic adaptation model with baseline illuminant concept.
def chromatic_adaptation_Zhai2018(
XYZ_b: ArrayLike,
XYZ_wb: ArrayLike,
XYZ_wd: ArrayLike,
D_b: ArrayLike = 1,
D_d: ArrayLike = 1,
XYZ_wo: ArrayLike = None,
transform: Literal["CAT02", "CAT16"] = "CAT02"
) -> NDArrayFloat:
"""
Adapt given sample colour from input viewing conditions to output viewing conditions
using Zhai and Luo (2018) two-step chromatic adaptation model.
This model uses a baseline illuminant (BI) concept where adaptation is calculated
relative to an intrinsic property of the human vision system, allowing for
incomplete-to-incomplete adaptation scenarios.
Parameters:
- XYZ_b: sample colour under input illuminant β
- XYZ_wb: input illuminant β tristimulus values
- XYZ_wd: output illuminant δ tristimulus values
- D_b: degree of adaptation of input illuminant β
- D_d: degree of adaptation of output illuminant δ
- XYZ_wo: baseline illuminant (BI) tristimulus values
- transform: chromatic adaptation transform ("CAT02" or "CAT16")
Returns:
Sample corresponding colour XYZ tristimulus values under output illuminant
Domain/Range: [0, 100] for XYZ in reference scale, [0, 1] in scale-1 mode
"""Pre-defined chromatic adaptation transform matrices for various CAT models.
# Primary CAT Matrices (3x3 NDArrayFloat)
CAT_XYZ_SCALING: NDArrayFloat
"""XYZ Scaling chromatic adaptation transform (identity matrix)."""
CAT_VON_KRIES: NDArrayFloat
"""Von Kries chromatic adaptation transform."""
CAT_BRADFORD: NDArrayFloat
"""Bradford chromatic adaptation transform."""
CAT_SHARP: NDArrayFloat
"""Sharp chromatic adaptation transform."""
CAT_FAIRCHILD: NDArrayFloat
"""Fairchild chromatic adaptation transform."""
CAT_CMCCAT97: NDArrayFloat
"""CMCCAT97 chromatic adaptation transform."""
CAT_CMCCAT2000: NDArrayFloat
"""CMCCAT2000 chromatic adaptation transform."""
CAT_CAT02: NDArrayFloat
"""CAT02 chromatic adaptation transform."""
CAT_CAT02_BRILL2008: NDArrayFloat
"""Brill and Susstrunk (2008) corrected CAT02 chromatic adaptation transform."""
CAT_CAT16: NDArrayFloat
"""CAT16 chromatic adaptation transform."""
CAT_BIANCO2010: NDArrayFloat
"""Bianco and Schettini (2010) chromatic adaptation transform."""
CAT_PC_BIANCO2010: NDArrayFloat
"""Bianco and Schettini PC (2010) chromatic adaptation transform (no negative lobes)."""Standard viewing conditions and adaptation coefficients for chromatic adaptation models.
# CMCCAT2000 Viewing Conditions
VIEWING_CONDITIONS_CMCCAT2000: Dict[str, InductionFactors_CMCCAT2000]
"""
Reference CMCCAT2000 chromatic adaptation model viewing conditions.
Available conditions:
- "Average": F = 1.0
- "Dim": F = 0.8
- "Dark": F = 0.8
"""
# vK20 Degree of Adaptation Conditions
CONDITIONS_DEGREE_OF_ADAPTATION_VK20: Dict[str, Coefficients_DegreeOfAdaptation_vK20]
"""
Conditions for the Von Kries 2020 (vK20) degree of adaptation coefficients.
Available conditions:
- "Fairchild": (D_n=0.7, D_r=0.3, D_p=0)
- "Hands": (D_n=0.95, D_r=0.05, D_p=0)
- "No Hands": (D_n=0.85, D_r=0.15, D_p=0)
- "Ordinal 1st": (D_n=0.9, D_r=0.1, D_p=0)
- "Ordinal 2nd": (D_n=0.8, D_r=0.1, D_p=0.1)
- "Reversibility Trial 1st": (D_n=0.7, D_r=0.3, D_p=0.1)
- "Reversibility Trial 2nd": (D_n=0.6, D_r=0.3, D_p=0.1)
- "Ma et al.": (D_n=1/3, D_r=1/3, D_p=1/3)
- "Hunt & Winter": (D_n=0.6, D_r=0.2, D_p=0.2)
- "Hurvich & Jameson": (D_n=0.7, D_r=0.3, D_p=0)
- "Simple von Kries": (D_n=1, D_r=0, D_p=0)
"""
TVS_XYZ_R_VK20: NDArrayFloat
"""
Von Kries 2020 (vK20) reference illuminant tristimulus values.
Approximately 15000K sky blue (u'=0.185, v'=0.425).
"""
# Transform Collections
CHROMATIC_ADAPTATION_TRANSFORMS: Dict[str, NDArrayFloat]
"""
Available chromatic adaptation transforms mapping method names to matrices.
Keys: "XYZ Scaling", "Von Kries", "Bradford", "Sharp", "Fairchild",
"CMCCAT97", "CMCCAT2000", "CAT02", "CAT02 Brill 2008", "CAT16",
"Bianco 2010", "Bianco PC 2010"
"""
CHROMATIC_ADAPTATION_METHODS: Dict[str, Callable]
"""
Supported chromatic adaptation methods mapping method names to functions.
Keys: "CIE 1994", "CMCCAT2000", "Fairchild 1990", "Von Kries",
"Zhai 2018", "vK20"
"""import numpy as np
# Basic Von Kries chromatic adaptation
XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
XYZ_w = np.array([0.95045593, 1.00000000, 1.08905775]) # D65
XYZ_wr = np.array([0.96429568, 1.00000000, 0.82510460]) # D50
# Adapt from D65 to D50 using Von Kries (default)
XYZ_adapted = chromatic_adaptation(XYZ, XYZ_w, XYZ_wr)
# array([0.21638817, 0.1257, 0.03847493])
# Using Bradford transform explicitly
XYZ_adapted_bradford = chromatic_adaptation_VonKries(
XYZ, XYZ_w, XYZ_wr, transform="Bradford"
)# CMCCAT2000 adaptation with specific viewing conditions
XYZ = np.array([0.2248, 0.2274, 0.0854])
XYZ_w = np.array([1.1115, 1.0000, 0.3520])
XYZ_wr = np.array([0.9481, 1.0000, 1.0730])
L_A = 200
XYZ_adapted = chromatic_adaptation(
XYZ, XYZ_w, XYZ_wr,
method="CMCCAT2000",
L_A1=L_A,
L_A2=L_A,
surround=VIEWING_CONDITIONS_CMCCAT2000["Average"]
)# Von Kries 2020 adaptation with specific coefficients
XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
XYZ_w = np.array([0.95045593, 1.00000000, 1.08905775])
XYZ_wr = np.array([0.96429568, 1.00000000, 0.82510460])
# Using predefined coefficients
XYZ_adapted = chromatic_adaptation(
XYZ, XYZ_w, XYZ_wr,
method="vK20",
coefficients=CONDITIONS_DEGREE_OF_ADAPTATION_VK20["Fairchild"]
)
# Using custom coefficients
custom_coeffs = Coefficients_DegreeOfAdaptation_vK20(D_n=0.8, D_r=0.2, D_p=0)
XYZ_adapted_custom = chromatic_adaptation_vK20(
XYZ, XYZ_w, XYZ_wr, coefficients=custom_coeffs
)# Zhai 2018 two-step adaptation with baseline illuminant
XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
XYZ_wb = np.array([0.95045593, 1.00000000, 1.08905775]) # Input illuminant
XYZ_wd = np.array([0.96429568, 1.00000000, 0.82510460]) # Output illuminant
XYZ_wo = np.array([100, 100, 100]) # Baseline illuminant
XYZ_adapted = chromatic_adaptation(
XYZ, XYZ_wb, XYZ_wd,
method="Zhai 2018",
D_b=0.9, # Degree of adaptation for input
D_d=0.95, # Degree of adaptation for output
XYZ_wo=XYZ_wo
)# Compute Von Kries adaptation matrix
XYZ_w = np.array([0.95045593, 1.00000000, 1.08905775])
XYZ_wr = np.array([0.96429568, 1.00000000, 0.82510460])
# Using CAT02 transform
M_cat = matrix_chromatic_adaptation_VonKries(XYZ_w, XYZ_wr, transform="CAT02")
# Apply matrix directly to adapt colors
XYZ_adapted_manual = XYZ @ M_cat.T
# vK20 adaptation matrix
M_vk20 = matrix_chromatic_adaptation_vk20(
XYZ_w, XYZ_wr,
coefficients=CONDITIONS_DEGREE_OF_ADAPTATION_VK20["Fairchild"]
)from typing import Literal, Union
from numpy.typing import NDArray
# Type aliases for chromatic adaptation
ArrayLike = Union[list, tuple, NDArray]
NDArrayFloat = NDArray[float]
LiteralChromaticAdaptationTransform = Literal[
"XYZ Scaling", "Von Kries", "Bradford", "Sharp", "Fairchild",
"CMCCAT97", "CMCCAT2000", "CAT02", "CAT02 Brill 2008", "CAT16",
"Bianco 2010", "Bianco PC 2010"
]
LiteralChromaticAdaptationMethod = Literal[
"CIE 1994", "CMCCAT2000", "Fairchild 1990",
"Von Kries", "Zhai 2018", "vK20"
]Most chromatic adaptation functions support dual domain/range scaling:
The scaling mode is controlled by the global domain-range scale setting.
Install with Tessl CLI
npx tessl i tessl/pypi-colour-science