Coverage for models/rgb/transfer_functions/tests/test_sony.py: 100%
191 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.sony` module.
4"""
6import numpy as np
8from colour.constants import TOLERANCE_ABSOLUTE_TESTS
9from colour.models.rgb.transfer_functions import (
10 log_decoding_SLog,
11 log_decoding_SLog2,
12 log_decoding_SLog3,
13 log_encoding_SLog,
14 log_encoding_SLog2,
15 log_encoding_SLog3,
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 "TestLogEncoding_SLog",
28 "TestLogDecoding_SLog",
29 "TestLogEncoding_SLog2",
30 "TestLogDecoding_SLog2",
31 "TestLogEncoding_SLog3",
32 "TestLogDecoding_SLog3",
33]
36class TestLogEncoding_SLog:
37 """
38 Define :func:`colour.models.rgb.transfer_functions.sony.\
39log_encoding_SLog` definition unit tests methods.
40 """
42 def test_log_encoding_SLog(self) -> None:
43 """
44 Test :func:`colour.models.rgb.transfer_functions.sony.\
45log_encoding_SLog` definition.
46 """
48 np.testing.assert_allclose(
49 log_encoding_SLog(0.0),
50 0.088251291513446,
51 atol=TOLERANCE_ABSOLUTE_TESTS,
52 )
54 np.testing.assert_allclose(
55 log_encoding_SLog(0.18),
56 0.384970815928670,
57 atol=TOLERANCE_ABSOLUTE_TESTS,
58 )
60 np.testing.assert_allclose(
61 log_encoding_SLog(0.18, 12),
62 0.384688786026891,
63 atol=TOLERANCE_ABSOLUTE_TESTS,
64 )
66 np.testing.assert_allclose(
67 log_encoding_SLog(0.18, 10, False),
68 0.376512722254600,
69 atol=TOLERANCE_ABSOLUTE_TESTS,
70 )
72 np.testing.assert_allclose(
73 log_encoding_SLog(0.18, 10, False, False),
74 0.359987846422154,
75 atol=TOLERANCE_ABSOLUTE_TESTS,
76 )
78 np.testing.assert_allclose(
79 log_encoding_SLog(1.0),
80 0.638551684622532,
81 atol=TOLERANCE_ABSOLUTE_TESTS,
82 )
84 def test_n_dimensional_log_encoding_SLog(self) -> None:
85 """
86 Test :func:`colour.models.rgb.transfer_functions.sony.\
87log_encoding_SLog` definition n-dimensional arrays support.
88 """
90 x = 0.18
91 y = log_encoding_SLog(x)
93 x = np.tile(x, 6)
94 y = np.tile(y, 6)
95 np.testing.assert_allclose(
96 log_encoding_SLog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
97 )
99 x = np.reshape(x, (2, 3))
100 y = np.reshape(y, (2, 3))
101 np.testing.assert_allclose(
102 log_encoding_SLog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
103 )
105 x = np.reshape(x, (2, 3, 1))
106 y = np.reshape(y, (2, 3, 1))
107 np.testing.assert_allclose(
108 log_encoding_SLog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
109 )
111 def test_domain_range_scale_log_encoding_SLog(self) -> None:
112 """
113 Test :func:`colour.models.rgb.transfer_functions.sony.\
114log_encoding_SLog` definition domain and range scale support.
115 """
117 x = 0.18
118 y = log_encoding_SLog(x)
120 d_r = (("reference", 1), ("1", 1), ("100", 100))
121 for scale, factor in d_r:
122 with domain_range_scale(scale):
123 np.testing.assert_allclose(
124 log_encoding_SLog(x * factor),
125 y * factor,
126 atol=TOLERANCE_ABSOLUTE_TESTS,
127 )
129 @ignore_numpy_errors
130 def test_nan_log_encoding_SLog(self) -> None:
131 """
132 Test :func:`colour.models.rgb.transfer_functions.sony.\
133log_encoding_SLog` definition nan support.
134 """
136 log_encoding_SLog(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
139class TestLogDecoding_SLog:
140 """
141 Define :func:`colour.models.rgb.transfer_functions.sony.\
142log_decoding_SLog` definition unit tests methods.
143 """
145 def test_log_decoding_SLog(self) -> None:
146 """
147 Test :func:`colour.models.rgb.transfer_functions.sony.\
148log_decoding_SLog` definition.
149 """
151 np.testing.assert_allclose(
152 log_decoding_SLog(0.088251291513446),
153 0.0,
154 atol=TOLERANCE_ABSOLUTE_TESTS,
155 )
157 np.testing.assert_allclose(
158 log_decoding_SLog(0.384970815928670),
159 0.18,
160 atol=TOLERANCE_ABSOLUTE_TESTS,
161 )
163 np.testing.assert_allclose(
164 log_decoding_SLog(0.384688786026891, 12),
165 0.18,
166 atol=TOLERANCE_ABSOLUTE_TESTS,
167 )
169 np.testing.assert_allclose(
170 log_decoding_SLog(0.376512722254600, 10, False),
171 0.18,
172 atol=TOLERANCE_ABSOLUTE_TESTS,
173 )
175 np.testing.assert_allclose(
176 log_decoding_SLog(0.359987846422154, 10, False, False),
177 0.18,
178 atol=TOLERANCE_ABSOLUTE_TESTS,
179 )
181 np.testing.assert_allclose(
182 log_decoding_SLog(0.638551684622532),
183 1.0,
184 atol=TOLERANCE_ABSOLUTE_TESTS,
185 )
187 def test_n_dimensional_log_decoding_SLog(self) -> None:
188 """
189 Test :func:`colour.models.rgb.transfer_functions.sony.\
190log_decoding_SLog` definition n-dimensional arrays support.
191 """
193 y = 0.384970815928670
194 x = log_decoding_SLog(y)
196 y = np.tile(y, 6)
197 x = np.tile(x, 6)
198 np.testing.assert_allclose(
199 log_decoding_SLog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
200 )
202 y = np.reshape(y, (2, 3))
203 x = np.reshape(x, (2, 3))
204 np.testing.assert_allclose(
205 log_decoding_SLog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
206 )
208 y = np.reshape(y, (2, 3, 1))
209 x = np.reshape(x, (2, 3, 1))
210 np.testing.assert_allclose(
211 log_decoding_SLog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
212 )
214 def test_domain_range_scale_log_decoding_SLog(self) -> None:
215 """
216 Test :func:`colour.models.rgb.transfer_functions.sony.\
217log_decoding_SLog` definition domain and range scale support.
218 """
220 y = 0.384970815928670
221 x = log_decoding_SLog(y)
223 d_r = (("reference", 1), ("1", 1), ("100", 100))
224 for scale, factor in d_r:
225 with domain_range_scale(scale):
226 np.testing.assert_allclose(
227 log_decoding_SLog(y * factor),
228 x * factor,
229 atol=TOLERANCE_ABSOLUTE_TESTS,
230 )
232 @ignore_numpy_errors
233 def test_nan_log_decoding_SLog(self) -> None:
234 """
235 Test :func:`colour.models.rgb.transfer_functions.sony.\
236log_decoding_SLog` definition nan support.
237 """
239 log_decoding_SLog(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
242class TestLogEncoding_SLog2:
243 """
244 Define :func:`colour.models.rgb.transfer_functions.sony.\
245log_encoding_SLog2` definition unit tests methods.
246 """
248 def test_log_encoding_SLog2(self) -> None:
249 """
250 Test :func:`colour.models.rgb.transfer_functions.sony.\
251log_encoding_SLog2` definition.
252 """
254 np.testing.assert_allclose(
255 log_encoding_SLog2(0.0),
256 0.088251291513446,
257 atol=TOLERANCE_ABSOLUTE_TESTS,
258 )
260 np.testing.assert_allclose(
261 log_encoding_SLog2(0.18),
262 0.339532524633774,
263 atol=TOLERANCE_ABSOLUTE_TESTS,
264 )
266 np.testing.assert_allclose(
267 log_encoding_SLog2(0.18, 12),
268 0.339283782857486,
269 atol=TOLERANCE_ABSOLUTE_TESTS,
270 )
272 np.testing.assert_allclose(
273 log_encoding_SLog2(0.18, 10, False),
274 0.323449512215013,
275 atol=TOLERANCE_ABSOLUTE_TESTS,
276 )
278 np.testing.assert_allclose(
279 log_encoding_SLog2(0.18, 10, False, False),
280 0.307980741258647,
281 atol=TOLERANCE_ABSOLUTE_TESTS,
282 )
284 np.testing.assert_allclose(
285 log_encoding_SLog2(1.0),
286 0.585091059564112,
287 atol=TOLERANCE_ABSOLUTE_TESTS,
288 )
290 def test_n_dimensional_log_encoding_SLog2(self) -> None:
291 """
292 Test :func:`colour.models.rgb.transfer_functions.sony.\
293log_encoding_SLog2` definition n-dimensional arrays support.
294 """
296 x = 0.18
297 y = log_encoding_SLog2(x)
299 x = np.tile(x, 6)
300 y = np.tile(y, 6)
301 np.testing.assert_allclose(
302 log_encoding_SLog2(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
303 )
305 x = np.reshape(x, (2, 3))
306 y = np.reshape(y, (2, 3))
307 np.testing.assert_allclose(
308 log_encoding_SLog2(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
309 )
311 x = np.reshape(x, (2, 3, 1))
312 y = np.reshape(y, (2, 3, 1))
313 np.testing.assert_allclose(
314 log_encoding_SLog2(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
315 )
317 def test_domain_range_scale_log_encoding_SLog2(self) -> None:
318 """
319 Test :func:`colour.models.rgb.transfer_functions.sony.\
320log_encoding_SLog2` definition domain and range scale support.
321 """
323 x = 0.18
324 y = log_encoding_SLog2(x)
326 d_r = (("reference", 1), ("1", 1), ("100", 100))
327 for scale, factor in d_r:
328 with domain_range_scale(scale):
329 np.testing.assert_allclose(
330 log_encoding_SLog2(x * factor),
331 y * factor,
332 atol=TOLERANCE_ABSOLUTE_TESTS,
333 )
335 @ignore_numpy_errors
336 def test_nan_log_encoding_SLog2(self) -> None:
337 """
338 Test :func:`colour.models.rgb.transfer_functions.sony.\
339log_encoding_SLog2` definition nan support.
340 """
342 log_encoding_SLog2(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
345class TestLogDecoding_SLog2:
346 """
347 Define :func:`colour.models.rgb.transfer_functions.sony.\
348log_decoding_SLog2` definition unit tests methods.
349 """
351 def test_log_decoding_SLog2(self) -> None:
352 """
353 Test :func:`colour.models.rgb.transfer_functions.sony.\
354log_decoding_SLog2` definition.
355 """
357 np.testing.assert_allclose(
358 log_decoding_SLog2(0.088251291513446),
359 0.0,
360 atol=TOLERANCE_ABSOLUTE_TESTS,
361 )
363 np.testing.assert_allclose(
364 log_decoding_SLog2(0.339532524633774),
365 0.18,
366 atol=TOLERANCE_ABSOLUTE_TESTS,
367 )
369 np.testing.assert_allclose(
370 log_decoding_SLog2(0.339283782857486, 12),
371 0.18,
372 atol=TOLERANCE_ABSOLUTE_TESTS,
373 )
375 np.testing.assert_allclose(
376 log_decoding_SLog2(0.323449512215013, 10, False),
377 0.18,
378 atol=TOLERANCE_ABSOLUTE_TESTS,
379 )
381 np.testing.assert_allclose(
382 log_decoding_SLog2(0.307980741258647, 10, False, False),
383 0.18,
384 atol=TOLERANCE_ABSOLUTE_TESTS,
385 )
387 np.testing.assert_allclose(
388 log_decoding_SLog2(0.585091059564112),
389 1.0,
390 atol=TOLERANCE_ABSOLUTE_TESTS,
391 )
393 def test_n_dimensional_log_decoding_SLog2(self) -> None:
394 """
395 Test :func:`colour.models.rgb.transfer_functions.sony.\
396log_decoding_SLog2` definition n-dimensional arrays support.
397 """
399 y = 0.339532524633774
400 x = log_decoding_SLog2(y)
402 y = np.tile(y, 6)
403 x = np.tile(x, 6)
404 np.testing.assert_allclose(
405 log_decoding_SLog2(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
406 )
408 y = np.reshape(y, (2, 3))
409 x = np.reshape(x, (2, 3))
410 np.testing.assert_allclose(
411 log_decoding_SLog2(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
412 )
414 y = np.reshape(y, (2, 3, 1))
415 x = np.reshape(x, (2, 3, 1))
416 np.testing.assert_allclose(
417 log_decoding_SLog2(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
418 )
420 def test_domain_range_scale_log_decoding_SLog2(self) -> None:
421 """
422 Test :func:`colour.models.rgb.transfer_functions.sony.\
423log_decoding_SLog2` definition domain and range scale support.
424 """
426 y = 0.339532524633774
427 x = log_decoding_SLog2(y)
429 d_r = (("reference", 1), ("1", 1), ("100", 100))
430 for scale, factor in d_r:
431 with domain_range_scale(scale):
432 np.testing.assert_allclose(
433 log_decoding_SLog2(y * factor),
434 x * factor,
435 atol=TOLERANCE_ABSOLUTE_TESTS,
436 )
438 @ignore_numpy_errors
439 def test_nan_log_decoding_SLog2(self) -> None:
440 """
441 Test :func:`colour.models.rgb.transfer_functions.sony.\
442log_decoding_SLog2` definition nan support.
443 """
445 log_decoding_SLog2(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
448class TestLogEncoding_SLog3:
449 """
450 Define :func:`colour.models.rgb.transfer_functions.sony.\
451log_encoding_SLog3` definition unit tests methods.
452 """
454 def test_log_encoding_SLog3(self) -> None:
455 """
456 Test :func:`colour.models.rgb.transfer_functions.sony.\
457log_encoding_SLog3` definition.
458 """
460 np.testing.assert_allclose(
461 log_encoding_SLog3(0.0),
462 0.092864125122190,
463 atol=TOLERANCE_ABSOLUTE_TESTS,
464 )
466 np.testing.assert_allclose(
467 log_encoding_SLog3(0.18),
468 0.41055718475073,
469 atol=TOLERANCE_ABSOLUTE_TESTS,
470 )
472 np.testing.assert_allclose(
473 log_encoding_SLog3(0.18, 12),
474 0.410557184750733,
475 atol=TOLERANCE_ABSOLUTE_TESTS,
476 )
478 np.testing.assert_allclose(
479 log_encoding_SLog3(0.18, 10, False),
480 0.406392694063927,
481 atol=TOLERANCE_ABSOLUTE_TESTS,
482 )
484 np.testing.assert_allclose(
485 log_encoding_SLog3(0.18, 10, False, False),
486 0.393489294768447,
487 atol=TOLERANCE_ABSOLUTE_TESTS,
488 )
490 np.testing.assert_allclose(
491 log_encoding_SLog3(1.0),
492 0.596027343690123,
493 atol=TOLERANCE_ABSOLUTE_TESTS,
494 )
496 def test_n_dimensional_log_encoding_SLog3(self) -> None:
497 """
498 Test :func:`colour.models.rgb.transfer_functions.sony.\
499log_encoding_SLog3` definition n-dimensional arrays support.
500 """
502 x = 0.18
503 y = log_encoding_SLog3(x)
505 x = np.tile(x, 6)
506 y = np.tile(y, 6)
507 np.testing.assert_allclose(
508 log_encoding_SLog3(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
509 )
511 x = np.reshape(x, (2, 3))
512 y = np.reshape(y, (2, 3))
513 np.testing.assert_allclose(
514 log_encoding_SLog3(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
515 )
517 x = np.reshape(x, (2, 3, 1))
518 y = np.reshape(y, (2, 3, 1))
519 np.testing.assert_allclose(
520 log_encoding_SLog3(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
521 )
523 def test_domain_range_scale_log_encoding_SLog3(self) -> None:
524 """
525 Test :func:`colour.models.rgb.transfer_functions.sony.\
526log_encoding_SLog3` definition domain and range scale support.
527 """
529 x = 0.18
530 y = log_encoding_SLog3(x)
532 d_r = (("reference", 1), ("1", 1), ("100", 100))
533 for scale, factor in d_r:
534 with domain_range_scale(scale):
535 np.testing.assert_allclose(
536 log_encoding_SLog3(x * factor),
537 y * factor,
538 atol=TOLERANCE_ABSOLUTE_TESTS,
539 )
541 @ignore_numpy_errors
542 def test_nan_log_encoding_SLog3(self) -> None:
543 """
544 Test :func:`colour.models.rgb.transfer_functions.sony.\
545log_encoding_SLog3` definition nan support.
546 """
548 log_encoding_SLog3(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
551class TestLogDecoding_SLog3:
552 """
553 Define :func:`colour.models.rgb.transfer_functions.sony.\
554log_decoding_SLog3` definition unit tests methods.
555 """
557 def test_log_decoding_SLog3(self) -> None:
558 """
559 Test :func:`colour.models.rgb.transfer_functions.sony.\
560log_decoding_SLog3` definition.
561 """
563 np.testing.assert_allclose(
564 log_decoding_SLog3(0.092864125122190),
565 0.0,
566 atol=TOLERANCE_ABSOLUTE_TESTS,
567 )
569 np.testing.assert_allclose(
570 log_decoding_SLog3(0.41055718475073),
571 0.18,
572 atol=TOLERANCE_ABSOLUTE_TESTS,
573 )
575 np.testing.assert_allclose(
576 log_decoding_SLog3(0.410557184750733, 12),
577 0.18,
578 atol=TOLERANCE_ABSOLUTE_TESTS,
579 )
581 np.testing.assert_allclose(
582 log_decoding_SLog3(0.406392694063927, 10, False),
583 0.18,
584 atol=TOLERANCE_ABSOLUTE_TESTS,
585 )
587 np.testing.assert_allclose(
588 log_decoding_SLog3(0.393489294768447, 10, False, False),
589 0.18,
590 atol=TOLERANCE_ABSOLUTE_TESTS,
591 )
593 np.testing.assert_allclose(
594 log_decoding_SLog3(0.596027343690123),
595 1.0,
596 atol=TOLERANCE_ABSOLUTE_TESTS,
597 )
599 def test_n_dimensional_log_decoding_SLog3(self) -> None:
600 """
601 Test :func:`colour.models.rgb.transfer_functions.sony.\
602log_decoding_SLog3` definition n-dimensional arrays support.
603 """
605 y = 0.41055718475073
606 x = log_decoding_SLog3(y)
608 y = np.tile(y, 6)
609 x = np.tile(x, 6)
610 np.testing.assert_allclose(
611 log_decoding_SLog3(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
612 )
614 y = np.reshape(y, (2, 3))
615 x = np.reshape(x, (2, 3))
616 np.testing.assert_allclose(
617 log_decoding_SLog3(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
618 )
620 y = np.reshape(y, (2, 3, 1))
621 x = np.reshape(x, (2, 3, 1))
622 np.testing.assert_allclose(
623 log_decoding_SLog3(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
624 )
626 def test_domain_range_scale_log_decoding_SLog3(self) -> None:
627 """
628 Test :func:`colour.models.rgb.transfer_functions.sony.\
629log_decoding_SLog3` definition domain and range scale support.
630 """
632 y = 0.41055718475073
633 x = log_decoding_SLog3(y)
635 d_r = (("reference", 1), ("1", 1), ("100", 100))
636 for scale, factor in d_r:
637 with domain_range_scale(scale):
638 np.testing.assert_allclose(
639 log_decoding_SLog3(y * factor),
640 x * factor,
641 atol=TOLERANCE_ABSOLUTE_TESTS,
642 )
644 @ignore_numpy_errors
645 def test_nan_log_decoding_SLog3(self) -> None:
646 """
647 Test :func:`colour.models.rgb.transfer_functions.sony.\
648log_decoding_SLog3` definition nan support.
649 """
651 log_decoding_SLog3(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))