Coverage for models/rgb/transfer_functions/tests/test_rimm_romm_rgb.py: 100%
185 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-16 22:49 +1300
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-16 22:49 +1300
1"""
2Define the unit tests for the
3:mod:`colour.models.rgb.transfer_functions.rimm_romm_rgb` module.
4"""
6import numpy as np
8from colour.constants import TOLERANCE_ABSOLUTE_TESTS
9from colour.models.rgb.transfer_functions import (
10 cctf_decoding_RIMMRGB,
11 cctf_decoding_ROMMRGB,
12 cctf_encoding_RIMMRGB,
13 cctf_encoding_ROMMRGB,
14 log_decoding_ERIMMRGB,
15 log_encoding_ERIMMRGB,
16)
17from colour.utilities import domain_range_scale, ignore_numpy_errors
19__author__ = "Colour Developers"
20__copyright__ = "Copyright 2013 Colour Developers"
21__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
22__maintainer__ = "Colour Developers"
23__email__ = "colour-developers@colour-science.org"
24__status__ = "Production"
26__all__ = [
27 "TestCctfEncoding_ROMMRGB",
28 "TestCctfDecoding_ROMMRGB",
29 "TestCctfEncoding_RIMMRGB",
30 "TestCctfDecoding_RIMMRGB",
31 "TestLog_encoding_ERIMMRGB",
32 "TestLog_decoding_ERIMMRGB",
33]
36class TestCctfEncoding_ROMMRGB:
37 """
38 Define :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
39cctf_encoding_ROMMRGB` definition unit tests methods.
40 """
42 def test_cctf_encoding_ROMMRGB(self) -> None:
43 """
44 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
45cctf_encoding_ROMMRGB` definition.
46 """
48 np.testing.assert_allclose(
49 cctf_encoding_ROMMRGB(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
50 )
52 np.testing.assert_allclose(
53 cctf_encoding_ROMMRGB(0.18),
54 0.385711424751138,
55 atol=TOLERANCE_ABSOLUTE_TESTS,
56 )
58 np.testing.assert_allclose(
59 cctf_encoding_ROMMRGB(1.0), 1.0, atol=TOLERANCE_ABSOLUTE_TESTS
60 )
62 assert cctf_encoding_ROMMRGB(0.18, out_int=True) == 98
64 assert cctf_encoding_ROMMRGB(0.18, bit_depth=12, out_int=True) == 1579
66 def test_n_dimensional_cctf_encoding_ROMMRGB(self) -> None:
67 """
68 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
69cctf_encoding_ROMMRGB` definition n-dimensional arrays support.
70 """
72 X = 0.18
73 X_ROMM = cctf_encoding_ROMMRGB(X)
75 X = np.tile(X, 6)
76 X_ROMM = np.tile(X_ROMM, 6)
77 np.testing.assert_allclose(
78 cctf_encoding_ROMMRGB(X), X_ROMM, atol=TOLERANCE_ABSOLUTE_TESTS
79 )
81 X = np.reshape(X, (2, 3))
82 X_ROMM = np.reshape(X_ROMM, (2, 3))
83 np.testing.assert_allclose(
84 cctf_encoding_ROMMRGB(X), X_ROMM, atol=TOLERANCE_ABSOLUTE_TESTS
85 )
87 X = np.reshape(X, (2, 3, 1))
88 X_ROMM = np.reshape(X_ROMM, (2, 3, 1))
89 np.testing.assert_allclose(
90 cctf_encoding_ROMMRGB(X), X_ROMM, atol=TOLERANCE_ABSOLUTE_TESTS
91 )
93 def test_domain_range_scale_cctf_encoding_ROMMRGB(self) -> None:
94 """
95 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
96cctf_encoding_ROMMRGB` definition domain and range scale support.
97 """
99 X = 0.18
100 X_p = cctf_encoding_ROMMRGB(X)
102 d_r = (("reference", 1), ("1", 1), ("100", 100))
103 for scale, factor in d_r:
104 with domain_range_scale(scale):
105 np.testing.assert_allclose(
106 cctf_encoding_ROMMRGB(X * factor),
107 X_p * factor,
108 atol=TOLERANCE_ABSOLUTE_TESTS,
109 )
111 @ignore_numpy_errors
112 def test_nan_cctf_encoding_ROMMRGB(self) -> None:
113 """
114 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
115cctf_encoding_ROMMRGB` definition nan support.
116 """
118 cctf_encoding_ROMMRGB(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
121class TestCctfDecoding_ROMMRGB:
122 """
123 Define :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.
124 cctf_decoding_ROMMRGB` definition unit tests methods.
125 """
127 def test_cctf_decoding_ROMMRGB(self) -> None:
128 """
129 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
130cctf_decoding_ROMMRGB` definition.
131 """
133 np.testing.assert_allclose(
134 cctf_decoding_ROMMRGB(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
135 )
137 np.testing.assert_allclose(
138 cctf_decoding_ROMMRGB(0.385711424751138),
139 0.18,
140 atol=TOLERANCE_ABSOLUTE_TESTS,
141 )
143 np.testing.assert_allclose(
144 cctf_decoding_ROMMRGB(1.0), 1.0, atol=TOLERANCE_ABSOLUTE_TESTS
145 )
147 np.testing.assert_allclose(
148 cctf_decoding_ROMMRGB(98, in_int=True),
149 0.18,
150 atol=0.01,
151 )
153 np.testing.assert_allclose(
154 cctf_decoding_ROMMRGB(1579, bit_depth=12, in_int=True),
155 0.18,
156 atol=0.001,
157 )
159 def test_n_dimensional_cctf_decoding_ROMMRGB(self) -> None:
160 """
161 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
162cctf_decoding_ROMMRGB` definition n-dimensional arrays support.
163 """
165 X_p = 0.385711424751138
166 X = cctf_decoding_ROMMRGB(X_p)
168 X_p = np.tile(X_p, 6)
169 X = np.tile(X, 6)
170 np.testing.assert_allclose(
171 cctf_decoding_ROMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
172 )
174 X_p = np.reshape(X_p, (2, 3))
175 X = np.reshape(X, (2, 3))
176 np.testing.assert_allclose(
177 cctf_decoding_ROMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
178 )
180 X_p = np.reshape(X_p, (2, 3, 1))
181 X = np.reshape(X, (2, 3, 1))
182 np.testing.assert_allclose(
183 cctf_decoding_ROMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
184 )
186 def test_domain_range_scale_cctf_decoding_ROMMRGB(self) -> None:
187 """
188 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
189cctf_decoding_ROMMRGB` definition domain and range scale support.
190 """
192 X_p = 0.385711424751138
193 X = cctf_decoding_ROMMRGB(X_p)
195 d_r = (("reference", 1), ("1", 1), ("100", 100))
196 for scale, factor in d_r:
197 with domain_range_scale(scale):
198 np.testing.assert_allclose(
199 cctf_decoding_ROMMRGB(X_p * factor),
200 X * factor,
201 atol=TOLERANCE_ABSOLUTE_TESTS,
202 )
204 @ignore_numpy_errors
205 def test_nan_cctf_decoding_ROMMRGB(self) -> None:
206 """
207 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
208cctf_decoding_ROMMRGB` definition nan support.
209 """
211 cctf_decoding_ROMMRGB(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
214class TestCctfEncoding_RIMMRGB:
215 """
216 Define :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
217cctf_encoding_RIMMRGB` definition unit tests methods.
218 """
220 def test_cctf_encoding_RIMMRGB(self) -> None:
221 """
222 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
223cctf_encoding_RIMMRGB` definition.
224 """
226 np.testing.assert_allclose(
227 cctf_encoding_RIMMRGB(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
228 )
230 np.testing.assert_allclose(
231 cctf_encoding_RIMMRGB(0.18),
232 0.291673732475746,
233 atol=TOLERANCE_ABSOLUTE_TESTS,
234 )
236 np.testing.assert_allclose(
237 cctf_encoding_RIMMRGB(1.0),
238 0.713125234297525,
239 atol=TOLERANCE_ABSOLUTE_TESTS,
240 )
242 assert cctf_encoding_RIMMRGB(0.18, out_int=True) == 74
244 assert cctf_encoding_RIMMRGB(0.18, bit_depth=12, out_int=True) == 1194
246 def test_n_dimensional_cctf_encoding_RIMMRGB(self) -> None:
247 """
248 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
249cctf_encoding_RIMMRGB` definition n-dimensional arrays support.
250 """
252 X = 0.18
253 X_p = cctf_encoding_RIMMRGB(X)
255 X = np.tile(X, 6)
256 X_p = np.tile(X_p, 6)
257 np.testing.assert_allclose(
258 cctf_encoding_RIMMRGB(X), X_p, atol=TOLERANCE_ABSOLUTE_TESTS
259 )
261 X = np.reshape(X, (2, 3))
262 X_p = np.reshape(X_p, (2, 3))
263 np.testing.assert_allclose(
264 cctf_encoding_RIMMRGB(X), X_p, atol=TOLERANCE_ABSOLUTE_TESTS
265 )
267 X = np.reshape(X, (2, 3, 1))
268 X_p = np.reshape(X_p, (2, 3, 1))
269 np.testing.assert_allclose(
270 cctf_encoding_RIMMRGB(X), X_p, atol=TOLERANCE_ABSOLUTE_TESTS
271 )
273 def test_domain_range_scale_cctf_encoding_RIMMRGB(self) -> None:
274 """
275 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
276cctf_encoding_RIMMRGB` definition domain and range scale support.
277 """
279 X = 0.18
280 X_p = cctf_encoding_RIMMRGB(X)
282 d_r = (("reference", 1), ("1", 1), ("100", 100))
283 for scale, factor in d_r:
284 with domain_range_scale(scale):
285 np.testing.assert_allclose(
286 cctf_encoding_RIMMRGB(X * factor),
287 X_p * factor,
288 atol=TOLERANCE_ABSOLUTE_TESTS,
289 )
291 @ignore_numpy_errors
292 def test_nan_cctf_encoding_RIMMRGB(self) -> None:
293 """
294 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
295cctf_encoding_RIMMRGB` definition nan support.
296 """
298 cctf_encoding_RIMMRGB(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
301class TestCctfDecoding_RIMMRGB:
302 """
303 Define :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.
304 cctf_decoding_RIMMRGB` definition unit tests methods.
305 """
307 def test_cctf_decoding_RIMMRGB(self) -> None:
308 """
309 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
310cctf_decoding_RIMMRGB` definition.
311 """
313 np.testing.assert_allclose(
314 cctf_decoding_RIMMRGB(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
315 )
317 np.testing.assert_allclose(
318 cctf_decoding_RIMMRGB(0.291673732475746),
319 0.18,
320 atol=TOLERANCE_ABSOLUTE_TESTS,
321 )
323 np.testing.assert_allclose(
324 cctf_decoding_RIMMRGB(0.713125234297525),
325 1.0,
326 atol=TOLERANCE_ABSOLUTE_TESTS,
327 )
329 np.testing.assert_allclose(
330 cctf_decoding_RIMMRGB(74, in_int=True),
331 0.18,
332 atol=0.005,
333 )
335 np.testing.assert_allclose(
336 cctf_decoding_RIMMRGB(1194, bit_depth=12, in_int=True),
337 0.18,
338 atol=0.005,
339 )
341 def test_n_dimensional_cctf_decoding_RIMMRGB(self) -> None:
342 """
343 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
344cctf_decoding_RIMMRGB` definition n-dimensional arrays support.
345 """
347 X_p = 0.291673732475746
348 X = cctf_decoding_RIMMRGB(X_p)
350 X_p = np.tile(X_p, 6)
351 X = np.tile(X, 6)
352 np.testing.assert_allclose(
353 cctf_decoding_RIMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
354 )
356 X_p = np.reshape(X_p, (2, 3))
357 X = np.reshape(X, (2, 3))
358 np.testing.assert_allclose(
359 cctf_decoding_RIMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
360 )
362 X_p = np.reshape(X_p, (2, 3, 1))
363 X = np.reshape(X, (2, 3, 1))
364 np.testing.assert_allclose(
365 cctf_decoding_RIMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
366 )
368 def test_domain_range_scale_cctf_decoding_RIMMRGB(self) -> None:
369 """
370 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
371cctf_decoding_RIMMRGB` definition domain and range scale support.
372 """
374 X_p = 0.291673732475746
375 X = cctf_decoding_RIMMRGB(X_p)
377 d_r = (("reference", 1), ("1", 1), ("100", 100))
378 for scale, factor in d_r:
379 with domain_range_scale(scale):
380 np.testing.assert_allclose(
381 cctf_decoding_RIMMRGB(X_p * factor),
382 X * factor,
383 atol=TOLERANCE_ABSOLUTE_TESTS,
384 )
386 @ignore_numpy_errors
387 def test_nan_cctf_decoding_RIMMRGB(self) -> None:
388 """
389 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
390cctf_decoding_RIMMRGB` definition nan support.
391 """
393 cctf_decoding_RIMMRGB(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
396class TestLog_encoding_ERIMMRGB:
397 """
398 Define :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
399log_encoding_ERIMMRGB` definition unit tests methods.
400 """
402 def test_log_encoding_ERIMMRGB(self) -> None:
403 """
404 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
405log_encoding_ERIMMRGB` definition.
406 """
408 np.testing.assert_allclose(
409 log_encoding_ERIMMRGB(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
410 )
412 np.testing.assert_allclose(
413 log_encoding_ERIMMRGB(0.18),
414 0.410052389492129,
415 atol=TOLERANCE_ABSOLUTE_TESTS,
416 )
418 np.testing.assert_allclose(
419 log_encoding_ERIMMRGB(1.0),
420 0.545458327405113,
421 atol=TOLERANCE_ABSOLUTE_TESTS,
422 )
424 assert log_encoding_ERIMMRGB(0.18, out_int=True) == 105
426 assert log_encoding_ERIMMRGB(0.18, bit_depth=12, out_int=True) == 1679
428 def test_n_dimensional_log_encoding_ERIMMRGB(self) -> None:
429 """
430 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
431log_encoding_ERIMMRGB` definition n-dimensional arrays support.
432 """
434 X = 0.18
435 X_p = log_encoding_ERIMMRGB(X)
437 X = np.tile(X, 6)
438 X_p = np.tile(X_p, 6)
439 np.testing.assert_allclose(
440 log_encoding_ERIMMRGB(X), X_p, atol=TOLERANCE_ABSOLUTE_TESTS
441 )
443 X = np.reshape(X, (2, 3))
444 X_p = np.reshape(X_p, (2, 3))
445 np.testing.assert_allclose(
446 log_encoding_ERIMMRGB(X), X_p, atol=TOLERANCE_ABSOLUTE_TESTS
447 )
449 X = np.reshape(X, (2, 3, 1))
450 X_p = np.reshape(X_p, (2, 3, 1))
451 np.testing.assert_allclose(
452 log_encoding_ERIMMRGB(X), X_p, atol=TOLERANCE_ABSOLUTE_TESTS
453 )
455 def test_domain_range_scale_log_encoding_ERIMMRGB(self) -> None:
456 """
457 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
458log_encoding_ERIMMRGB` definition domain and range scale support.
459 """
461 X = 0.18
462 X_p = log_encoding_ERIMMRGB(X)
464 d_r = (("reference", 1), ("1", 1), ("100", 100))
465 for scale, factor in d_r:
466 with domain_range_scale(scale):
467 np.testing.assert_allclose(
468 log_encoding_ERIMMRGB(X * factor),
469 X_p * factor,
470 atol=TOLERANCE_ABSOLUTE_TESTS,
471 )
473 @ignore_numpy_errors
474 def test_nan_log_encoding_ERIMMRGB(self) -> None:
475 """
476 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
477log_encoding_ERIMMRGB` definition nan support.
478 """
480 log_encoding_ERIMMRGB(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
483class TestLog_decoding_ERIMMRGB:
484 """
485 Define :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.
486 log_decoding_ERIMMRGB` definition unit tests methods.
487 """
489 def test_log_decoding_ERIMMRGB(self) -> None:
490 """
491 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
492log_decoding_ERIMMRGB` definition.
493 """
495 np.testing.assert_allclose(
496 log_decoding_ERIMMRGB(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
497 )
499 np.testing.assert_allclose(
500 log_decoding_ERIMMRGB(0.410052389492129),
501 0.18,
502 atol=TOLERANCE_ABSOLUTE_TESTS,
503 )
505 np.testing.assert_allclose(
506 log_decoding_ERIMMRGB(0.545458327405113),
507 1.0,
508 atol=TOLERANCE_ABSOLUTE_TESTS,
509 )
511 np.testing.assert_allclose(
512 log_decoding_ERIMMRGB(105, in_int=True),
513 0.18,
514 atol=0.005,
515 )
517 np.testing.assert_allclose(
518 log_decoding_ERIMMRGB(1679, bit_depth=12, in_int=True),
519 0.18,
520 atol=0.005,
521 )
523 def test_n_dimensional_log_decoding_ERIMMRGB(self) -> None:
524 """
525 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
526log_decoding_ERIMMRGB` definition n-dimensional arrays support.
527 """
529 X_p = 0.410052389492129
530 X = log_decoding_ERIMMRGB(X_p)
532 X_p = np.tile(X_p, 6)
533 X = np.tile(X, 6)
534 np.testing.assert_allclose(
535 log_decoding_ERIMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
536 )
538 X_p = np.reshape(X_p, (2, 3))
539 X = np.reshape(X, (2, 3))
540 np.testing.assert_allclose(
541 log_decoding_ERIMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
542 )
544 X_p = np.reshape(X_p, (2, 3, 1))
545 X = np.reshape(X, (2, 3, 1))
546 np.testing.assert_allclose(
547 log_decoding_ERIMMRGB(X_p), X, atol=TOLERANCE_ABSOLUTE_TESTS
548 )
550 def test_domain_range_scale_log_decoding_ERIMMRGB(self) -> None:
551 """
552 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
553log_decoding_ERIMMRGB` definition domain and range scale support.
554 """
556 X_p = 0.410052389492129
557 X = log_decoding_ERIMMRGB(X_p)
559 d_r = (("reference", 1), ("1", 1), ("100", 100))
560 for scale, factor in d_r:
561 with domain_range_scale(scale):
562 np.testing.assert_allclose(
563 log_decoding_ERIMMRGB(X_p * factor),
564 X * factor,
565 atol=TOLERANCE_ABSOLUTE_TESTS,
566 )
568 @ignore_numpy_errors
569 def test_nan_log_decoding_ERIMMRGB(self) -> None:
570 """
571 Test :func:`colour.models.rgb.transfer_functions.rimm_romm_rgb.\
572log_decoding_ERIMMRGB` definition nan support.
573 """
575 log_decoding_ERIMMRGB(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))