Можно ли получить цвет пикселя RGB с помощью PIL? Я использую этот код:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
Однако он выводит только число (например, 0
или1
), а не три числа (например, 60,60,60
для R, G, B). Думаю, я чего-то не понимаю в функции. Я хотел бы получить какое-нибудь объяснение.
Большое спасибо.
GIF-файлы хранят цвета как один из x возможных цветов в палитре. Читайте об ограниченной цветовой палитре gif . Таким образом, PIL дает вам индекс палитры, а не информацию о цвете этой палитры.
Изменить: удалена ссылка на решение для публикации в блоге с опечаткой. Другие ответы делают то же самое без опечатки.
источник
Альтернативой преобразованию изображения является создание индекса 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)
источник
Не 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)
находитсяУстаревший
scipy.misc.imread
является устаревшим в SciPy 1.0.0 (спасибо за напоминание, fbahr !)источник
scipy.misc.imread
устарело!imread
устарела в SciPy 1.0.0 и будет удалена в 1.2.0.imageio.imread
Вместо этого используйте .С numpy:
im = Image.open('image.gif') im_matrix = np.array(im) print(im_matrix[0][0])
Задайте вектор RGB пикселя в позиции (0,0)
источник