Obtener pixel RGB usando PIL

¿Es posible obtener el color RGB de un píxel utilizando PIL? Estoy usando este código:

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

Sin embargo, solo genera un número (por ejemplo, 0 o 1 ) y no tres números (por ejemplo, 60,60,60 para R, G, B). Supongo que no estoy entendiendo algo sobre la función. Me encantaría alguna explicación.

Muchas gracias.

Sí, de esta manera:

 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) 

La razón por la que estaba obteniendo un solo valor antes con la imagen pix[1, 1] es porque los píxeles GIF se refieren a uno de los 256 valores en la paleta de colores GIF.

Vea también este post SO: Los valores de píxeles de Python y PIL diferentes para GIF y JPEG y esta página de referencia de PIL contiene más información sobre la función convert() .

Por cierto, tu código funcionaría bien para imágenes .jpg .

Los GIF almacenan colores como una de x cantidad de colores posibles en una paleta. Lea acerca de la paleta de colores limitada GIF . Por lo tanto, PIL le proporciona el índice de paleta, en lugar de la información de color de ese color de paleta.

Edición: se eliminó el enlace a una solución de publicación de blog que tenía un error tipográfico. Otras respuestas hacen lo mismo sin el error tipográfico.

No PIL, pero scipy.misc.imread podría ser interesante:

 import scipy.misc im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB') print(im.shape) 

da

 (480, 640, 3) 

así es (altura, anchura, canales). Así que el píxel en la posición (x, y) es

 color = tuple(im[y][x]) r, g, b = color 

Una alternativa a la conversión de la imagen es crear un índice RGB desde la paleta.

 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)