====== Traitement des images en Python ====== {{ :prog:lena.jpg?direct&300|Lena}} Permet des traiter une (grande) partie du chapitre Photographie numérique de SNT. 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/5.1.x/handbook/index.html|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") 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) 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()