Source code for osculari.datasets.imutils

"""
Image manipulation functions.
"""

import numpy as np
import numpy.typing as npt


def _img_max_val(image):
    max_val = np.maximum(np.max(image), 1)
    for bits in [8, 16, 32, 64]:
        if image.dtype == 'uint%d' % bits:
            max_val = (2 ** bits) - 1
            break
    return max_val


def _im2double(image):
    return np.float32(image) / _img_max_val(image)


def _double2im(image, org_img):
    return (image * _img_max_val(org_img)).astype(org_img.dtype)


def _process_img(fun, in_image, *args, **kwargs):
    image = _im2double(in_image.copy())
    image = fun(image, *args, **kwargs)
    return _double2im(fun(image, *args, **kwargs), in_image)


[docs]def michelson_contrast(img: npt.NDArray, contrast: float) -> npt.NDArray: """ Adjust the contrast of an image using the Michelson contrast formula. Parameters: img (npt.NDArray): Input image as a NumPy array. contrast (float): Contrast adjustment factor. Should be in the range [0, 1]. Returns: npt.NDArray: Image with adjusted contrast. """ # Ensure that the contrast value is within the valid range assert 0 <= contrast <= 1 # Check if contrast is already at maximum if contrast == 1: return img # Apply the contrast adjustment return _process_img(_adjust_contrast, img, contrast)
def _adjust_contrast(image, amount): return (1 - amount) / 2.0 + np.multiply(image, amount)
[docs]def gamma_correction(img: npt.NDArray, gamma: float) -> npt.NDArray: """ Adjust the gamma of an image. Parameters: img (npt.NDArray): Input image as a NumPy array. gamma (float): Gamma adjustment factor. Returns: npt.NDArray: Image with adjusted gamma. """ # Ensure that the gamma value is not zero assert gamma != 0 # Check if gamma is already at default (gamma=1) if gamma == 1: return img # Apply the gamma adjustment return _process_img(_adjust_gamma, img, gamma)
def _adjust_gamma(image, amount): return image ** amount