Pillow

source : https://pillow.readthedocs.io/en/latest/handbook/tutorial.html

Pillow (évolution de la bibliothèque PIL – Python Imaging Library) est une bibliothèque Python permettant la manipulation des images.

Installation

Pour installer PIL pour la version de Python de ton environnement de travail :

  • Lancer VSCodium
  • Ouvrir un dossier (en créer un avant si besoin)
  • Ouvrir un terminal Powershell
  • Changer de dossier courant vers le dossier contenant pip.exe (<DossierPyton>\Scripts)
  • Exécuter la commande :
.\pip install pillow

Télécharger l’image ci-contre (enregistrer l’image sous le nom discus.jpg) afin de pouvoir traiter les exemples de code qui vont suivre…

 

L’objet Image

L’objet de base de PIL est défini dans la classe Image, du module du même nom.

from PIL import Image               # Import de la classe Image

Ouverture d’un fichier image

img = Image.open("discus.jpg")      # Ouverture d'un fichier au format jpg
print(img)

affiche :

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1920x1280 at 0x6CD6670>

img est un objet PIL.JpegImagePlugin.JpegImageFile : une sous-classe de la classe PIL.Image …

Information sur une image

print(img.format, img.size, img.mode)

affiche :

JPEG (1920, 1280) RGB

Principaux attributs de l’objet Image :

  • format : format de la source de l’image (si elle provient d’un fichier)
  • size : taille (en pixels) de l’image
  • mode : noms et type des différents canaux de l’image ("RGB" = 3 canaux Rouge, Vert et Bleu – "L" = un canal pour niveaux de gris – …)

 

Affichage d’une image

img.show()

La méthode show() n’est pas très efficace, car elle crée un fichier temporaire sur le disque dur, puis l’affiche avec l’application par défaut du système.

 

Enregistrement d’un image dans un fichier

Pour enregistrer une image dans un fichier, l’objet Image possède une méthode save() qui permet de choisir le format d’enregistrement :

img.save("discus.png", "PNG")

Remarque : pour gérer d’éventuelles erreurs de lecture ou d’enregistrement, il peut être judicieux d’intercepter les exceptions d’erreur.

try:
   img.save("discus.png", "PNG")
except IOError:
   print("Erreur d'enregistrement !")

 

Découper une image

oeil = img.crop((1050, 650, 1300, 800))
oeil.show()

La région à découper est définie par 4 coordonnées (gauche, haut, droit, bas) en pixels.

Rappel : dans le système de coordonnées d’une image, l’origine (0,0) se situe en haut à gauche.

 

Collage d’une image dans une autre

img.paste(oeil, (1000, 500, 1250, 650))
img.show()

Attention : la région de collage doit être exactement de la même taille que la portion d’image à coller !

 

 

Séparation des canaux

r, v, b = img.split()
r.show()
v.show()
b.show()

canaux rouge, vert et bleu de l’image :

Transformations géométriques

Rotation

img1 = img.rotate(45)

angle en degrés, dans le sens des aiguilles d’une montre.

Remarque : rajouter un argument expand = True  permet d’éviter que l’image ne soit coupée.

 

Redimensionnement

img2 = img.resize((100, 250))

Transposition

La méthode transpose() permet des modifications de géométrie simples :

img3 = img.transpose(Image.FLIP_LEFT_RIGHT)
img4 = img.transpose(Image.FLIP_TOP_BOTTOM)
img5 = img.transpose(Image.ROTATE_90)
img6 = img.transpose(Image.ROTATE_180)
img7 = img.transpose(Image.ROTATE_270)

 

Conversion d’une image

La méthode convert() permet de modifier le mode de l’image.

Par exemple, on peut convertir une image RGB en une image en niveaux de gris :

img_nb = img.convert("L")

 

 

Traitements de l’image

PIL possède de nombreuses méthodes de traitement des images (amélioration, correction, filtrage, …).

Filtres

Les filtres sont contenus dans le module ImageFilter et applicable par la méthode filter().

from PIL import ImageFilter

Par exemple , amélioration de la netteté :

nag = img.crop((850, 600, 1000, 700))
nag_net = nag.filter(ImageFilter.DETAIL)

avant

après

 

Modification par pixel

La méthode point() permet de modifier une image pixel par pixel, grâce à une fonction de transformation.

Exemples :

  • Augmentation de la luminosité (la valeur de chaque pixel est multiplié par 1,5) :
img_lum = img.point(lambda i: i * 1.5)

  • Augmentation de l’intensité du canal rouge seulement :
R, V, B = img.split()
R = R.point(lambda i: i * 1.5)
imr_r = Image.merge(img.mode, (R, V, B))   # La méthode .merge() permet de recomposer une image à partir de plusieurs canaux

 

Accès aux pixels

Il est possible d’accéder indépendamment à chaque pixel de l’image à l’aide deux méthodes :

  • getpixel((x, y)) renvoie la valeur du pixel de coordonnées (x, y)
pixels = img.getpixel((0,0))
print(pixels)
  • putpixel((x, y), pixel) affecte la valeur pixel au pixel de coordonnées (x, y)
img.putpixel((0,0), (255, 0, 0))
Connectique RPI
Remplacer tous les pixels à dominante rouge (quand le niveau de rouge supérieur à tous les autres niveaux), par des pixels noirs.

 

Ajustements photo

Le module ImageEnhance permet des ajustement classique de la photographie : luminosité, contraste, balance des couleurs, netteté, … de manière plus simple encore.

from PIL import ImageEnhance

Ce module s’utilise en créant un objet « Ajustement » (ImageEnhance) :

ajust = ImageEnhance.Contrast(img)
ajust.enhance(1.3).show("Contraste +30%")

 

Conversion en liste

Il est possible de récupérer les valeurs des pixels d’une image sous la forme d’une liste.

Attention : le type list de Python n’est pas optimisé pour la manipulation des images. À réserver uniquement pour des traitements particuliers !

data = list(img.getdata())

Il s’agit d’une liste simple, pour obtenir l’image dans un format « liste de lignes », on peut procéder ainsi :

n = img.size[0]
img_point = [data[i:i + n] for i in range(0, len(data), n)]

 

 


Widget not in any sidebars

Vous aimerez aussi...

3 réponses

  1. Quentin dit :

    Tomber 4 ans après le lycée sur ce site en faisant une recherche python pour le boulot, c’est fantastique !
    Quentin T05 2016-2017

  2. bruno FLECHARD dit :

    Bravo pour les explications sur la bibliothèque PILLOW…C’est tout simplement limpide..

Répondre à cfaury Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *