Source code for colour.models.rgb.transfer_functions.alexa_log_c

# -*- coding: utf-8 -*-
"""
ALEXA Log C Log Encoding
========================

Defines the *ALEXA Log C* log encoding:

-   :func:`colour.models.log_encoding_ALEXALogC`
-   :func:`colour.models.log_decoding_ALEXALogC`

See Also
--------
`RGB Colourspaces Jupyter Notebook
<http://nbviewer.jupyter.org/github/colour-science/colour-notebooks/\
blob/master/notebooks/models/rgb.ipynb>`_

References
----------
-   :cite:`ARRI2012a` : ARRI. (2012). ALEXA - Log C Curve - Usage in VFX.
    Retrieved from http://www.arri.com/?eID=registration&file_uid=8026
"""

from __future__ import division, unicode_literals

import numpy as np

from colour.utilities import CaseInsensitiveMapping, as_numeric

__author__ = 'Colour Developers'
__copyright__ = 'Copyright (C) 2013-2018 - Colour Developers'
__license__ = 'New BSD License - http://opensource.org/licenses/BSD-3-Clause'
__maintainer__ = 'Colour Developers'
__email__ = 'colour-science@googlegroups.com'
__status__ = 'Production'

__all__ = [
    'ALEXA_LOG_C_CURVE_BCL_DATA', 'ALEXA_LOG_C_CURVE_CONVERSION_DATA',
    'log_encoding_ALEXALogC', 'log_decoding_ALEXALogC'
]

ALEXA_LOG_C_CURVE_BCL_DATA = CaseInsensitiveMapping({
    'SUP 3.x': {
        160: (0.0928, 0.8128),
        200: (0.0928, 0.8341),
        250: (0.0928, 0.8549),
        320: (0.0928, 0.8773),
        400: (0.0928, 0.8968),
        500: (0.0928, 0.9158),
        640: (0.0928, 0.9362),
        800: (0.0928, 0.9539),
        1000: (0.0928, 0.9711),
        1280: (0.0928, 0.9895),
        1600: (0.0928, 1.0000),
        2000: (0.0928, 1.0000),
        2560: (0.0928, 1.0000),
        3200: (0.0928, 1.0000)
    },
    'SUP 2.x': {
        160: (0.1083, 0.8110),
        200: (0.1115, 0.8320),
        250: (0.1146, 0.8524),
        320: (0.1181, 0.8743),
        400: (0.1213, 0.8935),
        500: (0.1245, 0.9121),
        640: (0.1280, 0.9320),
        800: (0.1311, 0.9494),
        1000: (0.1343, 0.9662),
        1280: (0.1378, 0.9841),
        1600: (0.1409, 0.9997)
    }
})
"""
*ALEXA Log C* curve *Ei, Black, Clipping Level* data.

ALEXA_LOG_C_CURVE_BCL_DATA : CaseInsensitiveMapping
    **{'SUP 3.x', 'SUP 2.x'}**
"""

