Add watermark to images Recently, I started reading image processing via opencv library in python.

I create a minio object storage and upload some photos into it. After that, I wrote a program which reads every image in each bucket in minio and watermark it with a simple logo. I read each image with imread and finally (after inserting a watermark), save it with imwrite (on the same image).

But when testing my code, I saw that for each image it took about 0.4 seconds. Since I want to do this simple operation for a lot of images, this time is not acceptable.

Here is a part of my simple code:

import cv2
import numpy as np


logo_img = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED)

scl = 50
w = int(logo_img.shape[1] * scl / 100)
h = int(logo_img.shape[0] * scl / 100)
dim = (w, h)
logo = cv2.resize(logo_img, dim, interpolation=cv2.INTER_AREA)
logo_height, logo_width = logo.shape[:2]


def watermark_image(image_name):
    image = cv2.imread(image_name)
    image_height, image_width = image.shape[:2]
    image = np.dstack([image, np.ones((image_height, image_width), dtype="uint8") * 255])
    # Blend
    ovr = np.zeros((image_height, image_width, 4), dtype="uint8")

    x_pos = int(random() * (image_height - 10 - logo_width))
    y_pos = int(random() * (image_width - 10 - logo_height))

    ovr[x_pos:x_pos + logo_height, y_pos:y_pos + logo_width] = logo
    image = cv2.addWeighted(ovr, 0.6, image, 1.0, 0, image)
    cv2.imwrite(image_name, image)


import time
start = time.time()
for bucket in buckets:
    objects = minioClient.list_objects(bucket.name, prefix=None, recursive=True)
    for current_object in objects:
        watermark_image('./test/' + current_object.object_name)

end = time.time()

print(end - start)




How can I improve my code and optimize it in order to need less runtime?

Suppose that I have a object storage which contains a lot of image. Actually I want to prepare an API, for people to request a watermark for every image and then I want to show them requested image after watermarking it online.
I'll focus more on the


  How can I improve my code


part of your question.

Imports at the top

Move your import time to the top of the file, which is standard in Python.

Code in functions

Your logo dimension calculation should be in a function instead of global scope. The code at the bottom should be in a top-level main function.

Integer division

w = int(logo_img.shape[1] * scl / 100)


can be

w = logo_img.shape[1] * scl // 100


Use pathlib

...so that this:

'./test/' + current_object.object_name


can be

Path('test') / current_object.object_name