Obtenir le RVB de pixel en utilisant PIL

est-il possible d'obtenir la couleur RGB d'un pixel en utilisant PIL? J'utilise ce code:

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

cependant, il ne produit qu'un nombre (par exemple 0 ou 1 ) et non pas trois nombres (par exemple 60,60,60 pour R,G,B). Je suppose que je ne comprends pas quelque chose à propos de la fonction. J'aimerais quelques explications.

Merci beaucoup.

70
demandé sur Levon 2012-06-16 19:32:25

4 réponses

oui, par ici:

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 raison pour laquelle vous obteniez une valeur unique avant avec pix[1, 1] est parce que les pixels GIF se réfèrent à l'une des 256 valeurs dans la palette de couleurs GIF.

Voir Aussi ce billet: les valeurs de pixels Python et PIL diffèrent pour GIF et JPEG et cette page de référence PIL contient plus d'informations sur la fonction convert() .

par le votre code fonctionnerait très bien pour les images .jpg .

107
répondu Levon 2017-07-26 12:26:53

pas PIL, mais scipy.misc.imread pourrait encore être intéressant:

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

donne

(480, 640, 3)

il en est ainsi (hauteur, largeur, chenaux). Donc le pixel à la position (x, y) est

color = tuple(im[y][x])
r, g, b = color
3
répondu Martin Thoma 2016-07-24 09:02:55

GIFs stockent des couleurs comme l'un de x nombre de couleurs possibles dans une palette. Lisez à propos de la palette de couleurs gif limited . Donc PIL vous donne l'index de palette, plutôt que l'information de couleur de cette couleur de palette.

Edit: LIEN SUPPRIMÉ à une solution de blog post qui avait une typographie. D'autres réponses font la même chose sans la faute de frappe.

2
répondu KobeJohn 2012-06-16 17:04:17

une alternative à la conversion de l'image est de créer un index RVB à partir de la palette.

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)
1
répondu Marcel Wilson 2016-07-07 20:11:31