OverlayElements

Targets:
image
mask
Image Types:uint8, float32

Apply overlay elements such as images and masks onto an input image. This transformation can be used to add various objects (e.g., stickers, logos) to images with optional masks and bounding boxes for better placement control.

Arguments
metadata_key
str
overlay_metadata

Additional target key for metadata. Default overlay_metadata.

p
float
0.5

Probability of applying the transformation. Default: 0.5.

Examples
>>> import numpy as np
>>> import albumentations as A
>>> import cv2
>>>
>>> # Prepare primary data (base image and mask)
>>> image = np.zeros((300, 300, 3), dtype=np.uint8)
>>> mask = np.zeros((300, 300), dtype=np.uint8)
>>>
>>> # 1. Create a simple overlay image (a red square)
>>> overlay_image1 = np.zeros((50, 50, 3), dtype=np.uint8)
>>> overlay_image1[:, :, 0] = 255  # Red color
>>>
>>> # 2. Create another overlay with a mask (a blue circle with transparency)
>>> overlay_image2 = np.zeros((80, 80, 3), dtype=np.uint8)
>>> overlay_image2[:, :, 2] = 255  # Blue color
>>> overlay_mask2 = np.zeros((80, 80), dtype=np.uint8)
>>> # Create a circular mask
>>> center = (40, 40)
>>> radius = 30
>>> for i in range(80):
...     for j in range(80):
...         if (i - center[0])**2 + (j - center[1])**2 < radius**2:
...             overlay_mask2[i, j] = 255
>>>
>>> # 3. Create an overlay with both bbox and mask_id
>>> overlay_image3 = np.zeros((60, 120, 3), dtype=np.uint8)
>>> overlay_image3[:, :, 1] = 255  # Green color
>>> # Create a rectangular mask with rounded corners
>>> overlay_mask3 = np.zeros((60, 120), dtype=np.uint8)
>>> cv2.rectangle(overlay_mask3, (10, 10), (110, 50), 255, -1)
>>>
>>> # Create the metadata list - each item is a dictionary with overlay information
>>> overlay_metadata = [
...     {
...         'image': overlay_image1,
...         # No bbox provided - will be placed randomly
...     },
...     {
...         'image': overlay_image2,
...         'bbox': [0.6, 0.1, 0.9, 0.4],  # Normalized coordinates [x_min, y_min, x_max, y_max]
...         'mask': overlay_mask2,
...         'mask_id': 1  # This overlay will update the mask with id 1
...     },
...     {
...         'image': overlay_image3,
...         'bbox': [0.1, 0.7, 0.5, 0.9],  # Bottom left placement
...         'mask': overlay_mask3,
...         'mask_id': 2  # This overlay will update the mask with id 2
...     }
... ]
>>>
>>> # Create the transform
>>> transform = A.Compose([
...     A.OverlayElements(p=1.0),
... ])
>>>
>>> # Apply the transform
>>> result = transform(
...     image=image,
...     mask=mask,
...     overlay_metadata=overlay_metadata  # Pass metadata using the default key
... )
>>>
>>> # Get results with overlays applied
>>> result_image = result['image']  # Image with the three overlays applied
>>> result_mask = result['mask']    # Mask with regions labeled using the mask_id values
>>>
>>> # Let's verify the mask contains the specified mask_id values
>>> has_mask_id_1 = np.any(result_mask == 1)  # Should be True
>>> has_mask_id_2 = np.any(result_mask == 2)  # Should be True