Coverage for colour/models/rgb/transfer_functions/tests/test_itur_bt_601.py: 100%
67 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"""
2Define the unit tests for the
3:mod:`colour.models.rgb.transfer_functions.itur_bt_601` module.
4"""
6import numpy as np
8from colour.constants import TOLERANCE_ABSOLUTE_TESTS
9from colour.models.rgb.transfer_functions import oetf_BT601, oetf_inverse_BT601
10from colour.utilities import domain_range_scale, ignore_numpy_errors
12__author__ = "Colour Developers"
13__copyright__ = "Copyright 2013 Colour Developers"
14__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
15__maintainer__ = "Colour Developers"
16__email__ = "colour-developers@colour-science.org"
17__status__ = "Production"
19__all__ = [
20 "TestOetf_BT601",
21 "TestOetf_inverse_BT601",
22]
25class TestOetf_BT601:
26 """
27 Define :func:`colour.models.rgb.transfer_functions.itur_bt_601.oetf_BT601`
28 definition unit tests methods.
29 """
31 def test_oetf_BT601(self) -> None:
32 """
33 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
34oetf_BT601` definition.
35 """
37 np.testing.assert_allclose(oetf_BT601(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS)
39 np.testing.assert_allclose(
40 oetf_BT601(0.015), 0.067500000000000, atol=TOLERANCE_ABSOLUTE_TESTS
41 )
43 np.testing.assert_allclose(
44 oetf_BT601(0.18), 0.409007728864150, atol=TOLERANCE_ABSOLUTE_TESTS
45 )
47 np.testing.assert_allclose(oetf_BT601(1.0), 1.0, atol=TOLERANCE_ABSOLUTE_TESTS)
49 def test_n_dimensional_oetf_BT601(self) -> None:
50 """
51 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
52oetf_BT601` definition n-dimensional arrays support.
53 """
55 L = 0.18
56 E = oetf_BT601(L)
58 L = np.tile(L, 6)
59 E = np.tile(E, 6)
60 np.testing.assert_allclose(oetf_BT601(L), E, atol=TOLERANCE_ABSOLUTE_TESTS)
62 L = np.reshape(L, (2, 3))
63 E = np.reshape(E, (2, 3))
64 np.testing.assert_allclose(oetf_BT601(L), E, atol=TOLERANCE_ABSOLUTE_TESTS)
66 L = np.reshape(L, (2, 3, 1))
67 E = np.reshape(E, (2, 3, 1))
68 np.testing.assert_allclose(oetf_BT601(L), E, atol=TOLERANCE_ABSOLUTE_TESTS)
70 def test_domain_range_scale_oetf_BT601(self) -> None:
71 """
72 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
73oetf_BT601` definition domain and range scale support.
74 """
76 L = 0.18
77 E = oetf_BT601(L)
79 d_r = (("reference", 1), ("1", 1), ("100", 100))
80 for scale, factor in d_r:
81 with domain_range_scale(scale):
82 np.testing.assert_allclose(
83 oetf_BT601(L * factor),
84 E * factor,
85 atol=TOLERANCE_ABSOLUTE_TESTS,
86 )
88 @ignore_numpy_errors
89 def test_nan_oetf_BT601(self) -> None:
90 """
91 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
92oetf_BT601` definition nan support.
93 """
95 oetf_BT601(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
98class TestOetf_inverse_BT601:
99 """
100 Define :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
101oetf_inverse_BT601` definition unit tests methods.
102 """
104 def test_oetf_inverse_BT601(self) -> None:
105 """
106 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
107oetf_inverse_BT601` definition.
108 """
110 np.testing.assert_allclose(
111 oetf_inverse_BT601(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
112 )
114 np.testing.assert_allclose(
115 oetf_inverse_BT601(0.067500000000000),
116 0.015,
117 atol=TOLERANCE_ABSOLUTE_TESTS,
118 )
120 np.testing.assert_allclose(
121 oetf_inverse_BT601(0.409007728864150),
122 0.18,
123 atol=TOLERANCE_ABSOLUTE_TESTS,
124 )
126 np.testing.assert_allclose(
127 oetf_inverse_BT601(1.0), 1.0, atol=TOLERANCE_ABSOLUTE_TESTS
128 )
130 def test_n_dimensional_oetf_inverse_BT601(self) -> None:
131 """
132 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
133oetf_inverse_BT601` definition n-dimensional arrays support.
134 """
136 E = 0.409007728864150
137 L = oetf_inverse_BT601(E)
139 E = np.tile(E, 6)
140 L = np.tile(L, 6)
141 np.testing.assert_allclose(
142 oetf_inverse_BT601(E), L, atol=TOLERANCE_ABSOLUTE_TESTS
143 )
145 E = np.reshape(E, (2, 3))
146 L = np.reshape(L, (2, 3))
147 np.testing.assert_allclose(
148 oetf_inverse_BT601(E), L, atol=TOLERANCE_ABSOLUTE_TESTS
149 )
151 E = np.reshape(E, (2, 3, 1))
152 L = np.reshape(L, (2, 3, 1))
153 np.testing.assert_allclose(
154 oetf_inverse_BT601(E), L, atol=TOLERANCE_ABSOLUTE_TESTS
155 )
157 def test_domain_range_scale_oetf_inverse_BT601(self) -> None:
158 """
159 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
160oetf_inverse_BT601` definition domain and range scale support.
161 """
163 E = 0.409007728864150
164 L = oetf_inverse_BT601(E)
166 d_r = (("reference", 1), ("1", 1), ("100", 100))
167 for scale, factor in d_r:
168 with domain_range_scale(scale):
169 np.testing.assert_allclose(
170 oetf_inverse_BT601(E * factor),
171 L * factor,
172 atol=TOLERANCE_ABSOLUTE_TESTS,
173 )
175 @ignore_numpy_errors
176 def test_nan_oetf_inverse_BT601(self) -> None:
177 """
178 Test :func:`colour.models.rgb.transfer_functions.itur_bt_601.\
179oetf_inverse_BT601` definition nan support.
180 """
182 oetf_inverse_BT601(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))