Source code for jicbioimage.core.transform
"""Module containing image transformation functions.
This module contains the function decorator
:func:`jicbioimage.core.transform.transformation` that can be used
to turn functions into image transformations.
Below is an example of how to create a transformation that inverts an image.
>>> import numpy as np
>>> @transformation
... def invert(image):
... "Return the inverted image."
... maximum = np.iinfo(image.dtype).max
... maximum_array = np.ones(image.shape, dtype=image.dtype) * maximum
... return maximum_array - image
...
"""
from functools import wraps
import numpy as np
from jicbioimage.core.io import AutoName, AutoWrite
from jicbioimage.core.image import Image, History, _BaseImageWithHistory
[docs]def transformation(func):
"""Function decorator to turn another function into a transformation."""
@wraps(func)
def func_as_transformation(*args, **kwargs):
# Take copies of the args and kwargs for use in the history.
# We will need to remove the image from either the kwargs
# or the args before we use h_args and h_kwargs to create a
# history event.
h_args = list(args[:])
h_kwargs = kwargs.copy()
# Get the input image, so that we can get the history from it.
# Also, strip the image for h_args/h_kwargs.
input_image = kwargs.get("image", None)
if input_image is None:
# The image is the first item of args.
input_image = args[0]
h_args.pop(0)
else:
# The image is in kwargs.
h_kwargs.pop("image")
def array_to_str(value):
if isinstance(value, np.ndarray):
value = repr(value)
return value
h_args = [array_to_str(v) for v in h_args]
for key, value in h_kwargs.items():
h_kwargs[key] = array_to_str(value)
# Get the history from the image.
history = History()
if hasattr(input_image, "history"):
history.extend(input_image.history)
image = func(*args, **kwargs)
if not isinstance(image, _BaseImageWithHistory):
image = Image.from_array(image, log_in_history=False)
# Update the history of the image.
image.history = history
image.history.add_event(func, h_args, h_kwargs)
if AutoWrite.on:
fpath = AutoName.name(func)
image.write(fpath)
return image
return func_as_transformation