Source code for colour_hdri.plotting.tonemapping
"""
Tonemapping Operators Plotting
==============================
Define the tonemapping operators plotting objects:
- :func:`colour_hdri.plotting.plot_tonemapping_operator_image`
"""
from __future__ import annotations
import matplotlib.pyplot as plt
import matplotlib.ticker
import numpy as np
from colour.hints import Any, ArrayLike, Callable, Dict, Tuple
from colour.plotting import (
CONSTANTS_COLOUR_STYLE,
artist,
override_style,
render,
)
from colour.utilities import as_float_array
from matplotlib.axes import Axes
from matplotlib.figure import Figure
__author__ = "Colour Developers"
__copyright__ = "Copyright 2015 Colour Developers"
__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"
__all__ = [
"plot_tonemapping_operator_image",
]
[docs]
@override_style()
def plot_tonemapping_operator_image(
image: ArrayLike,
luminance_function: ArrayLike,
log_scale: bool = False,
cctf_encoding: Callable = CONSTANTS_COLOUR_STYLE.colour.colourspace.cctf_encoding,
**kwargs: Any,
) -> Tuple[Figure, Axes]:
"""
Plot given tonemapped image with superimposed luminance mapping function.
Parameters
----------
image
Tonemapped image to plot.
luminance_function
Luminance mapping function.
log_scale
Use a log scale for plotting the luminance mapping function.
cctf_encoding
Encoding colour component transfer function / opto-electronic
transfer function used for plotting.
Other Parameters
----------------
kwargs
{:func:`colour.plotting.render`},
Please refer to the documentation of the previously listed definition.
Returns
-------
:class:`tuple`
Current figure and axes.
"""
image = as_float_array(image)
luminance_function = as_float_array(luminance_function)
settings: Dict[str, Any] = {"uniform": True}
settings.update(kwargs)
figure, axes = artist(**settings)
shape = image.shape
bounding_box = (0.0, 1.0, 0.0, 1.0)
image = np.clip(cctf_encoding(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 # pyright: ignore
),
}
)
plt.gca().set_xscale("log", basex=2)
plt.gca().xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
return render(**settings)