ALEXA_LOG_C_CURVE_CONVERSION_DATA = CaseInsensitiveMapping({
    'SUP 3.x': CaseInsensitiveMapping({
        'Normalised Sensor Signal': {
            160: (0.004680, 40.0, -0.076072, 0.269036,
                  0.381991, 42.062665, -0.071569, 0.125266),
            200: (0.004597, 50.0, -0.118740, 0.266007,
                  0.382478, 51.986387, -0.110339, 0.128643),
            250: (0.004518, 62.5, -0.171260, 0.262978,
                  0.382966, 64.243053, -0.158224, 0.132021),
            320: (0.004436, 80.0, -0.243808, 0.259627,
                  0.383508, 81.183335, -0.224409, 0.135761),
            400: (0.004369, 100.0, -0.325820, 0.256598,
                  0.383999, 100.295280, -0.299079, 0.139142),
            500: (0.004309, 125.0, -0.427461, 0.253569,
                  0.384493, 123.889239, -0.391261, 0.142526),
            640: (0.004249, 160.0, -0.568709, 0.250219,
                  0.385040, 156.482680, -0.518605, 0.146271),
            800: (0.004201, 200.0, -0.729169, 0.247190,
                  0.385537, 193.235573, -0.662201, 0.149658),
            1000: (0.004160, 250.0, -0.928805, 0.244161,
                   0.386036, 238.584745, -0.839385, 0.153047),
            1280: (0.004120, 320.0, -1.207168, 0.240810,
                   0.386590, 301.197380, -1.084020, 0.156799),
            1600: (0.004088, 400.0, -1.524256, 0.237781,
                   0.387093, 371.761171, -1.359723, 0.160192)
        },
        'Linear Scene Exposure Factor': {
            160: (0.005561, 5.555556, 0.080216, 0.269036,
                  0.381991, 5.842037, 0.092778, 0.125266),
            200: (0.006208, 5.555556, 0.076621, 0.266007,
                  0.382478, 5.776265, 0.092782, 0.128643),
            250: (0.006871, 5.555556, 0.072941, 0.262978,
                  0.382966, 5.710494, 0.092786, 0.132021),
            320: (0.007622, 5.555556, 0.068768, 0.259627,
                  0.383508, 5.637732, 0.092791, 0.135761),
            400: (0.008318, 5.555556, 0.064901, 0.256598,
                  0.383999, 5.571960, 0.092795, 0.139142),
            500: (0.009031, 5.555556, 0.060939, 0.253569,
                  0.384493, 5.506188, 0.092800, 0.142526),
            640: (0.009840, 5.555556, 0.056443, 0.250219,
                  0.385040, 5.433426, 0.092805, 0.146271),
            800: (0.010591, 5.555556, 0.052272, 0.247190,
                  0.385537, 5.367655, 0.092809, 0.149658),
            1000: (0.011361, 5.555556, 0.047996, 0.244161,
                   0.386036, 5.301883, 0.092814, 0.153047),
            1280: (0.012235, 5.555556, 0.043137, 0.240810,
                   0.386590, 5.229121, 0.092819, 0.156799),
            1600: (0.013047, 5.555556, 0.038625, 0.237781,
                   0.387093, 5.163350, 0.092824, 0.16019)
        }
    }),
    'SUP 2.x': CaseInsensitiveMapping({
        'Normalised Sensor Signal': {
            160: (0.003907, 36.439829, -0.053366, 0.269035,
                  0.391007, 45.593473, -0.069772, 0.10836),
            200: (0.003907, 45.549786, -0.088959, 0.266007,
                  0.391007, 55.709581, -0.106114, 0.11154),
            250: (0.003907, 56.937232, -0.133449, 0.262978,
                  0.391007, 67.887153, -0.150510, 0.11472),
            320: (0.003907, 72.879657, -0.195737, 0.259627,
                  0.391007, 84.167616, -0.210597, 0.11824),
            400: (0.003907, 91.099572, -0.266922, 0.256598,
                  0.391007, 101.811426, -0.276349, 0.12142),
            500: (0.003907, 113.874465, -0.355903, 0.253569,
                  0.391007, 122.608379, -0.354421, 0.12461),
            640: (0.003907, 145.759315, -0.480477, 0.250218,
                  0.391007, 149.703304, -0.456760, 0.12813),
            800: (0.003907, 182.199144, -0.622848, 0.247189,
                  0.391007, 178.216873, -0.564981, 0.13131),
            1000: (0.003907, 227.748930, -0.800811, 0.244161,
                   0.391007, 210.785040, -0.689043, 0.13449),
            1280: (0.003907, 291.518630, -1.049959, 0.240810,
                   0.391007, 251.689459, -0.845336, 0.13801),
            1600: (0.003907, 364.398287, -1.334700, 0.237781,
                   0.391007, 293.073575, -1.003841, 0.14119)
        },
        'Linear Scene Exposure Factor': {
            160: (0.000000, 5.061087, 0.089004, 0.269035,
                  0.391007, 6.332427, 0.108361, 0.108361),
            200: (0.000000, 5.061087, 0.089004, 0.266007,
                  0.391007, 6.189953, 0.111543, 0.111543),
            250: (0.000000, 5.061087, 0.089004, 0.262978,
                  0.391007, 6.034414, 0.114725, 0.114725),
            320: (0.000000, 5.061087, 0.089004, 0.259627,
                  0.391007, 5.844973, 0.118246, 0.118246),
            400: (0.000000, 5.061087, 0.089004, 0.256598,
                  0.391007, 5.656190, 0.121428, 0.121428),
            500: (0.000000, 5.061087, 0.089004, 0.253569,
                  0.391007, 5.449261, 0.124610, 0.124610),
            640: (0.000000, 5.061087, 0.089004, 0.250218,
                  0.391007, 5.198031, 0.128130, 0.128130),
            800: (0.000000, 5.061087, 0.089004, 0.247189,
                  0.391007, 4.950469, 0.131313, 0.131313),
            1000: (0.000000, 5.061087, 0.089004, 0.244161,
                   0.391007, 4.684112, 0.134495, 0.134495),
            1280: (0.000000, 5.061087, 0.089004, 0.240810,
                   0.391007, 4.369609, 0.138015, 0.138015),
            1600: (0.000000, 5.061087, 0.089004, 0.237781,
                   0.391007, 4.070466, 0.141197, 0.14119)}
    })
})  # yapf: disable
"""
*ALEXA Log C* curve conversion data between signal and linear scene exposure
factor for *SUP 3.x* and signal and normalized sensor signal for *SUP 2.x*.

ALEXA_LOG_C_CURVE_CONVERSION_DATA : CaseInsensitiveMapping
    **{'SUP 3.x', 'SUP 2.x'}**
"""


