Manipulation d'images en Python

Nous allons utiliser l'éditeur de code Thonny. Pour commencer donc, ouvrir Thonny et enregistrer l'image ci-dessous sur votre ordinateur.

Découverte de PIL

Charger une image

photo-pil.py
from PIL import Image

image = "feudartifice.jpg"

im = Image.open(image)

print("Voici les propriétés de l'image :", im.format, im.size, im.mode)
Copier ce code, et le coller dans la fenêtre Thonny. Enregistrer le fichier dans le même dossier que l'image, puis exécuter le code.
Que signifient les trois valeurs qui s'affichent ?

Les pixels de l'image

lire un pixel

On peut afficher les composantes (R,V,B) d'un pixel grâce à la fonction getpixel((x,y)). Attention aux double parenthèses !
x et y représentent les positions respectivement horizontale et verticale du pixel dans l'image, en sachant que l'origine (0,0) correspond au coin supérieur gauche.
Par exemple :

from PIL import Image

image = "feudartifice.jpg"

im = Image.open(image)

print("Voici les propriétés de l'image :", im.format, im.size, im.mode)

print(im.getpixel((92,15)))
print(im.getpixel((600,600)))

modifier un pixel

On peut également modifier un pixel, grâce à la fonction putpixel((x,y), (r, v, b)). Par exemple, la commande im.putpixel((84, 42), (0,0,0)) va avoir pour effet de modifier la couleur du pixel aux coordonnées (84,42). Sa nouvelle couleur sera (0,0,0), soit noir.

Modifier une image

Nous allons transformer l'image du feu d'artifice en niveaux de gris (noir et blanc). Nous avons vu précédemment que le noir est codé en RVB (0,0,0) et que blanc est codé (255, 255, 255). Nous pouvons ajouter une information importante pour la suite : toutes les nuances de gris sont composées de la même valeur pour R, V et B.

Copier le code suivant à la place du précédent.

from PIL import Image

image = "feudartifice.jpg"
im = Image.open(image)

(l,h) = im.size #on a dans l la largeur et dans h la hauteur

#maintenant, on créé une nouvelle image aux mêmes dimensions
image_nb = Image.new('RGB', (l,h))


for i in range(500):
    for j in range(300):
        (r,g,b) = im.getpixel((i,j))
        moy = round(255)
        image_nb.putpixel((i,j), (moy,moy,moy))
        
image_nb.save("image_nb.jpg")
À quoi ressemble l'image ? Pourquoi a-t-on ce résultat ?
Modifions ensemble ce code pour obtenir ce que l'on veut !