191 votes

Comment lire la valeur RVB d'un pixel donné en Python ?

Si j'ouvre une image avec open("image.jpg") Comment puis-je obtenir les valeurs RVB d'un pixel en supposant que j'ai les coordonnées du pixel ?

Alors, comment puis-je faire l'inverse ? En partant d'un graphique vide, "écrire" un pixel avec une certaine valeur RVB ?

Je préférerais ne pas avoir à télécharger de bibliothèques supplémentaires.

254voto

Dave Webb Points 90034

Il est probablement préférable d'utiliser le Bibliothèque d'images Python pour le faire, ce qui, j'en ai peur, est un téléchargement séparé.

Le moyen le plus simple de faire ce que vous voulez est d'utiliser la fonction méthode load() sur l'objet Image qui renvoie un objet d'accès aux pixels que vous pouvez manipuler comme un tableau :

from PIL import Image

im = Image.open('dead_parrot.jpg') # Can be many different formats.
pix = im.load()
print im.size  # Get the width and hight of the image for iterating over
print pix[x,y]  # Get the RGBA Value of the a pixel of an image
pix[x,y] = value  # Set the RGBA Value of the image (tuple)
im.save('alive_parrot.png')  # Save the modified pixels as .png

Vous pouvez également consulter ImageDraw qui offre une API beaucoup plus riche pour la création d'images.

1 votes

Heureusement, l'installation de PIL est très simple sous Linux et Windows (je ne sais pas pour Mac).

7 votes

@ArturSapek, j'ai installé PIL par pip ce qui était assez facile.

1 votes

Je l'ai utilisé sur mon Mac (Pypi) : easy_install --find-links http://www.pythonware.com/products/pil/ Imaging

26voto

Constantin Points 12185

PyPNG - décodeur/encodeur PNG léger

Bien que la question fasse allusion à JPG, j'espère que ma réponse sera utile à certaines personnes.

Voici comment lire et écrire des pixels PNG en utilisant Module PyPNG :

import png, array

point = (2, 10) # coordinates of pixel to be painted red

reader = png.Reader(filename='image.png')
w, h, pixels, metadata = reader.read_flat()
pixel_byte_width = 4 if metadata['alpha'] else 3
pixel_position = point[0] + point[1] * w
new_pixel_value = (255, 0, 0, 0) if metadata['alpha'] else (255, 0, 0)
pixels[
  pixel_position * pixel_byte_width :
  (pixel_position + 1) * pixel_byte_width] = array.array('B', new_pixel_value)

output = open('image-with-red-dot.png', 'wb')
writer = png.Writer(w, h, **metadata)
writer.write_array(output, pixels)
output.close()

PyPNG est un seul module Python pur de moins de 4000 lignes, tests et commentaires compris.

LIP est une bibliothèque d'images plus complète, mais elle est aussi beaucoup plus lourde.

13voto

Comme l'a dit Dave Webb :

Voici mon code de travail qui imprime les couleurs des pixels à partir d'un fichier de type d'une image :

import os, sys
import Image

im = Image.open("image.jpg")
x = 3
y = 4

pix = im.load()
print pix[x,y]

0 votes

Pourquoi est-ce que j'obtiens quatre valeurs lorsque j'exécute le code de Lachlan Phillips ? Je donne ceci : print(pix[10,200]) et j'obtiens ceci : (156, 158, 157, 255) Pourquoi ?

1 votes

La raison en est probablement que votre image supporte la transparence alpha et qu'elle est au format rgba, ce qui signifie que la quatrième valeur correspond à la transparence du pixel.

0 votes

Pourquoi est-ce que je reçois cette erreur ? File "/home/UbuntuUser/.local/lib/python3.8/site-packages/PIL/Ima‌​ge.py", line 3008, in open raise UnidentifiedImageError( PIL.UnidentifiedImageError: cannot identify image file 'test_images/test_UAV.tif')

3voto

Dean Points 3017

Je pense que la bibliothèque d'images Python serait utile ici.

LIP

3voto

Jon Cage Points 14126

Il y a un très bon article sur wiki.wxpython.org intitulé Travailler avec des images . L'article mentionne la possibilité d'utiliser wxWidgets (wxImage), PIL ou PythonMagick. Personnellement, j'ai utilisé PIL et wxWidgets et tous deux rendent la manipulation des images assez facile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X