Skip to content

Commit

Permalink
Implement support for programmatic polar conversions.
Browse files Browse the repository at this point in the history
  • Loading branch information
KelSolaar committed Jun 15, 2024
1 parent 93a54f5 commit 3e0561d
Show file tree
Hide file tree
Showing 8 changed files with 217 additions and 573 deletions.
13 changes: 13 additions & 0 deletions colour/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@
CCTF_ENCODINGS,
COLOUR_PRIMARIES_ITUTH273,
COLOURSPACE_MODELS,
COLOURSPACE_MODELS_POLAR_CONVERSION,
DATA_MACADAM_1942_ELLIPSES,
EOTF_INVERSES,
EOTFS,
Expand Down Expand Up @@ -677,6 +678,7 @@
"CMY_to_CMYK",
"CMY_to_RGB",
"COLOURSPACE_MODELS",
"COLOURSPACE_MODELS_POLAR_CONVERSION",
"COLOUR_PRIMARIES_ITUTH273",
"CV_range",
"DATA_MACADAM_1942_ELLIPSES",
Expand Down Expand Up @@ -899,6 +901,17 @@
"convert",
]

# Programmatically defining the colourspace models polar conversions.
for _Jab, _JCh in COLOURSPACE_MODELS_POLAR_CONVERSION:
for name in (f"{_Jab}_to_{_JCh}", f"{_JCh}_to_{_Jab}"):
_module = sys.modules["colour"]
_sub_module = sys.modules["colour.models"]
setattr(_module, name, getattr(_sub_module, name))
__all__.append(name)

del _JCh, _Jab, _module, _sub_module


__application_name__ = "Colour"

__major_version__ = "0"
Expand Down
47 changes: 39 additions & 8 deletions colour/graph/conversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
from __future__ import annotations

import inspect
import re
import sys
import textwrap
from collections import namedtuple
from copy import copy
Expand All @@ -20,6 +22,7 @@
import numpy as np

