====== Traitement d'image ======
===== Activités en Python =====
{{ :prog:lena.jpg?direct&300|Lena}}
Un grand nombre de fonctions sont disponibles dans la bibliothèque PIL (Python Imaging Library) disponible dans le paquetage Pillow, dont voici un [[https://pillow.readthedocs.io/en/stable/|manuel]].
Après avoir installé Pillow **si nécessaire** :
# Par exemple :
pip install pillow
# à adapter selon distribution de Python (conda etc.)
On dispose de la bibliothèque PIL proposant plusieurs modules, dont Image, qui met à disposition une classe d'objets du même nom.\\
De très nombreux formats de fichiers d'images sont utilisables, et reconnus **par leur extension**.
===== Exemple de traitement =====
L'exemple suivant consiste à ouvrir une image couleur dans un fichier jpg, la charger en mémoire, créer une autre image - en niveaux de gris cette fois - dont les pixels auront pour valeur la moyenne des composantes de l'image couleur, et enfin enregistrer cette nouvelle image dans un fichier png.
from PIL import Image
# Ouverture d'un fichier et affectation à un objet de la classe Image
mon_image = Image.open("lena.jpg")
Ici, ''mon_image'', objet de la classe ''Image'' est un tableau de pixels, composé de 1 à 4 valeurs numériques en fonction du type de fichier (1 entier pour une image en niveau de gris, 3 pour une image couleur RVB et 4 pour une image couleur CMYK.
Par ailleurs, un objet de la classe ''Image'', est un tuple : il n'est pas mutable. On ne peut donc pas modifier directement un élément, il faudra passer par une recopie dans un autre objet.
On peut obtenir des caractéristiques de cet objet :
print("Format : ", mon_image.format) # Format de fichier
largeur, hauteur = mon_image.size # Tuple l, h en pixels
print("Taille : ", largeur, "x", hauteur)
print("Mode : ", mon_image.mode) # L (luminance), RGB, CMYK...
mon_image.show() # affichage de l'image via le programme par défaut du système
Pour les méta-données exif, et en particulier GPS, voir mon_image._getexif() en particulier.\\
Exemples [[https://www.sylvaindurand.fr/gps-data-from-photos-with-python/|ici]] et [[https://stackoverflow.com/questions/4764932/in-python-how-do-i-read-the-exif-data-for-an-image| là]].
Pour accéder à un pixel :
pixou = (10,10) # par exemple... pixel de coordonnées (10,10). La numérotation commence à 0
couleurs = mon_image.getpixel(pixou) # Retourne un tuple contenant les 3 composantes r, g, b
print(couleurs)
Pour créer une nouvelle image :
nouvelle_image = Image.new("L", mon_image.size) # L : mode niveaux de gris
Écrire des pixels dans l'image :
for i in range(largeur):
for j in range (hauteur):
r, g, b = mon_image.getpixel((i,j))
moy = int((r + g + b)/3)
nouvelle_image.putpixel((i,j), moy)
Enregistrer l'image dans un fichier :
nouvelle_image.save("image_modif.png") # L'extension détermine le format de fichier
# fermeture des fichiers
mon_image.close()
nouvelle_image.close()