Source code for colour.models.rgb.transfer_functions.arib_std_b67

"""
ARIB STD-B67 (Hybrid Log-Gamma)
===============================

Defines the *ARIB STD-B67 (Hybrid Log-Gamma)* opto-electrical transfer function
(OETF) and its inverse:

-   :func:`colour.models.oetf_ARIBSTDB67`
-   :func:`colour.models.oetf_inverse_ARIBSTDB67`

References
----------
-   :cite:`AssociationofRadioIndustriesandBusinesses2015a` : Association of
    Radio Industries and Businesses. (2015). Essential Parameter Values for the
    Extended Image Dynamic Range Television (EIDRTV) System for Programme
    Production.
    https://www.arib.or.jp/english/std_tr/broadcasting/desc/std-b67.html
"""

from __future__ import annotations

import numpy as np

from colour.hints import ArrayLike, NDArrayFloat
from colour.models.rgb.transfer_functions import gamma_function
from colour.utilities import (
    Structure,
    as_float,
    as_float_array,
    domain_range_scale,
    from_range_1,
    to_domain_1,
)

__author__ = "Colour Developers"
__copyright__ = "Copyright 2013 Colour Developers"
__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"

__all__ = [
    "CONSTANTS_ARIBSTDB67",
    "oetf_ARIBSTDB67",
    "oetf_inverse_ARIBSTDB67",
]

CONSTANTS_ARIBSTDB67: Structure = Structure(
    a=0.17883277, b=0.28466892, c=0.55991073
)
"""*ARIB STD-B67 (Hybrid Log-Gamma)* constants."""


[docs] def oetf_ARIBSTDB67( E: ArrayLike, r: ArrayLike = 0.5, constants: Structure = CONSTANTS_ARIBSTDB67, ) -> NDArrayFloat: """ Define *ARIB STD-B67 (Hybrid Log-Gamma)* opto-electrical transfer function (OETF). Parameters ---------- E Voltage normalised by the reference white level and proportional to the implicit light intensity that would be detected with a reference camera color channel R, G, B. r Video level corresponding to reference white level. constants *ARIB STD-B67 (Hybrid Log-Gamma)* constants. Returns ------- :class:`numpy.ndarray` Resulting non-linear signal :math:`E'`. Notes ----- +------------+-----------------------+---------------+ | **Domain** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``E`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ +------------+-----------------------+---------------+ | **Range** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``E_p`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ - This definition uses the *mirror* negative number handling mode of :func:`colour.models.gamma_function` definition to the sign of negative numbers. References ---------- :cite:`AssociationofRadioIndustriesandBusinesses2015a` Examples -------- >>> oetf_ARIBSTDB67(0.18) # doctest: +ELLIPSIS 0.2121320... """ E = to_domain_1(E) r = as_float_array(r) a = constants.a b = constants.b c = constants.c E_p = np.where( E <= 1, r * gamma_function(E, 0.5, "mirror"), a * np.log(E - b) + c ) return as_float(from_range_1(E_p))
[docs] def oetf_inverse_ARIBSTDB67( E_p: ArrayLike, r: ArrayLike = 0.5, constants: Structure = CONSTANTS_ARIBSTDB67, ) -> NDArrayFloat: """ Define *ARIB STD-B67 (Hybrid Log-Gamma)* inverse opto-electrical transfer function (OETF). Parameters ---------- E_p Non-linear signal :math:`E'`. r Video level corresponding to reference white level. constants *ARIB STD-B67 (Hybrid Log-Gamma)* constants. Returns ------- :class:`numpy.ndarray` Voltage :math:`E` normalised by the reference white level and proportional to the implicit light intensity that would be detected with a reference camera color channel R, G, B. Notes ----- +------------+-----------------------+---------------+ | **Domain** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``E_p`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ +------------+-----------------------+---------------+ | **Range** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``E`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ - This definition uses the *mirror* negative number handling mode of :func:`colour.models.gamma_function` definition to the sign of negative numbers. References ---------- :cite:`AssociationofRadioIndustriesandBusinesses2015a` Examples -------- >>> oetf_inverse_ARIBSTDB67(0.212132034355964) # doctest: +ELLIPSIS 0.1799999... """ E_p = to_domain_1(E_p) a = constants.a b = constants.b c = constants.c with domain_range_scale("ignore"): E = np.where( E_p <= oetf_ARIBSTDB67(1), gamma_function((E_p / r), 2, "mirror"), np.exp((E_p - c) / a) + b, ) return as_float(from_range_1(E))