Как сохранить изображение с более чем 3 каналами, используя PIL? - PullRequest
0 голосов
/ 13 февраля 2019

Я надеюсь, что формулирую это правильно, поскольку я новичок во всем этом.Мне нужно сохранить изображение в формате TIFF на 4 каналах, в частности, на каналах R, G, B и A.

Когда я пытаюсь использовать Image.save (), чтобы сохранить изображение в формате TIFF с 4 каналами, получаемое изображение является RGBAизображения, но при рассмотрении TIFF в фотошопе единственные каналы RGB, без альфа.Есть ли способ объединить 4 канала в изображение RGBA с 4-м каналом (отдельным альфа-каналом)?

Ниже приведен пример того, что я пробовал

from PIL import Image

# import image A
inputImageA = Image.open(input_imageA_path)

# import image B
inputImageB = Image.open(input_imageB_path)

# split channels
R, G, B, A = inputImageA.split()
alpha_channel = inputImageA.split()[-1]

# merge 4 channels back into a single image
outputImage = Image.merge("RGBA", [R,G,B,alpha_channel])

# save the new image
outputImage.save(ouput_image_path)

ВВ этом примере результирующее выходное изображение имеет только 3 канала (RGB).

Спасибо заранее!

РЕДАКТИРОВАТЬ: Если мой вопрос не ясен, я изменил приведенный выше пример кода;Кроме того, см. ниже изображение для визуального объяснения того, что я пытаюсь сделать:

https://i.imgur.com/7bvuzJJ.png

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Итак, я нашел решение этой проблемы, используя библиотеку OpenCV2 вместо PIL.Посмотрите ниже, как я это сделал:

import cv2

# read original image
original = cv2.imread(original_image_path, cv2.IMREAD_UNCHANGED)

# get dimensions for resizing mask
height, width, channels = original.shape

# read alpha image
alpha = cv2.imread(alpha_path)

# resize alpha image to match original
alpha_resized = cv2.resize(alpha, (height,width))

# split alpha_resized into individual channels
channels = cv2.split(alpha_resized)

# apply to 4th channel of original
original[:,:,3] = channels[0]

# write new image file with alpha channel
cv2.imwrite(output_path,original)
0 голосов
/ 13 февраля 2019

Обновленный ответ

Хорошо, я думаю, вы имеете в виду это сейчас:

#!/usr/bin/env python3

from PIL import Image

# Open background image, ensuring RGB
im = Image.open('start.png').convert('RGB')

# Open alpha channel, ensuring single channel
alpha = Image.open('alpha.png').convert('L')

# Add that alpha channel to background image
im.putalpha(alpha)

# Save as TIFF
im.save('result.tif')

Что составляет start.png:

enter image description here

плюс alpha.png:

enter image description here

в result.tif:

enter image description here

Оригинальный ответ

Вот простой пример создания и сохранения 4-канального RGBA TIFF:

#!/usr/bin/env python3

from PIL import Image, ImageDraw

# Create RGB image full of yellow
w, h = 640, 480
im =Image.new('RGB',(w,h),color=(255,255,0))

# Create alpha channel of white i.e. opaque
alpha =Image.new('L',(w,h),color=255)

# Get drawing context to draw into alpha channel and draw black (i.e. transparent) rectangle
d = ImageDraw.Draw(alpha)
d.rectangle([10,40,200,250],fill=0)

# Add that alpha channel to yellow image
im.putalpha(alpha)

# Save as TIFF
im.save('result.tif')

enter image description here

...