Pillow

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

Pillow (ex 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’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 durDisque dur Un disque dur, parfois abrégé DD, HD ou HDD (Hard Disque Drive), est une mémoire de masse magnétique utilisée principalement dans les ordinateurs, mais également dans des baladeurs numériques, des caméscopes, des lecteurs/enregistreurs de DVD de salon, des consoles de jeux vidéo, etc.  , 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 erreur de lecture ou d’enregistrement, il peut être judicieux d’intercepter les exception 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))

 

Activité :

  • Remplacer tous les pixels à dominante rouge (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. A 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...

Laisser un commentaire

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

*

code