Изображение Python Pillow.Split не возвращает RBG, но все изображения в оттенках серого, что могло бы вызвать это?

#python #python-imaging-library

#python #python-imaging-library

Вопрос:

Я работаю над курсом о Pillow. Нет информации о том, как выполнить назначение, поэтому я потерялся.

Чтение документации по Pillow не помогает, поэтому я не уверен, почему изображение, преобразованное в RBG, разбивается не на RBG, а на оттенки серого.

 help(Image.Image.split)
  

Смотрю на Python для гиков.

они также показывают серые изображения вместо красных, синих и зеленых изображений. Если предполагается, что .split() разбивает его на кортеж RBG, почему изображения отображаются только серым цветом?

 #Code snippet from Python for Geeks
im1 = Image.Image.split(image) 
im1[0].show()
display(im1[0])
display(im1[1])
display(im1[2])

  

Ответ №1:

Когда вы разделяете 3-канальное RGB-изображение, оно становится 3 отдельными одноканальными изображениями. Одноканальные изображения обычно считаются оттенками серого. Таким образом, вы получаете 3 изображения в оттенках серого.

Начните вместо этого с:

 from PIL import Image

R, G, B = Image.split(...)
  

Теперь, если вы хотите, чтобы красный канал отображался красным, вам нужно будет вернуть его в цветное изображение, создав пустой (обнуленный) зеленый и синий каналы и объединив их обратно в цветные:

 empty = Image.new("L", SIZE, "black")
RedChannelInRed = Image.merge("RGB", (R, empty, empty))

GreenChannelInGreen = Image.merge("RGB", (empty, G, empty))

BlueChannelInBlue = Image.merge("RGB", (empty, empty, B))
  

В качестве альтернативы, вместо того, чтобы разделять изображение на составляющие его каналы, а затем повторно собирать его, вы могли бы применить цветовую матрицу для преобразования изображения «на месте» следующим образом:

 #!/usr/bin/env python3

from PIL import Image

# Open image
im = Image.open('image.jpg')

# Define color matrix to retain red channel unchanged and zero the green and blue channels
# This says:
# New red   = 1*old red   0*old green   0*old blue   0offset
# New green = 0*old red   0*old green   0*old blue   0offset
# New blue  = 0*old red   0*old green   0*old blue   0offset
RedMatrix = ( 1, 0, 0, 0,
              0, 0, 0, 0,
              0, 0, 0, 0)

Red = im.convert('RGB', RedMatrix)
Red.save('result-R.jpg')

# Do the same thing for Green channel
GreenMatrix = ( 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0)
Green = im.convert('RGB', GreenMatrix)
Green.save('result-G.jpg')

# Do the same thing for Blue channel
BlueMatrix = ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)
Blue = im.convert('RGB', BlueMatrix)
Blue.save('result-B.jpg')
  

введите описание изображения здесь

Комментарии:

1. Спасибо. «L» и SIZE могу я спросить, откуда это взялось? Я не видел этого в документах. Должен ли я создавать переменную для size и L? Еще раз спасибо. В этом задании Coursera не было инструкций о том, как его выполнить, и я пытаюсь понять завершенное задание, которое я нашел, потому что я не буду включать то, чего я не делал или не понимал, поэтому я искренне ценю вашу помощь.

2. Размер для вас, чтобы заполнить — я не знаю, какой размер вашего изображения. Буква «L» означает изображение с одним каналом — она обозначает «Яркость» или «Яркость» и просто означает «серый» .

3. Спасибо. Я продолжаю получать несоответствие размеров. image =Image.open(«readonly/msi_recruitment.gif «) изображение =изображение.преобразовать (‘RGB’) пустое = Изображение.создать (режим = «L», размер = (100, 100)) R, G, B = Изображение. Image.split(изображение) RedChannelInRed = Image.merge(«RGB», (R, пустой, пустой)) GreenChannelInGreen = Image.merge(«RGB», (пустой, G, пустой)) BlueChannelInBlue = Image.merge(«RGB», (пустой, пустой, B))

4. Если я не использую Image. Изображение Я получаю еще одну ошибку, в которой говорится, что у изображения нет атрибута image, я полагаю.

5. Это потому, что вам нужно сделать from PIL import Image вверху.