from __future__ import annotations
import warnings
import mitsuba as mi
import numpy as np
import xarray as xr
[docs]
def bitmap_to_dataarray(bmp: mi.Bitmap, dtype="float64") -> xr.DataArray:
"""
Format Mitsuba bitmap data as an xarray data array.
Parameters
----------
bmp : mitsuba.core.Bitmap or ndarray
Mitsuba bitmap to be converted to a dataset. A Numpy array can also be
passed directly for compatibility (this feature is deprecated).
dtype : dtype, optional
Data type, forwarded to :func:`numpy.array`.
Returns
-------
da : DataArray
Bitmap data as an xarray array.
Raises
------
ValueError
If `bmp` has an unsupported pixel format.
"""
img = np.array(bmp, dtype=dtype)
if isinstance(bmp, mi.Bitmap):
try:
pixel_formats = {
mi.Bitmap.PixelFormat.Y: ["Y"],
mi.Bitmap.PixelFormat.YA: ["Y", "A"],
mi.Bitmap.PixelFormat.RGB: ["R", "G", "B"],
mi.Bitmap.PixelFormat.RGBA: ["R", "G", "B", "A"],
mi.Bitmap.PixelFormat.XYZ: ["X", "Y", "Z"],
mi.Bitmap.PixelFormat.XYZA: ["X", "Y", "Z", "A"],
}
channels = pixel_formats[bmp.pixel_format()]
except KeyError:
raise ValueError(f"unsupported bitmap pixel format {bmp.pixel_format()}")
else:
warnings.warn(
"Passing an array is deprecated (coordinate detection is limited)",
DeprecationWarning,
)
if len(img.shape) < 3:
channels = ["Y"]
else:
channels = {1: ["Y"], 3: ["R", "G", "B"]}[img.shape[2]]
height = img.shape[0]
width = img.shape[1]
result = xr.DataArray(
data=np.reshape(img, (height, width, -1)),
dims=["y_index", "x_index", "channel"],
coords={
"y_index": (
"y_index",
range(height),
{"long_name": "height pixel index"},
),
"y": (
"y_index",
np.linspace(0, 1, height),
{"long_name": "film height coordinate"},
),
"x_index": (
"x_index",
range(width),
{"long_name": "width pixel index"},
),
"x": (
"x_index",
np.linspace(0, 1, width),
{"long_name": "film width coordinate"},
),
"channel": ("channel", channels, {"long_name": "film spectral channel"}),
},
)
return result
[docs]
def bitmap_to_dataset(bmp: mi.Bitmap, dtype="float64") -> xr.Dataset:
"""
Format Mitsuba bitmap data as an xarray dataset.
Parameters
----------
bmp : mitsuba.core.Bitmap or ndarray
Mitsuba bitmap to be converted to a dataset. A Numpy array can also be
passed directly for compatibility (this feature is deprecated).
dtype : dtype, optional
Data type, forwarded to :func:`numpy.array`.
Returns
-------
dataset : Dataset
Bitmap data as an xarray dataset.
See Also
--------
:func:`bitmap_to_dataarray`
Notes
-----
This function exists for backward compatibility purposes.
It calls :func:`bitmap_to_dataarray` and forwards its arguments to it, then
wraps the generated data array in a dataset with an ``img`` data variable.
"""
da = bitmap_to_dataarray(bmp, dtype)
return xr.Dataset(data_vars={"img": da})