====== 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()