如何在python中将一个图像乘以另一个图像
我正在尝试获得一个图像,而不是另一个图像,即如果我有两个图像greenapple.png和redcolor.png,现在我想将redcolor.png乘以greenapple.png,这样greenapple.png中的图像将仅在greenapple.png所在的位置被redcolor.png覆盖,剩下的部分就不用了。 我试过ImageChops来做,代码是如何在python中将一个图像乘以另一个图像,python,image,python-2.7,python-imaging-library,Python,Image,Python 2.7,Python Imaging Library,我正在尝试获得一个图像,而不是另一个图像,即如果我有两个图像greenapple.png和redcolor.png,现在我想将redcolor.png乘以greenapple.png,这样greenapple.png中的图像将仅在greenapple.png所在的位置被redcolor.png覆盖,剩下的部分就不用了。 我试过ImageChops来做,代码是 import Image import bakepass from PIL import ImageChops im1 = Image.
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文件
请帮帮我这可能就是你想要的: 但是,如果出于某种原因不想使用numpy,可以使用合成和alpha通道(下面在整个图像中放置alpha值,您可以通过img1的绿色/红色计算更改img2的alpha的位置): 下面是我在上面的测试中使用的两个图像(可能有点大),第三个图像是上面代码的结果: apple.png green.png out.png 还有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()
,它会为您提供红色、绿色、蓝色、alpha
,并在确定覆盖的位置时使用绿色/红色补丁
以下是一些计算量更大的备选方案,例如,您可以使用黑色作为排除颜色:
img.getpixel((x,y))获取红色通道
并在覆盖上循环,仅读取与第一幅图像中的红色通道匹配的(x,y)
。这是你必须要做的手工工作,PIL中没有预定义的函数(因此我的参考链接)它抛出一个错误“NoneType”对象没有来自PIL导入图像的属性“bands”。另见:
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')