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.
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’imagemode
: 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))
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)]
[do_widget id=mla-text-widget-2]
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
Merci Quentin 😉
Bravo pour les explications sur la bibliothèque PILLOW…C’est tout simplement limpide..