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.
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
.
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.
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
scipy.misc.imread
est obsolète dans SciPy 1.0. (merci pour le rappel, fbahr !)
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)