Source code for colour.models.rgb.transfer_functions.xiaomi_mi_log
"""
Xiaomi Mi-Log Profile Log Encoding
==================================
Define the *Xiaomi Mi-Log Profile* log encoding.
- :func:`colour.models.log_encoding_MiLog`
- :func:`colour.models.log_decoding_MiLog`
References
----------
- :cite:`Zhang2024` : Xiaomi Inc. (2024). Xiaomi Log Profile White Paper.
December 2024.
"""
from __future__ import annotations
from colour.hints import ( # noqa: TC001
Domain1,
Range1,
)
from colour.utilities import Structure, optional
from .apple_log_profile import (
log_decoding_AppleLogProfile,
log_encoding_AppleLogProfile,
)
__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_MI_LOG",
"log_encoding_MiLog",
"log_decoding_MiLog",
]
CONSTANTS_MI_LOG: Structure = Structure(
R_0=-0.09023729,
R_t=0.01974185,
sigma=18.10531998, # 'c' in whitepaper, 'sigma' for Apple compatibility
beta=0.01384578,
gamma=0.09271529,
delta=0.67291850,
)
"""*Xiaomi Mi-Log Profile* constants."""
[docs]
def log_encoding_MiLog(
R: Domain1,
constants: Structure | None = None,
) -> Range1:
"""
Apply the *Xiaomi Mi-Log Profile* log encoding opto-electronic transfer
function (OETF).
Parameters
----------
R
Linear reflection data :math:`R`.
constants
*Xiaomi Mi-Log Profile* constants.
Returns
-------
:class:`numpy.ndarray`
Logarithmically encoded value :math:`P`.
References
----------
:cite:`Zhang2024`
Notes
-----
- The scene reflection signal :math:`R` captured by the camera is
represented using a floating point encoding. The :math:`R` value
of 0.18 corresponds to the signal produced by an 18% reflectance
reference gray chart.
+------------+-----------------------+---------------+
| **Domain** | **Scale - Reference** | **Scale - 1** |
+============+=======================+===============+
| ``R`` | 1 | 1 |
+------------+-----------------------+---------------+
+------------+-----------------------+---------------+
| **Range** | **Scale - Reference** | **Scale - 1** |
+============+=======================+===============+
| ``P`` | 1 | 1 |
+------------+-----------------------+---------------+
Examples
--------
>>> log_encoding_MiLog(0.18) # doctest: +ELLIPSIS
0.4534596...
"""
return log_encoding_AppleLogProfile(R, optional(constants, CONSTANTS_MI_LOG))
[docs]
def log_decoding_MiLog(
P: Domain1,
constants: Structure | None = None,
) -> Range1:
"""
Apply the *Xiaomi Mi-Log Profile* log decoding inverse opto-electronic transfer
function (OETF).
Parameters
----------
P
Logarithmically encoded value :math:`P`.
constants
*Xiaomi Mi-Log Profile* constants.
Returns
-------
:class:`numpy.ndarray`
Linear reflection data :math:`R`.
References
----------
:cite:`Zhang2024`
Notes
-----
- The captured pixel :math:`P` value uses floating point encoding
normalized to the [0, 1] range.
+------------+-----------------------+---------------+
| **Domain** | **Scale - Reference** | **Scale - 1** |
+============+=======================+===============+
| ``P`` | 1 | 1 |
+------------+-----------------------+---------------+
+------------+-----------------------+---------------+
| **Range** | **Scale - Reference** | **Scale - 1** |
+============+=======================+===============+
| ``R`` | 1 | 1 |
+------------+-----------------------+---------------+
Examples
--------
>>> log_decoding_MiLog(0.45345968) # doctest: +ELLIPSIS
0.1800000...
"""
return log_decoding_AppleLogProfile(P, optional(constants, CONSTANTS_MI_LOG))