Aller au contenu

Traitement d'images

Introduction

Nous allons nous intéresser dans ce TP à la création et à la modification d'images numériques. En python, on utilise la libraire PIL (pour Python Imaging Library) pour manipuler les images.

Pour charger un objet de type Image, on peut utilise le code suivant.

🐍 Code Python
1
2
3
from PIL import Image
img = Image.open("baboon.png")
img.show()

Ceci affecte Ă  la variable img un objet de type Image que l'on peut manipuler Ă  l'aide des fonctions python du module Image.

Une image numĂ©rique peut ĂȘtre vue comme une tableau 2D (on dit aussi matrice) de pixels. Une image est dite de dimension $m \times n$ si le tableau de pixel qui la reprĂ©sente est constituĂ© de $m$ lignes de $n$ pixels. Chaque pixel de l'image est repĂ©rĂ© par ses coordonnĂ©es.

Attention, les conventions changent par rapport aux mathématiques : l'origine du repÚre est le coin supérieur gauche de l'image, et les ordonnées sont orientées vers le bas.

img

Une image peut-ĂȘtre manipulĂ©e selon deux modes : le mode niveaux de gris (mode "L") et le mode couleur (mode "RGB").

  • En mode noir et blanc, la couleur de chaque pixel est dĂ©crite par un nombre Ă©crit sur $8$ bits. 0 reprĂ©sente la couleur noire, 255 reprĂ©sente la couleur blanche.
  • En mode couleur, la couleur de chaque pixel est dĂ©crite par un triplet de nombres (r, g, b) Ă©crits sur $8$ bits qui indique comment mĂ©langer les trois couleurs rouge (r​ed), vert (g​reen) et bleu (b​lue).

    Par exemple, (255, 0, 0) signifie un rouge pur (rouge au maximum, vert et bleu absents). (0, 255, 0) est un vert pur. (0, 0, 255) est un bleu pur. (255, 255, 255) représente le blanc (toutes les couleurs au maximum). (0, 0, 0) représente le noir (absence de toutes les couleurs). (128, 128, 128) serait un gris moyen.

Par exemple, le code ci-dessous créé une image de dimensions $4\times 2$ au format noir et blanc et modifie le pixel de coordonnées (3, 1) afin que celui-ci soit blanc. Enfin, on sauvegarde l'image dans le fichier exemple.png.

🐍 Code Python
1
2
3
img2 = Image.new("L", (4, 2)) 
img2.putpixel( (2, 1), 255)    
img2.save("exemple.png")

img

On donne dans le tableau ci-dessous la liste de toutes les fonctionnalités utiles du module Image.

