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.
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
.
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
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.
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)