← Back to all transforms

# PixelDistributionAdaptation

## Description

Performs pixel-level domain adaptation by aligning the pixel value distribution of an input image with that of a reference image. This process involves fitting a simple statistical transformation (such as PCA, StandardScaler, or MinMaxScaler) to both the original and the reference images, transforming the original image with the transformation trained on it, and then applying the inverse transformation using the transform fitted on the reference image. The result is an adapted image that retains the original content while mimicking the pixel value distribution of the reference domain. The process can be visualized as two main steps: 1. Adjusting the original image to a standard distribution space using a selected transform. 2. Moving the adjusted image into the distribution space of the reference image by applying the inverse of the transform fitted on the reference image. This technique is especially useful in scenarios where images from different domains (e.g., synthetic vs. real images, day vs. night scenes) need to be harmonized for better consistency or performance in image processing tasks. Args: reference_images (Sequence[Any]): A sequence of objects (typically image paths) that will be converted into images by `read_fn`. These images serve as references for the domain adaptation. blend_ratio (tuple[float, float]): Specifies the minimum and maximum blend ratio for mixing the adapted image with the original. This enhances the diversity of the output images. Values should be in the range [0, 1]. Default: (0.25, 1.0) read_fn (Callable): A user-defined function for reading and converting the objects in `reference_images` into numpy arrays. By default, it assumes these objects are image paths. transform_type (Literal["pca", "standard", "minmax"]): Specifies the type of statistical transformation to apply. - "pca": Principal Component Analysis - "standard": StandardScaler (zero mean and unit variance) - "minmax": MinMaxScaler (scales to a fixed range, usually [0, 1]) Default: "pca" p (float): The probability of applying the transform to any given image. Default: 0.5 Targets: image Image types: uint8, float32 Number of channels: Any Note: - The effectiveness of the adaptation depends on the similarity between the input and reference domains. - PCA transformation may alter color relationships more significantly than other methods. - StandardScaler and MinMaxScaler preserve color relationships better but may provide less dramatic adaptations. - The blend_ratio parameter allows for a smooth transition between the original and fully adapted image. - This transform cannot be directly serialized due to its dependency on external image data. Example: >>> import numpy as np >>> import albumentations as A >>> image = np.random.randint(0, 256, [100, 100, 3], dtype=np.uint8) >>> reference_image = np.random.randint(0, 256, [100, 100, 3], dtype=np.uint8) >>> transform = A.PixelDistributionAdaptation( ... reference_images=[reference_image], ... blend_ratio=(0.5, 1.0), ... transform_type="standard", ... read_fn=lambda x: x, ... p=1.0 ... ) >>> result = transform(image=image) >>> adapted_image = result["image"] References: - https://github.com/arsenyinfo/qudida - https://arxiv.org/abs/1911.11483

## Parameters

- reference_images: Sequence[Any] (default: null)
- blend_ratio: tuple[float, float] (default: (0.25, 1))
- read_fn: Callable[[typing.Any], ndarray] (default: '(path: str | Path) -> np.ndarray')
- transform_type: Literal['pca', 'standard', 'minmax'] (default: 'pca')
- p: float (default: 0.5)

## Targets

- Image

## Try it out

ⓘ

### Original Image:

### Reference Image:

### Result:

Transform result will appear here