Le but de ce sujet de TP est d’introduire l’utilisation de modules externes en Python, à partir de l’exemple de la bibliothèque Pillow qui permet de manipuler des fichiers d’images dans des formats variés.

Préambule

Pour l’installation éventuelle de Pillow, des instructions sont disponibles sur une page séparée.

Avant de commencer, je vous suggère d’aller piocher une image de test pas trop grosse (disons au maximum 1024 pixels dans chaque dimension). À défaut en voilà deux, obtenues à partir d’une photo mise à disposition par Hans Stieglitz sur les Wikimedia commons, et soumise à la licence CC-BY-SA 3.0 :

Filtres d’image

Cette partie du TP concerne l’algorithmique de l’image. Plus précisément, on manipulera des images matricielles, c’est-à-dire représentées par des tableaux de pixels.

On utilise Pillow pour s’affranchir de la question des formats de fichiers.

Ouverture et enregistrement de fichiers d’image avec Pillow

Le bout de code suivant convertit le fichier tigre.jpg (au format JPEG) en tigre.png (au format PNG) :

import PIL.Image as Image
im = Image.open('tigre.jpg')
im.save('tigre.png')

Essayez chez vous.

Informations sur une image

Dans un interpréteur Python, essayez :

import PIL.Image as Image
im = Image.open('tigre.jpg')

puis essayez d’utiliser la documentation interne de python (par exemple via la commande help de l’interpréteur) pour explorer les informations fournies par l’objet image.

Essayez par exemple d’obtenir sa taille.

Représentation d’une image en mémoire

Si im est une image chargée avec PIL.Image.open, on accède à ses pixels via la fonction im.load() qui renvoie un tableau indexé par des couples d’entiers (et non pas une matrice au sens python du terme).

Par exemple,

pixels = im.load()
print(pixels[0,0])

renvoie la valeur du pixel en haut à gauche de l’image.

Affichez des pixels de l’image en couleurs, puis de l’image en noir et blanc. Que remarquez-vous ?

Modifier une image

Pour modifier un pixel, on change sa valeur dans le tableau des pixels. Essayez :

pixels[0,0] = 0
im.save('tigre_mod.png')

Est-ce que ça fonctionne avec l’image en noir et blanc ? Avec celle en couleurs ? Quel est l’effet produit.