#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
вверху.