2012-06-16 2 views
62

Возможно ли получить цвет RGB пикселя с помощью PIL? Я использую этот код:Получите пиксель RGB с использованием PIL

im = Image.open("image.gif") 
pix = im.load() 
print(pix[1,1]) 

Тем не менее, он выводит только номер (например, 0 или 1), а не три числа (например 60,60,60 для R, G, B). Наверное, я ничего не понимаю о функции. Мне понравилось бы объяснение.

Большое спасибо.

ответ

96

Да, это так:

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 цветовой палитры.

См. Также этот пост: Python and PIL pixel values different for GIF and JPEG и этот PIL Reference page содержит дополнительную информацию о функции convert().

Кстати, ваш код будет работать отлично для .jpg изображений.

+0

Это можно сделать для экрана компьютера, а не только для файла изображения? – Musixauce3000

+0

Is Image.getpixel() 0-based или 1-based? Я имею в виду, что верхний левый пиксель равен (0,0) или равен (1, 1)? –

+0

@NimaBavari 0-based. – Nolan

2

GIF хранят цвета как одно из нескольких возможных цветов в палитре. Читайте об gif limited color palette. Таким образом, PIL дает вам индекс палитры, а не информацию о цвете этого цвета палитры.

Edit: Убрана ссылка на блог после решения, которое было опечатка. Другие ответы делают то же самое без опечатки.

1

Альтернативой преобразованию изображения является создание индекса 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) 
2

Не PIL, но 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 
Смежные вопросы