Creating Custom Stickers from PNG Images

Creating a custom sticker from an image, especially a PNG image, can be an exciting task. In this tutorial, we will guide you through a step-by-step approach to create stickers from PNG images using Python and OpenCV.

Prerequisites

Make sure you have the following libraries installed:

  • OpenCV (cv2)
  • NumPy
  • Pillow (PIL)

Installation Command

Install required Python packages using pip

BASH
1pip install opencv-python numpy pillow

1. Reading the Image

we will start by reading a PNG image and converting it into the RGBA color space to include the alpha channel.

Image Reading Function

Function to read and convert image to RGBA

PYTHON
1def read_image(img_path):
2    img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
3    return cv2.cvtColor(img, cv2.COLOR_BGRA2RGBA)
Sample PNG image

2. Extracting Alpha Channel

The alpha channel is responsible for transparency in an image. we will extract this channel for further processing.

Alpha Channel Extraction

Function to extract the alpha channel

PYTHON
1def extract_alpha_channel(img):
2    return img[:, :, 3]
Alpha channel extraction

3. Finding the Largest Contour

we will find the largest contour in the alpha channel, and then apply GaussianBlur to smooth it.

Contour Detection

Function to find and smooth the largest contour

PYTHON
1def get_largest_contour(alpha_channel):
2    # Smoothing using GaussianBlur
3    smoothed = cv2.GaussianBlur(alpha_channel, (15, 15), 0)
4    contours_smoothed = cv2.findContours(smoothed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
5    contours_smoothed = contours_smoothed[0] if len(contours_smoothed) == 2 else contours_smoothed[1]
6    big_contour_smoothed = max(contours_smoothed, key=cv2.contourArea)
7
8    # Use the smoothed contour
9    peri = cv2.arcLength(big_contour_smoothed, True)
10    return cv2.approxPolyDP(big_contour_smoothed, 0.001 * peri, True)
Largest contour detection

4. Drawing the Contour

The contour is then drawn on a black background to create a mask.

Contour Drawing

Function to draw the contour on a black background

PYTHON
1def draw_filled_contour_on_black_background(big_contour, shape):
2    contour_img = np.zeros(shape)
3    cv2.drawContours(contour_img, [big_contour], 0, 255, -1)
4    return contour_img
Drawn contour mask

5. Applying Dilation

we will apply dilation to enlarge the white region in the mask, creating a smooth border around the image.

Dilation Application

Function to apply morphological dilation

PYTHON
1def apply_dilation(img):
2    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (30, 30))
3    return cv2.morphologyEx(img, cv2.MORPH_DILATE, kernel)
Dilated mask

6. Applying Overlays

The mask is then overlaid onto the original image, and the alpha channel is applied to merge them together.

Overlay Application

Function to apply mask overlays and merge with original image

PYTHON
1def apply_overlays(canvas, img, dilate):
2    alpha = np.expand_dims(img[:, :, 3], 2)
3    alpha = np.repeat(alpha, 3, 2)
4    alpha = alpha / 255
5
6    canvas[dilate == 255] = (255, 255, 255, 255)
7    canvas[:, :, 0:3] = canvas[:, :, 0:3] * (1 - alpha) + alpha * img[:, :, 0:3]
8
9    return canvas

7. Creating the Sticker

we will combine all the previous steps to create the final sticker. This function brings together all the operations we have covered to generate a complete sticker with a clean border and preserved transparency.

Complete Sticker Creation

Main function that combines all steps to create the final sticker

PYTHON
1def create_sticker(img):
2    alpha = extract_alpha_channel(img)
3    big_contour = get_largest_contour(alpha)
4    contour_img = draw_filled_contour_on_black_background(big_contour, alpha.shape)
5    dilate = apply_dilation(contour_img)
6
7    canvas = np.zeros(img.shape, dtype=np.uint8)
8    canvas = apply_overlays(canvas, img, dilate)
9
10    return canvas.astype(np.uint8)

Final Result

After applying all these steps, you will get a beautiful sticker with a clean border and preserved transparency.

Final sticker result