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

31

我有两张完全相同尺寸的图片,我想做的只是将其中一张图片透明度降低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%透明的叠加层(已经完成了一半!)。


1
循环遍历背景以获得0%的透明度可能是不必要的。 - joedborg
2
使用from PIL import Image适用于Python 3.x - Trect
5个回答

38

尝试使用blend()代替paste()——看起来paste()仅仅是用你要粘贴的内容替换了原始图像。

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

File "./overlay.py", line 22, in <module> geometry.blend(overlay) File "/cfd/software/Python/272/lib/python2.7/site-packages/PIL/Image.py", line 512, in __getattr__ raise AttributeError(name) AttributeError: blend - joedborg
我使用的是最新版本1.1.7。 - joedborg

16

也许是一个老问题,但使用OpenCV可以轻松解决。

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

文档链接


0

提供覆盖层透明度掩码参数,看看是否能得到您期望的结果:

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

2
第二个参数应该是(0,0)。 - Adam Kerz

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


-1

脚本这里也可以使用混合来完成任务,它还具有调整图像大小的功能,以使它们成为相同的大小(如果它们当前不是)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接