【问题标题】:PIL - Image Paste On Another Image With AlphaPIL - 使用 Alpha 将图像粘贴到另一个图像上
【发布时间】:2013-11-02 21:42:33
【问题描述】:

我正在努力将一张带有透明背景的图片粘贴到另一张图片上,同样带有透明背景,并具有正确的 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 中达到理想的结果?

【问题讨论】:

    标签: python python-imaging-library alpha


    【解决方案1】:

    我得到的最接近的是使用 here 找到的 alpha_composite 函数。效果非常好!

    【讨论】:

    • 实际上alpha_composite 现在是 Pillow 2.0 的原生函数。见here
    【解决方案2】:

    我通常使用 numpy/scipy 来完成图像处理任务,尽管我的第一次体验(很好)是使用 PIL。因此,我不确定以下内容是否能满足您的需求。

    给定一个特定的 pixel1,alpha1 来自 image1,pixel2 和 alpha2,来自 image2,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()
    

    【讨论】:

    • 感谢保罗的回答,尽管我似乎得到了黑色背景,但几乎是我所追求的。我在下面发布了一个链接的 alpha 复合算法似乎到达了我想要去的地方,结果稍微好一点。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多