web-dev-qa-db-fra.com

Obtenir le pixel RVB en utilisant PIL

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

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

Cependant, il n’envoie qu’un nombre (par exemple, 0 ou 1) et non trois chiffres (par exemple 60,60,60 pour R, G, B). Je suppose que je ne comprends pas quelque chose à propos de la fonction. J'aimerais une explication.

Merci beaucoup.

78
GermainZ

Oui, de cette façon:

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 auparavant avec pix[1, 1] Est que les pixels GIF font référence à l'une des 256 valeurs de la palette de couleurs GIF.

Voir aussi ceci SO post: valeurs de pixels Python et PIL différentes pour GIF et JPEG et ceci page de référence PIL contient plus d'informations sur le convert() fonction.

En passant, votre code fonctionnerait parfaitement pour les images .jpg.

127
Levon

Les GIF stockent les couleurs sous forme d'un nombre x de couleurs possibles dans une palette. Lisez à propos de la palette palette de couleurs gif limitée . Ainsi, PIL vous donne l'indice de la palette, plutôt que les informations de couleur de cette couleur.

Modifier: Suppression du lien vers une solution de publication de blog contenant une faute de frappe. D'autres réponses font la même chose sans faute de frappe.

3
KobeJohn

Pas PIL, mais imageio.imread pourrait encore être intéressant:

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

donne

(480, 640, 3)

il en va de même (hauteur, largeur, canaux). Donc, le pixel en position (x, y) est

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

Dépassé

scipy.misc.imread est obsolète dans SciPy 1.0. (merci pour le rappel, fbahr !)

2
Martin Thoma

Une alternative à la conversion de l'image consiste à 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
Marcel Wilson