# -*- coding: utf-8 -*-
"""
Tonemapping Operators Plotting
==============================
Defines the tonemapping operators plotting objects:
- :func:`colour_hdri.plotting.plot_tonemapping_operator_image`
"""
from __future__ import division, unicode_literals
import matplotlib
import matplotlib.ticker
import numpy as np
from colour.plotting import (COLOUR_STYLE_CONSTANTS, artist, override_style,
render)
__author__ = 'Colour Developers'
__copyright__ = 'Copyright (C) 2015-2019 - Colour Developers'
__license__ = 'New BSD License - http://opensource.org/licenses/BSD-3-Clause'
__maintainer__ = 'Colour Developers'
__email__ = 'colour-science@googlegroups.com'
__status__ = 'Production'
__all__ = ['plot_tonemapping_operator_image']
[docs]@override_style()
def plot_tonemapping_operator_image(
image,
luminance_function,
log_scale=False,
encoding_cctf=COLOUR_STYLE_CONSTANTS.colour.colourspace.encoding_cctf,
**kwargs):
"""
Plots given tonemapped image with superimposed luminance mapping function.
Parameters
----------
image : array_like
Tonemapped image to plot.
luminance_function : callable
Luminance mapping function.
log_scale : bool, optional
Use a log scale for plotting the luminance mapping function.
encoding_cctf : callable, optional
Encoding colour component transfer function / opto-electronic
transfer function used for plotting.
Other Parameters
----------------
\\**kwargs : dict, optional
{:func:`colour.plotting.render`},
Please refer to the documentation of the previously listed definition.
Returns
-------
tuple
Current figure and axes.
"""
settings = {'uniform': True}
settings.update(kwargs)
figure, axes = artist(**settings)
shape = image.shape
bounding_box = [0, 1, 0, 1]
image = np.clip(encoding_cctf(image), 0, 1)
axes.imshow(
image,
aspect=shape[0] / shape[1],
extent=bounding_box,
interpolation='nearest')
axes.plot(
np.linspace(0, 1, len(luminance_function)),
luminance_function,
color='red')
settings = {
'axes': axes,
'bounding_box': bounding_box,
'x_ticker': True,
'y_ticker': True,
'x_label': 'Input Luminance',
'y_label': 'Output Luminance',
}
settings.update(kwargs)
if log_scale:
settings.update({
'x_label': '$log_2$ Input Luminance',
'x_ticker_locator': matplotlib.ticker.AutoMinorLocator(0.5)
})
matplotlib.pyplot.gca().set_xscale('log', basex=2)
matplotlib.pyplot.gca().xaxis.set_major_formatter(
matplotlib.ticker.ScalarFormatter())
return render(**settings)