在Python中叠加两个相同大小的图像

时间:2012-05-17 16:58:18

标签: python python-imaging-library

我有两个尺寸完全相同的图像,我要做的就是拿一个,使它透明50%并将其直接放在另一个上面,如下所示:

import Image

background = Image.open("bg.png")
overlay = Image.open("over.png")

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

background_pixels = background.load()
overlay_pixels = overlay.load()

for y in xrange(overlay.size[1]):
    for x in xrange(overlay.size[0]):
         background_pixels[x,y] = (background_pixels[x,y][0], background_pixels[x,y][1], background_pixels[x,y][2], 255)

for y in xrange(overlay.size[1]):
    for x in xrange(overlay.size[0]):
         overlay_pixels[x,y] = (overlay_pixels[x,y][0], overlay_pixels[x,y][1], overlay_pixels[x,y][2], 128)

background.paste(overlay)
background.save("new.png","PNG")

但我得到的只是50%的透明覆盖图(所以在那里的一半!)。

5 个答案:

答案 0 :(得分:13)

尝试使用blend()代替粘贴() - 似乎paste()只是将原始图片替换为您要粘贴的内容。

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")

答案 1 :(得分:5)

也许过于陈旧的问题,可以使用opencv

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

Documentation link

答案 2 :(得分:0)

提供叠加alpha蒙版参数,看看是否会产生预期结果:

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

答案 3 :(得分:0)

脚本here还将使用blend来完成任务,它还具有调整图像大小的功能,以使图像大小与当前图像大小相同。

答案 4 :(得分:0)

如果您想将它们调整为相同的形状:

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))

然后,您可以填写适合背景和前景的形状。

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 

现在您可以覆盖:

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

详细信息在github