Как объединить прозрачное изображение PNG с другим изображением, используя Scikit-изображение - PullRequest
0 голосов
/ 26 декабря 2018

Это в основном тот же вопрос, который был опубликован здесь: Как объединить прозрачное изображение в формате png с другим изображением, используя PIL , но с использованием scikit-image вместо PIL.Я имею в виду вставить png, сохраняя прозрачность поверх фонового изображения.Кроме того, если есть способ сделать это, я хотел бы знать, какой из них быстрее (PIL или scikit-image).Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вдохновленный ответом пользователя8190410, я создал для этого собственную функцию:

from skimage import data
import numpy as np

x, y = 100, 100
background = data.imread('background.jpg') / 255.
image = data.imread('image.png') / 255.

background_height, background_width, background_depth = background.shape
image_height, image_width, image_depth = image.shape

template = np.zeros((background_height, background_width, image_depth))
template[y : y + image_height, x : x + image_width, :] = image

mask = np.stack([template[:,:,3] for _ in range(3)], axis = 2)
inv_mask = 1. - mask
result = background[:,:,:3] * inv_mask + template[:,:,:3] * mask
plt.figure(figsize = (15, 15))
plt.subplot(1, 3, 2)
plt.imshow(image)
plt.subplot(1, 3, 1)
plt.imshow(background)
plt.subplot(1, 3, 3)
plt.imshow(result)
plt.tight_layout()
plt.show()

Image output

Пожалуйста, дайте мне знать, если я могу что-то сделатьулучшить скорость вычислений

0 голосов
/ 26 декабря 2018

Прочитайте два изображения и добавьте, используя формулу img1*alpha + img2*(1-alpha)

import numpy as np
from matplotlib import pyplot as plt
from skimage import data

img1 = data.imread('Desert.jpg')
img2 = data.imread('Penguins.jpg')

img3 = np.ubyte(0.7*img1 + 0.3*img2)

plt.imshow(img3)

alpha merged image

Другим вариантом может быть использование альфа-канала двухизображения в виде масок, как показано ниже

import numpy as np
from matplotlib import pyplot as plt
from skimage import data

img1 = data.imread('img1.png')
img2 = data.imread('img2.png')

mask1 = img1.copy()
mask2 = img2.copy()

mask1[:,:,0] = mask1[:,:,3]
mask1[:,:,1] = mask1[:,:,3]
mask1[:,:,2] = mask1[:,:,3]

mask2[:,:,0] = mask2[:,:,3]
mask2[:,:,1] = mask2[:,:,3]
mask2[:,:,2] = mask2[:,:,3]

img3 = np.bitwise_or(np.bitwise_and(img1, mask1),np.bitwise_and(img2, mask2)) ;
plt.subplot(2,2,1)
plt.imshow(img1)
plt.subplot(2,2,2)
plt.imshow(img2)
plt.subplot(2,2,3)
plt.imshow(img3)

using alpha masks

...