Ottieni l'RGB del pixel usando PIL


93

È possibile ottenere il colore RGB di un pixel utilizzando PIL? Sto usando questo codice:

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

Tuttavia, restituisce solo un numero (ad esempio 0o 1) e non tre numeri (ad esempio 60,60,60per R, G, B). Immagino di non capire qualcosa sulla funzione. Mi piacerebbe qualche spiegazione.

Molte grazie.

Risposte:


147

Sì, in questo modo:

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)

Il motivo per cui prima ottenevi un singolo valore pix[1, 1]è perché i pixel GIF si riferiscono a uno dei 256 valori nella tavolozza dei colori GIF.

Vedi anche questo post SO: Python e PIL pixel valori diversi per GIF e JPEG e questa pagina di riferimento PIL contiene ulteriori informazioni sulla convert()funzione.

A proposito, il tuo codice funzionerebbe perfettamente per le .jpgimmagini.


1
È possibile farlo per lo schermo del computer e non solo per un file immagine?
Musixauce3000

1
Image.getpixel () è basato su 0 o su 1? Voglio dire, il pixel in alto a sinistra è (0,0) o è (1, 1)?

2
@NimaBavari È basato su 0.
Nolan

3

Le GIF memorizzano i colori come uno del numero x di possibili colori in una tavolozza. Leggi la tavolozza dei colori limitata alle GIF . Quindi PIL ti sta dando l'indice della tavolozza, piuttosto che le informazioni sul colore di quel colore della tavolozza.

Modifica: collegamento rimosso a una soluzione di post sul blog che conteneva un errore di battitura. Altre risposte fanno la stessa cosa senza errori di battitura.


2

Un'alternativa alla conversione dell'immagine è creare un indice RGB dalla tavolozza.

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

Non PIL, ma imageio.imreadpotrebbe comunque essere interessante:

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)

così è (altezza, larghezza, canali). Quindi il pixel in posizione (x, y)è

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

Obsoleto

scipy.misc.imreadè deprecato in SciPy 1.0.0 (grazie per il promemoria, fbahr !)


PSA: scipy.misc.imreadè deprecato! imreadè deprecato in SciPy 1.0.0 e verrà rimosso in 1.2.0. Usa imageio.imreadinvece.
fbahr

1
Grazie per il promemoria, fbahr! (In realtà ero coinvolto nel deprecarlo - github.com/scipy/scipy/issues/6242 🙈)
Martin Thoma
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.