Если функция alpha_composite()
не делает то, что вам нужно, вы можете загрузить изображения в массивы данных и использовать нарезку для замены соответствующих частей массива.Следующее, кажется, работает с использованием двух изображений:
from PIL import Image
import numpy
# open images and make the same size
image1 = Image.open("image1.jpg").resize((256, 256))
image2 = Image.open("image2.jpg").resize((256, 256))
# convert tp YCbCr
image1_y = image1.convert('YCbCr')
image2_y = image2.convert('YCbCr')
# load image data into arrays
image1_y_array = numpy.array(image1_y)
image2_y_array = numpy.array(image2_y)
# show shape and size of arrays
print (image1_y_array.shape)
print (image2_y_array.shape)
#print (image1_y_array[:,:,0]) # uncomment to see actual data
#print (image2_y_array[:,:,0]) # uncomment to see actual data
# replace image 1 Y channel with image 2 Y channel
# assume 1st [0] channel is the Y
image1_y_array[:,:,0] = image2_y_array[:,:,0]
# create new image from the updated array data
new_image1_y = Image.fromarray(image1_y_array)
# and show the result
new_image1_y.show()
# can now convert new_image1_y back to jpeg, etc.
Когда данные изображения загружаются в массивы, можно увидеть 3 канала данных из вывода форм массива:
(256, 256, 3)
(256, 256, 3)
Я предположил, что индексный канал 0 - это Y-канал, если нет, то замените магическое число 0 на 1 или 2.
NB. Очевидно, изображения должны быть одинакового размера.Я надеюсь, что это может помочь.
Редактировать:
Также можно сделать то же самое без использования numpy:
from PIL import Image
# open images and make the same size
image1 = Image.open("image1.jpg").resize((256, 256))
image2 = Image.open("image2.jpg").resize((256, 256))
# convert tp YCbCr
image1_y = image1.convert('YCbCr')
image2_y = image2.convert('YCbCr')
# split image data
image1_y_data = image1_y.split()
image2_y_data = image2_y.split()
# replace image 1 Y channel with image 2 Y channel
# assume 1st [0] channel is the Y
image1_y_data_list = list(image1_y_data)
image2_y_data_list = list(image2_y_data)
image1_y_data_list[0] = image2_y_data_list[0]
# create new image from the updated data
new_image1_y = Image.merge('YCbCr', image1_y_data_list)
# and show the result
new_image1_y.show()
# can now convert new_image1_y back to jpeg, etc.