Получить RGB пикселя с помощью PIL
можно ли получить цвет RGB пикселя с помощью PIL?
Я использую этот код:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
однако он выводит только число (например,0 или 1) и не три числа (например 60,60,60 для R, G, B). Я думаю, что я не понимаю что-то о функции. Я бы хотел получить некоторые объяснения.
Спасибо большое.
4 ответов:
Да, это так:
im = Image.open('image.gif') rgb_im = im.convert('RGB') r, g, b = rgb_im.getpixel((1, 1)) print(r, g, b) (65, 100, 137)причина, по которой вы получаете одно значение с
pix[1, 1]это потому, что пиксели GIF относятся к одному из 256 значений в цветовой палитре GIF.см. Также этот пост SO:значения пикселей Python и PIL отличаются для GIF и JPEG и Pil Reference page содержит дополнительную информацию о
не пил, но
scipy.misc.imreadеще может быть интересно:import scipy.misc im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB') print(im.shape)дает
(480, 640, 3)так оно и есть (высота, ширина, каналы). Так что пиксель в положении
(x, y)иcolor = tuple(im[y][x]) r, g, b = color
GIF-файлы хранят цвета как один из x возможных цветов в палитре. Читайте о gif ограниченная цветовая палитра. Таким образом, PIL дает вам индекс палитры, а не информацию о цвете этого цвета палитры.
Edit: удалена ссылка на решение для публикации в блоге, в котором была опечатка. Другие ответы делают то же самое без опечатки.
альтернативой преобразованию изображения является создание индекса RGB из палитры.
from PIL import Image def chunk(seq, size, groupByList=True): """Returns list of lists/tuples broken up by size input""" func = tuple if groupByList: func = list return [func(seq[i:i + size]) for i in range(0, len(seq), size)] def getPaletteInRgb(img): """ Returns list of RGB tuples found in the image palette :type img: Image.Image :rtype: list[tuple] """ assert img.mode == 'P', "image should be palette mode" pal = img.getpalette() colors = chunk(pal, 3, False) return colors # Usage im = Image.open("image.gif") pal = getPalletteInRgb(im)
Comments