Перекрыть 2 изображения RGBA, используя Python - PullRequest
1 голос
/ 06 апреля 2020

Я работаю над проектом сегментации изображений.

У меня есть 2 изображения RGBA. Первое изображение - это изображение для сегмента:

enter image description here

Второе изображение - это изображение с красными квадратами с различным значением прозрачности:

enter image description here

Я хотел бы наложить 2 изображения, но я не могу этого сделать. Я попробовал 2 метода:

Один с помощью метода openCV «add», а другой с помощью метода «PIL» blend.

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

Результат с blend:

enter image description here

Результат с открытым CV

enter image description here

Как мы видим, это не очень хорошо работает.

При использовании метода наложения первое изображение стало слишком блеклым. При использовании метода openCV с первым изображением все в порядке, но мы потеряли указатель прозрачности c для каждого квадрата второго изображения.

Я бы хотел сохранить одно и то же первое изображение, но с указанием прозрачности c для каждого квадрат второго изображения.

Есть подсказки или подсказка?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Я думаю, вам нужен простой 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')

enter image description here

1 голос
/ 06 апреля 2020

Вам нужно будет добавить к нему некоторый вес в виде 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 работал нормально.

Надеюсь, это поможет.

...