Получить пиксель RGB с использованием PIL
Можно ли получить цвет RGB пикселя с помощью PIL?
Я использую этот код:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
Однако он выводит только число (например, 0
или 1
), а не три числа (например, 60,60,60
для R, G, B). Наверное, я ничего не понимаю о функции. Мне понравилось бы объяснение.
Большое спасибо.
Ответы
Ответ 1
Да, таким образом:
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 содержит дополнительную информацию о функции convert()
.
Кстати, ваш код будет отлично работать для изображений .jpg
.
Ответ 2
GIF хранят цвета как одно из x возможных цветов в палитре. Читайте о ограниченной цветовой палитре gif. Таким образом, PIL дает вам индекс палитры, а не информацию о цвете цвета этой палитры.
Изменить: Удалена ссылка на решение для публикации в блоге, в котором была опечатка. Другие ответы делают то же самое без опечатки.
Ответ 3
Не PIL, но imageio.imread
все еще может быть интересным:
import imageio
im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB')
im = imageio.imread('Figure_1.png', pilmode='RGB')
print(im.shape)
дает
(480, 640, 3)
так оно и есть (высота, ширина, каналы). Таким образом, пиксель в позиции (x, y)
color = tuple(im[y][x])
r, g, b = color
устаревший
scipy.misc.imread
устарела в SciPy 1.0.0 (спасибо за напоминание, fbahr !)
Ответ 4
Альтернативой преобразованию изображения является создание индекса 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)