import colour
import colour.models
from colour.appearance import (
CAM16_to_XYZ,
CAM_Specification_CAM16,
Expand Down Expand Up @@ -71,6 +74,7 @@
cast,
)
from colour.models import (
COLOURSPACE_MODELS_POLAR_CONVERSION,
CAM02LCD_to_JMh_CIECAM02,
CAM02SCD_to_JMh_CIECAM02,
CAM02UCS_to_JMh_CIECAM02,
Expand Down Expand Up @@ -101,11 +105,7 @@
JMh_CIECAM02_to_CAM02SCD,
JMh_CIECAM02_to_CAM02UCS,
Jzazbz_to_XYZ,
Lab_to_LCHab,
Lab_to_XYZ,
LCHab_to_Lab,
LCHuv_to_Luv,
Luv_to_LCHuv,
Luv_to_uv,
Luv_to_XYZ,
Luv_uv_to_xy,
Expand Down Expand Up @@ -666,16 +666,12 @@ def mired_to_CCT_D_uv(mired: ArrayLike) -> NDArrayFloat:
("CIE xy", "CIE XYZ", xy_to_XYZ),
("CIE XYZ", "CIE Lab", XYZ_to_Lab),
("CIE Lab", "CIE XYZ", Lab_to_XYZ),
("CIE Lab", "CIE LCHab", Lab_to_LCHab),
("CIE LCHab", "CIE Lab", LCHab_to_Lab),
("CIE XYZ", "CIE Luv", XYZ_to_Luv),
("CIE Luv", "CIE XYZ", Luv_to_XYZ),
("CIE Luv", "CIE Luv uv", Luv_to_uv),
("CIE Luv uv", "CIE Luv", uv_to_Luv),
("CIE Luv uv", "CIE xy", Luv_uv_to_xy),
("CIE xy", "CIE Luv uv", xy_to_Luv_uv),
("CIE Luv", "CIE LCHuv", Luv_to_LCHuv),
("CIE LCHuv", "CIE Luv", LCHuv_to_Luv),
("CIE XYZ", "CIE UCS", XYZ_to_UCS),
("CIE UCS", "CIE XYZ", UCS_to_XYZ),
("CIE UCS", "CIE UCS uv", UCS_to_uv),
Expand Down Expand Up @@ -973,6 +969,41 @@ def mired_to_CCT_D_uv(mired: ArrayLike) -> NDArrayFloat:
the edge in the graph.
"""


# Programmatically defining the colourspace models polar conversions.


def _format_node_name(name):
"""Format given name by applying a series of substitutions."""

for pattern, substitution in [
("hdr_", "hdr-"),
("-CIELab", "-CIELAB"),
("_", " "),
("^Lab", "CIE Lab"),
("^LCHab", "CIE LCHab"),
("^Luv", "CIE Luv"),
("^LCHuv", "CIE LCHuv"),
("Ragoo2021", "Ragoo 2021"),
]:
name = re.sub(pattern, substitution, name)

return name


for _Jab, _JCh in COLOURSPACE_MODELS_POLAR_CONVERSION:
_module = sys.modules["colour.models"]
_Jab_name = _format_node_name(_Jab)
_JCh_name = _format_node_name(_JCh)
CONVERSION_SPECIFICATIONS_DATA.append(
(_Jab_name, _JCh_name, getattr(_module, f"{_Jab}_to_{_JCh}"))
)
CONVERSION_SPECIFICATIONS_DATA.append(
(_JCh_name, _Jab_name, getattr(_module, f"{_JCh}_to_{_Jab}"))
)

del _format_node_name, _JCh, _Jab, _module, _Jab_name, _JCh_name

CONVERSION_SPECIFICATIONS: list = [
Conversion_Specification(*specification)
for specification in CONVERSION_SPECIFICATIONS_DATA
Expand Down
129 changes: 121 additions & 8 deletions colour/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import sys

from colour.utilities import copy_definition
from colour.utilities.deprecation import ModuleAPI, build_API_changes
from colour.utilities.documentation import is_documentation_building

Expand Down Expand Up @@ -50,16 +51,14 @@
xy_to_XYZ,
XYZ_to_xy,
)
from .cie_lab import XYZ_to_Lab, Lab_to_XYZ, Lab_to_LCHab, LCHab_to_Lab
from .cie_lab import XYZ_to_Lab, Lab_to_XYZ
from .cie_luv import (
XYZ_to_Luv,
Luv_to_XYZ,
Luv_to_uv,
uv_to_Luv,
Luv_uv_to_xy,
xy_to_Luv_uv,
Luv_to_LCHuv,
LCHuv_to_Luv,
XYZ_to_CIE1976UCS,
CIE1976UCS_to_XYZ,
)
Expand Down Expand Up @@ -373,7 +372,125 @@
describe_video_signal_matrix_coefficients,
)

__all__ = [
__all__ = []

# Programmatically defining the colourspace models polar conversions.
COLOURSPACE_MODELS_POLAR_CONVERSION = (
("Lab", "LCHab"),
("Luv", "LCHuv"),
("hdr_CIELab", "hdr_CIELCHab"),
("Hunter_Lab", "Hunter_LCHab"),
("Hunter_Rdab", "Hunter_RdCHab"),
("ICaCb", "IaCH"),
("ICtCp", "ItCH"),
("IgPgTg", "IgCH"),
("IPT", "ICH"),
("Izazbz", "IzCH"),
("Jzazbz", "JzCH"),
("hdr_IPT", "hdr_ICH"),
("Oklab", "Oklch"),
("ProLab", "ProLCHab"),
("IPT_Ragoo2021", "ICHPT_Ragoo2021"),
)

_DOCSTRING_JAB_TO_JCH = """
Convert from *{Jab}* colourspace to *{JCh}* colourspace.
This is a convenient definition wrapping :func:`colour.models.Jab_to_JCh`
definition.
Parameters
----------
Jab
*{Jab}* colourspace array.
Returns
-------
:class:`numpy.ndarray`
*{JCh}* colourspace array.
Notes
-----
+------------+-----------------------+-----------------+
| **Domain** | **Scale - Reference** | **Scale - 1** |
+============+=======================+=================+
| ``Jab`` | ``J`` : [0, 100] | ``J`` : [0, 1] |
| | | |
| | ``a`` : [-100, 100] | ``a`` : [-1, 1] |
| | | |
| | ``b`` : [-100, 100] | ``b`` : [-1, 1] |
+------------+-----------------------+-----------------+
+------------+-----------------------+-----------------+
| **Range** | **Scale - Reference** | **Scale - 1** |
+============+=======================+=================+
| ``JCh`` | ``J`` : [0, 100] | ``J`` : [0, 1] |
| | | |
| | ``C`` : [0, 100] | ``C`` : [0, 1] |
| | | |
| | ``h`` : [0, 360] | ``h`` : [0, 1] |
+------------+-----------------------+-----------------+
"""

_DOCSTRING_JCH_TO_JAB = """
Convert from *{JCh}* colourspace to *{Jab}* colourspace.
This is a convenient definition wrapping :func:`colour.models.JCh_to_Jab`
definition.
Parameters
----------
JCh
*{JCh}* colourspace array.
Returns
-------
:class:`numpy.ndarray`
*{Jab}* colourspace array.
Notes
-----
+-------------+-----------------------+-----------------+
| **Domain** | **Scale - Reference** | **Scale - 1** |
+=============+=======================+=================+
| ``JCh`` | ``J`` : [0, 100] | ``J`` : [0, 1] |
| | | |
| | ``C`` : [0, 100] | ``C`` : [0, 1] |
| | | |
| | ``h`` : [0, 360] | ``h`` : [0, 1] |
+-------------+-----------------------+-----------------+
+-------------+-----------------------+-----------------+
| **Range** | **Scale - Reference** | **Scale - 1** |
+=============+=======================+=================+
| ``Jab`` | ``J`` : [0, 100] | ``J`` : [0, 1] |
| | | |
| | ``a`` : [-100, 100] | ``a`` : [-1, 1] |
| | | |
| | ``b`` : [-100, 100] | ``b`` : [-1, 1] |
+-------------+-----------------------+-----------------+
"""

for _Jab, _JCh in COLOURSPACE_MODELS_POLAR_CONVERSION:
name = f"{_Jab}_to_{_JCh}"
_callable = copy_definition(Jab_to_JCh, name)
_callable.__doc__ = _DOCSTRING_JAB_TO_JCH.format(Jab=_Jab, JCh=_JCh)
_module = sys.modules["colour.models"]
setattr(_module, name, _callable)
__all__.append(name)

name = f"{_JCh}_to_{_Jab}"
_callable = copy_definition(JCh_to_Jab, name)
_callable.__doc__ = _DOCSTRING_JCH_TO_JAB.format(JCh=_JCh, Jab=_Jab)
_module = sys.modules["colour.models"]
setattr(_module, name, _callable)
__all__.append(name)

del _DOCSTRING_JAB_TO_JCH, _DOCSTRING_JCH_TO_JAB, _JCh, _Jab, _callable, _module

__all__ += ["COLOURSPACE_MODELS_POLAR"]

__all__ += [
"COLOURSPACE_MODELS",
"COLOURSPACE_MODELS_AXIS_LABELS",
"COLOURSPACE_MODELS_DOMAIN_RANGE_SCALE_1_TO_REFERENCE",
Expand Down Expand Up @@ -421,8 +538,6 @@
__all__ += [
"XYZ_to_Lab",
"Lab_to_XYZ",
"Lab_to_LCHab",
"LCHab_to_Lab",
]
__all__ += [
"XYZ_to_Luv",
Expand All @@ -431,8 +546,6 @@
"uv_to_Luv",
"Luv_uv_to_xy",
"xy_to_Luv_uv",
"Luv_to_LCHuv",
"LCHuv_to_Luv",
"XYZ_to_CIE1976UCS",
"CIE1976UCS_to_XYZ",
]
Expand Down
Loading

0 comments on commit 3e0561d

Please sign in to comment.