Изображение Python PIL разделено на RGB

Как разбить изображение на цвета RGB и почему не работает функция split()?

from PIL import Image
pil_image = Image.fromarray(some_image)
red, green, blue = pil_image.split()
red.show()

Почему red.show() показывает изображение в оттенках серого, а не в красном?

PS. Такая же ситуация с green.show() и blue.show().


person yeyugelire    schedule 13.07.2018    source источник
comment
Все split каналы - это просто значения этого конкретного канала, поэтому все они отображаются в оттенках серого при отображении.   -  person John Anderson    schedule 13.07.2018


Ответы (3)


Я создал сценарий, который берет изображение RGB и создает данные пикселей для каждой полосы, подавляя полосы, которые нам не нужны.

RGB to R__ -> red.png

RGB to _G_ -> green.png

RGB to __B -> blue.png

from PIL import Image

img = Image.open('ra.jpg')
data = img.getdata()

# Suppress specific bands (e.g. (255, 120, 65) -> (0, 120, 0) for g)
r = [(d[0], 0, 0) for d in data]
g = [(0, d[1], 0) for d in data]
b = [(0, 0, d[2]) for d in data]

img.putdata(r)
img.save('r.png')
img.putdata(g)
img.save('g.png')
img.putdata(b)
img.save('b.png')

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

person Alistair Carscadden    schedule 27.07.2018

Одноканальное изображение всегда отображается в оттенках серого. Если вы хотите, чтобы он отображался в исходных цветах (например, красный канал «R», синий канал «B», зеленый канал «G»), вам необходимо объединить 3 канала и обнулить те, которые вам не интересны. Не забудьте сохранить канал порядок, чтобы не получить красный канал "G".

Может быть проще просто взять 3 копии изображения и обнулить нерелевантные каналы, чем использовать разделение.

person Pam    schedule 13.07.2018
comment
Я видел что-то вроде: plt.imshow(red, cmap="Reds") plt.show() Используя pyplot, для него он работает, и у меня есть оттенки серого. - person yeyugelire; 13.07.2018

Вы можете использовать OpenCV или Pillow. И то, и другое просто. Я написал класс (Использует подушку, https://github.com/mujeebishaque/image-splitter), который вы можете использовать и получить все каналы, сохраненные в текущем каталоге, просто вызвав функцию.

В OpenCV вы должны использовать метод split() на изображении для получения каналов RGB или RGBA.

person Mujeeb Ishaque    schedule 27.02.2021
comment
И все каналы кажутся немного похожими, поэтому, как только вы их сохраните, посмотрите на них в виде эскизов, и вы заметите разницу. - person Mujeeb Ishaque; 27.02.2021