Coverage for colour/models/rgb/ycocg.py: 100%
19 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-15 19:01 +1300
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-15 19:01 +1300
1"""
2YCoCg Colour Encoding
3=====================
5Define the *YCoCg* colour encoding related transformations:
7- :func:`colour.RGB_to_YCoCg`
8- :func:`colour.YCoCg_to_RGB`
10References
11----------
12- :cite:`Malvar2003` : Malvar, H., & Sullivan, G. (2003). YCoCg-R: A Color
13 Space with RGB Reversibility and Low Dynamic Range.
14 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/06/\
15Malvar_Sullivan_YCoCg-R_JVT-I014r3-2.pdf
16"""
18from __future__ import annotations
20import typing
22import numpy as np
24from colour.algebra import vecmul
26if typing.TYPE_CHECKING:
27 from colour.hints import ArrayLike, NDArrayFloat
29__author__ = "Colour Developers"
30__copyright__ = "Copyright 2013 Colour Developers"
31__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
32__maintainer__ = "Colour Developers"
33__email__ = "colour-developers@colour-science.org"
34__status__ = "Development"
36__all__ = [
37 "MATRIX_RGB_TO_YCOCG",
38 "MATRIX_YCOCG_TO_RGB",
39 "RGB_to_YCoCg",
40 "YCoCg_to_RGB",
41]
43MATRIX_RGB_TO_YCOCG: NDArrayFloat = np.array(
44 [
45 [1 / 4, 1 / 2, 1 / 4],
46 [1 / 2, 0, -1 / 2],
47 [-1 / 4, 1 / 2, -1 / 4],
48 ]
49)
50"""*R'G'B'* colourspace to *YCoCg* colour encoding matrix."""
52MATRIX_YCOCG_TO_RGB: NDArrayFloat = np.array(
53 [
54 [1, 1, -1],
55 [1, 0, 1],
56 [1, -1, -1],
57 ]
58)
59"""*YCoCg* colour encoding to *R'G'B'* colourspace matrix."""
62def RGB_to_YCoCg(RGB: ArrayLike) -> NDArrayFloat:
63 """
64 Convert an array of *R'G'B'* values to the corresponding *YCoCg* colour
65 encoding values array.
67 Parameters
68 ----------
69 RGB
70 Input *R'G'B'* array.
72 Returns
73 -------
74 :class:`numpy.ndarray`
75 *YCoCg* colour encoding array.
77 References
78 ----------
79 :cite:`Malvar2003`
81 Examples
82 --------
83 >>> RGB_to_YCoCg(np.array([1.0, 1.0, 1.0]))
84 array([ 1., 0., 0.])
85 >>> RGB_to_YCoCg(np.array([0.75, 0.5, 0.5]))
86 array([ 0.5625, 0.125 , -0.0625])
87 """
89 return vecmul(MATRIX_RGB_TO_YCOCG, RGB)
92def YCoCg_to_RGB(YCoCg: ArrayLike) -> NDArrayFloat:
93 """
94 Convert an array of *YCoCg* colour encoding values to the corresponding
95 *R'G'B'* values array.
97 Parameters
98 ----------
99 YCoCg
100 *YCoCg* colour encoding array.
102 Returns
103 -------
104 :class:`numpy.ndarray`
105 Output *R'G'B'* array.
107 References
108 ----------
109 :cite:`Malvar2003`
111 Examples
112 --------
113 >>> YCoCg_to_RGB(np.array([1.0, 0.0, 0.0]))
114 array([ 1., 1., 1.])
115 >>> YCoCg_to_RGB(np.array([0.5625, 0.125, -0.0625]))
116 array([ 0.75, 0.5 , 0.5 ])
117 """
119 return vecmul(MATRIX_YCOCG_TO_RGB, YCoCg)