如何在Python中将一幅图像乘以另一幅图像

1 投票
1 回答
8814 浏览
提问于 2025-04-18 08:40

我想把一张图片叠加在另一张图片上。比如说,我有两张图片,分别是 greenapple.png 和 redcolor.png。现在我想把 redcolor.png 叠加到 greenapple.png 上,只有在 greenapple.png 的部分被覆盖,而其他地方保持不变。

我尝试使用 ImageChops 来实现这个效果,代码是:

import Image
import bakepass
from PIL import ImageChops

im1 = Image.open("greenapple.png")
im2 = Image.open("redcolor.png")
image = Image.open("new.png")

image.save(ImageChops.multiply(im1,im2))

但是用这段代码时,我遇到了一个值错误:图片不匹配。我使用的两张图片大小都是 512X512。请帮帮我。

1 个回答

1

这可能正是你想要的内容:改变色调

不过,如果你出于某种原因不想使用numpy,你可以尝试使用合成和透明度通道(下面的代码会在整个图像上设置一个透明度值,你可以通过img1的绿色/红色来计算在哪里改变img2的透明度):

from PIL import Image, ImageEnhance

img1 = Image.open('apple.png')
img2 = Image.open('green.png')
img2.putalpha(ImageEnhance.Brightness(img2.split()[3]).enhance(0.75))
img1 = Image.composite(img2, img1, img2)
img1.save('out.png')

这里是我用来做上面测试的两张图片(虽然可能有点大),第三张图片是上面代码的结果:

apple.png

Imgur

green.png

Imgur

out.png

Imgur

还有PIL的paste()函数:

from PIL import Image, ImageEnhance
img = Image.open('greenapple.png', 'r')
img_w, img_h = img.size

red = Image.open('redcolor.png', 'r')
# red_w, red_h = red.size

new = Image.new('RGBA', (1024,769), (255, 255, 255, 255))
new_w, new_h = new.size
offset=((new_w-img_w)/2,(new_h-img_h)/2)

red.putalpha(ImageEnhance.Brightness(red.split()[3]).enhance(0.75))

new.paste(img, offset)
new.paste(red, offset)
new.save('out.png')

可以尝试一下img.split(),这个函数会给你分离出红色、绿色、蓝色、透明度,然后在决定放置覆盖层的位置时,使用绿色/红色的颜色块。

这里还有一些其他的计算方法,比如你可以使用黑色作为排除颜色:

撰写回答