Skip to content Skip to sidebar Skip to footer

Overlay Two Same Sized Images In Python

I've got two images that are exactly the same dimensions, all I'm trying to do is take one, make it 50% transparent and place it directly on top of the other, like so: import Image

Solution 1:

Try using blend() instead of paste() - it seems paste() just replaces the original image with what you're pasting in.

try:
    from PIL import Image
except ImportError:
    import Image

background = Image.open("bg.png")
overlay = Image.open("ol.jpg")

background = background.convert("RGBA")
overlay = overlay.convert("RGBA")

new_img = Image.blend(background, overlay, 0.5)
new_img.save("new.png","PNG")

Solution 2:

Maybe too old question, can be done with ease using opencv

cv2.addWeighted(img1, alpha, img2, beta, gamma)
#setting alpha=1, beta=1, gamma=0 gives direct overlay of two images

Documentation link


Solution 3:

Provide the overlay alpha mask parameter and see if this yields results you expected:

background.paste(overlay, overlay.size, overlay)

Solution 4:

The script here will also do the task using blend, it also has functionality to resize the images so as to make them the same size if they are not currently.


Solution 5:

In case you want to resize them to the same shape:

b_h, b_w, b_ch = background.shape
W = 800
imgScale = W/b_w
new_b_h,new_b_w = int(b_h*imgScale), int(b_w*imgScale)
new_background = cv2.resize(background,(new_b_w, new_b_h))

Then you can fill in the shape fitting both background and foreground.

square= np.zeros((new_b_h, new_b_w, b_ch), np.uint8)
square.fill(255)
x= new_b_w
y= new_b_h
offset =0
square[int(y - new_b_h) - offset:int(y)- offset, int(x-new_b_w)- offset:int(x)- offset] = new_background 

Now you can overlay:

OPACITY = 0.7
added_image = cv2.addWeighted(new_background,OPACITY,square, 1-OPACITY, 0)

Details are on github


Post a Comment for "Overlay Two Same Sized Images In Python"