2012-06-16 30 views
62

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

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

Sin embargo, sólo da salida a 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 una explicación.

Muchas gracias.

Respuesta

96

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 recibiendo un único valor antes con pix[1, 1] se debe a GIF píxeles se refieren a uno de los 256 valores en la paleta de colores GIF.

Consulte también esta publicación SO: Python and PIL pixel values different for GIF and JPEG y esta PIL Reference page contiene más información sobre la función convert().

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

+0

¿Se puede hacer esto para la pantalla de la computadora, y no solo como un archivo de imagen? – Musixauce3000

+0

¿Image.getpixel() está basado en 0 o en 1? Quiero decir, ¿el píxel superior izquierdo es (0,0) o es (1, 1)? –

+0

@NimaBavari Está basado en 0. – Nolan

2

Los GIF almacenan colores como uno de x número de colores posibles en una paleta. Lea sobre el gif limited color palette. Entonces, PIL le proporciona el índice de paleta, en lugar de la información de color de ese color de paleta.

Editar: eliminó el enlace a una solución del blog post que tenía un error tipográfico. Otras respuestas hacen lo mismo sin el error tipográfico.

1

Una alternativa para convertir 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) 
2

No PIL, pero scipy.misc.imread todavía 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) 

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

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