Instruction Description
nom_variable = Image.open("chemin_fichier") Ouverture d’un fichier image
nom_variable.show() Affiche l'image nom_variable
nom_variable.mode Mode de l’image : "L" en niveaux de gris, "RGB" en couleurs
nom_variable.format Format de l’image: "PNG", "PPM", 
​
nom_variable.size Dimensions de l’image sous la forme d’un tuple (largeur,hauteur)
nom_variable.save("nom_fichier") Sauvegarde l'image dans nom_fichier
nom_variable = Image.new(mode,(l,h) CrĂ©ation d’une image dans le mode de dimensions (l, h)
nom_variable.getpixel((x,y)) Pixel de coordonnées (x,y). Un nombre ou un triplet, suivant le mode de l'image
nom_variable.putpixel((x,y), valeur) Écriture de la valeur dans le pixel de coordonnĂ©es (x, y)

Exercices

Premier exemple

Récupérer le fichier "baboon.png" sur le github du cours.

Créer un nouveau fichier tp.py et y recopier les lignes suivantes.

🐍 Code Python
1
2
from PIL import Image
img = Image.open("baboon.png")
  1. Déterminer dans la console, le format, le mode et les dimensions de l'image.
  2. Lire et essayer de comprendre le code suivant, quel va ĂȘtre l'image produite ? Puis, tester ce code.

    🐍 Code Python
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    from PIL import Image
    
    im = Image.open("baboon.png")
    largeur, hauteur = img.size
    # L'instruction suivante crée une nouvelle Image en mode RGB
    # et qui possĂ©de les mĂȘmes dimensions que img
    img2 = Image.new("RGB", img.size)
    
    for y in range(hauteur): #parcours des lignes
        for x in range(largeur): #parcours des colonnes d'une ligne
            pixel = im.getpixel((x, y))
            im2.putpixel((x, y),(pixel[0], 0, 0))
    
    img2.show()
    
  3. Modifier le programme qu'il créé une image qui ne garde que la composante en bleu de l'image et affiche cette image.

TV brouillée

Ecrire un programme qui crĂ©e une image en mode "RGB" de dimension $512\times 512 $ pixels. Pour chacun des pixels, la couleur correspondra Ă  trois nombres diffĂ©rents tirĂ©s au hasard, Ă  l’aide de la fonction randint du module random.

🐍 Code Python
1
2
3
from random import randint

print(randint(0, 10)) # tire un nombre aléatoire entre 0 (inclus) et 10 (inclus)

Shades of Grey

Pour convertir une image couleur en niveau de gris, un pixel reprĂ©sentĂ© par ses composantes (r, g, b) doit ĂȘtre remplacĂ© par un pixel Ă  une seule composante codĂ© par un nombre entier compris entre 0 et 255 et appelĂ© luminance.

Une premiùre approche est d’utiliser la moyenne $m = \dfrac{r + g + b}{3}$ pour calculer la luminance.

Ecrire un programme qui crĂ©e une image en mode "L" correspondant Ă  la conversion en niveau de gris de l’image "baboon.png".

Mona Crie

Récupérer les fichiers "mona_fond.png" et cri.jpg depuis le github du cours.

mona_fond.png

cri.jpg

  1. Quel est le code RGB de la couleur des pixels verts dans l’image mona_fond.png ?
  2. Ecrire un programme crĂ©ant une image mona_cri.png. Cette image devra contenir une incrustation de Mona Lisa dans le tableau Le Cri : chacun des pixels verts de Mona Lisa doit ĂȘtre remplacĂ© par un pixel du Cri de mĂȘmes coordonnĂ©es.

Inversion

Pour inverser les contrastes d’une image en niveaux de gris, il suffit d’appliquer à chaque pixel x la valeur 255 – x. Le blanc devient noir et vice-versa.

ComplĂ©ter dans le programme ci-dessous le code de la fonction inverser_gris pour qu’il prenne en argument une Image en niveau de gris, et renvoie une Image dont les contrastes sont inversĂ©s.

🐍 Code Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from PIL import Image

im = Image.open("boats.png")

def inverser_gris(image):
    """ Image -> None """
    # À complĂ©ter

im2 = inverser_gris(im)
im.show()

On pourra utiliser le fichier "boats.png" du dépÎt github afin de tester la fonction.

Noir et blanc

Pour transformer une image en niveaux de gris en une image en noir et blanc, on convient d’un seuil s (avec $0 \leq s \leq 255$) et on remplace chaque pixel de valeur p soit par 0 si $p \leq s$ soit par 255 sinon.

  1. Ecrire une fonction convertir_nb, qui prend en argument une image et un seuil. Elle renvoie l'image convertie avec la méthode de l'énoncé, sans modifier l'image originale.
  2. Tester cette fonction sur l’image "boats.png" pour diffĂ©rentes valeurs de seuil.
  3. Ecrire une fonction convertir_gris, qui prend en argument une image en mode RGB et renvoie une image en niveau de gris. Pour convertir en niveau de gris un pixel de code (r,g,b) on calcule la luminance l avec la formule $l=0,299r+0,587g+0,114b$ .
  4. Appliquer la fonction convertir_gris puis inverser_gris puis convertir_nb avec un seuil de 130 à l’image "baboon.png".

Drapeau Cameroun

Le drapeau du Cameroun est un drapeau tricolore dont les couleurs sont vert (0, 122, 94), rouge (208, 20, 37) et jaune (252, 208, 23).

img

Créer et afficher une image de dimensions $640 \times 429$ correspondant au drapeau camerounais (sans l'étoile du milieu).