我正在努力尝试将一个透明背景粘贴在另一个图像上,同时使用透明背景,并使用正确的Alpha /颜色混合。
以下是一些示例图片,red.png和blue.png:
我想将blue.png粘贴到red.png之上,并实现此效果:
该图像是通过在Photoshop中将两个图像组合而成,只需两层。
我可以使用Python Imaging Library获得的最接近的是:
使用此代码:
from PIL import Image
blue = Image.open("blue.png")
red = Image.open("red.png")
red.paste(blue, (0,0), blue)
red.save("result.png")
你是否看到两个圆圈重叠的地方的alpha和颜色是如何关闭的?在预期的结果图像中,红色和蓝色以紫色的方式混合在一起,但实际结果图像中存在不需要的alpha晕。
如何在PIL中实现理想的结果?
答案 0 :(得分:3)
我最接近的是使用找到here的alpha_composite函数。工作真的很好!
答案 1 :(得分:1)
我通常会转向numpy / scipy来处理图像处理任务,尽管我的第一次体验(一个很好的体验)是PIL。因此,我不确定以下内容是否符合您的需求。
给定一个特定的pixel1,其中来自image1的alpha1和来自image2的alpha2的pixel2,outputPixel将如下所示。
alpha1>=alpha2 then outputPixel = (alpha1-alpha2)*pixel1 + alpha2*pixel2
alpha1==alpha2 then outputPixel = 0*pixel1 + alpha2*pixel2 note in this case alpha1-alpha2 equals 0
alpha1<alpha2 then outputPixel = 0*pixel1 + alpha2*pixel2
使用上面的定义,我们将基本上计算来自的贡献 每个像素的第一个图像,然后在应用其alpha贴图后将其添加到第二个图像
我们也可以直接从imshow中获取
r1 = scipy.misc.imread('red.png')
b1 = scipy.misc.imread('blue.png')
r1 = r1.astype(numpy.float32)
b1 = b1.astype(numpy.float32)
alpha1 = r1[:,:,3]
alpha2 = b1[:,:,3]
#scale the alpha mattes to keep resulting alpha'd images in display range
alpha1Scaled = alpha1 / 255
alpha2Scaled = alpha2 / 255
diff1 = alpha1Scaled - alpha2Scaled
i1 = r1[:,:,0:3]
i2 = b1[:,:,0:3]
#create the alpha mapped images
d1 = numpy.zeros(i1.shape)
d2 = numpy.zeros(i2.shape)
for z in range(3):
d1[:,:,z] =(diff1>=0)*diff1*i1[:,:,z]
d2[:,:,z] = i2[:,:,z]*alpha2Scaled
#belend the result
result = d1 + d2
#rescale in case of overflow
resultScaled = 255*(result/result.max())
#to display
imshow(( resultScaled ).astype(uint8))
show()
#note the below gives us the same result
figure()
imshow(red)
imshow(blue)
show()
答案 2 :(得分:0)
使用blend()重叠两个图像。下面的代码重叠文件夹中的图像。您可以更改alpha的值以获得完美的混合
listing = os.listdir("images2/")
alpha = 2.0
for file in listing:
im = Image.open(path1 + file)
new_img = Image.blend(im, new_img, alpha)
new_img.save("new008.png","PNG")