[docs]def log_encoding_ALEXALogC(x, firmware='SUP 3.x', method='Linear Scene Exposure Factor', EI=800): """ Defines the *ALEXA Log C* log encoding curve / opto-electronic transfer function. Parameters ---------- x : numeric or array_like Linear data :math:`x`. firmware : unicode, optional **{'SUP 3.x', 'SUP 2.x'}**, Alexa firmware version. method : unicode, optional **{'Linear Scene Exposure Factor', 'Normalised Sensor Signal'}**, Conversion method. EI : int, optional Ei. Returns ------- numeric or ndarray *ALEXA Log C* encoded data :math:`t`. References ---------- - :cite:`ARRI2012a` Examples -------- >>> log_encoding_ALEXALogC(0.18) # doctest: +ELLIPSIS 0.3910068... """ x = np.asarray(x) cut, a, b, c, d, e, f, _e_cut_f = ( ALEXA_LOG_C_CURVE_CONVERSION_DATA[firmware][method][EI]) return as_numeric( np.where(x > cut, c * np.log10(a * x + b) + d, e * x + f))
[docs]def log_decoding_ALEXALogC(t, firmware='SUP 3.x', method='Linear Scene Exposure Factor', EI=800): """ Defines the *ALEXA Log C* log decoding curve / electro-optical transfer function. Parameters ---------- t : numeric or array_like *ALEXA Log C* encoded data :math:`t`. firmware : unicode, optional **{'SUP 3.x', 'SUP 2.x'}**, Alexa firmware version. method : unicode, optional **{'Linear Scene Exposure Factor', 'Normalised Sensor Signal'}**, Conversion method. EI : int, optional Ei. Returns ------- numeric or ndarray Linear data :math:`x`. References ---------- - :cite:`ARRI2012a` Examples -------- >>> log_decoding_ALEXALogC(0.391006832034084) # doctest: +ELLIPSIS 0.18... """ t = np.asarray(t) cut, a, b, c, d, e, f, _e_cut_f = ( ALEXA_LOG_C_CURVE_CONVERSION_DATA[firmware][method][EI]) return as_numeric( np.where(t > e * cut + f, (np.power(10, (t - d) / c) - b) / a, (t - f) / e))