【问题标题】:Overlap 2 RGBA images using Python使用 Python 重叠 2 个 RGBA 图像
【发布时间】:2025-12-17 17:00:02
【问题描述】:

我正在做一个图像分割项目。

我有 2 个 RGBA 图像。 第一张图片是要分割的图片:

第二个是包含不同透明度值的红色方块的图像:

我想叠加两张图片,但我做不到。我尝试了两种方法:

一个使用openCV“添加”方法,另一个使用PIL“混合”方法。

from PIL import Image as PImage

if __name__ == '__main__':    

    image_A = read_image(r"C:\Users\francois.bock\Desktop\013.jpg", rgb=True)

    # Add alpha channel
    image_A = np.concatenate((image_A, np.full((256, 256, 1), fill_value=255, dtype=np.uint8)), axis=2)

    #Create image B
    image_B = np.full((256, 256, 4), fill_value=[0, 0, 0, 0], dtype=np.uint8)
    for i in range(0, 20):
        for j in range(0, 20):
            image_B[i, j] = [255, 0, 0, 100]

    for i in range(50, 70):
        for j in range(50, 70):
            image_B[i, j] = [255, 0, 0, 127]

    for i in range(50, 70):
        for j in range(0, 20):
            image_B[i, j] = [255, 0, 0, 255]

    image_A_convert = PImage.fromarray(image_A)
    image_B_convert = PImage.fromarray(image_B)

    # Test with blend
    img_add = PImage.blend(image_A_convert, image_B_convert, 0.0)
    img_add.save("testrgba.png", "PNG")

    # Test with open CV
    img_add = cv2.add(image_A,image_B)
    img_add = PImage.fromarray(img_add)
    img_add.save("testrgba.png", "PNG")

混合结果:

打开简历的结果

正如我们所见,它运行得并不好。

使用混合方法,第一张图像太淡了。 使用 openCV 方法,第一张图像还可以,但我们失去了第二张图像每个正方形的透明度。

我想保留相同的第一个图像,但透明度特定于第二个图像的每个正方形。

任何提示或提示?

【问题讨论】:

    标签: python opencv python-imaging-library


    【解决方案1】:

    我想你想要一个带面具的简单paste()

    #!/usr/bin/env python3
    
    from PIL import Image
    
    # Open input images, background and overlay
    image   = Image.open('bg.png')
    overlay = Image.open('overlay.png')
    
    # Paste overlay onto background using overlay alpha as mask
    image.paste(overlay, mask=overlay)
    
    # Save
    image.save('result.png')
    

    【讨论】:

    • 我不知道这个方法。它完美地工作。谢谢!
    【解决方案2】:

    您必须以g(x) = (1-a)f0(x) + af1(x) 的形式为其添加一些权重。

    分配一个变量

    beta = (1.0 - alpha)

    dst = cv.addWeighted(src1, alpha, src2, beta, 0.0).

    然后

    dst = np.uint8(alpha*(img1)+beta*(img2))

    cv.imshow('dst', dst)

    在哪里src1 is Image1 and src2 is Image2。尝试使用不同的 alpha 值。对我来说alpha = 0.5 工作正常。

    希望对你有帮助。

    【讨论】:

    • 顺便说一句,它正在使用 OpenCV