Activité 3 - Les traitements d'image

Structures de base

Dans les travaux sur les images, on utilisera la bibliothèque PIL du langage de programmation Python.

Pour créer une nouvelle image qu'on utilise comme un fond de couleur noire, on doit importer d'abord le module Image de la bibliothèque PIL et utiliser la fonction Image.new("RGB", (L , H), (R, V, B)).

Le premier paramètre de cette fonction permet de préciser qu'il s'agit d'une image de codage RVB.

Le second permet de créer une image d’affichage aux dimensions souhaitées :(500,400) crée une image de largeur 500 pixels et de hauteur 400 pixels.

Le dernier (R, V, B) corespond au code couleur

Pour afficher une image, on utilise la fonction show()

Exemple 2

from PIL import Image
couleur=(
255,255,0) # couleur jaune en code couleur RVB : ici R=255, V=255 et B=0
fond=Image.new('
RGB',(600,400),couleur) # création d'une image de de largeur 600 pixels et de hauteur 400 pixels, jaune
fond.show()

Erxercice

1. Dans le dossier "Photographie" créer un dossier et appeler le "partie3", ensuite créer, sous EduPython, un fichier nommé fond.py et l’enregistrer dans ce dossier

2. Dans ce fichier, recopier le script donné ci-dessus et l’exécuter. Vérifier les commentaires du code.

3. Modifier ce programme de sorte que le fond affiché soit de couleur vert pistache.

Aide : On trouve sur le site un nuancier de couleurs RVB qui pourra être utile.

4. Modifier ce programme de sorte que l'image soit désormais de 850 pixels de largeur et 560 en hauteurs et de couleur au choix.

Aide : On trouve sur ce site les plus de 16 millions possibles en code couleur RVB, faites-vous plaisir.

Extraction du code couleur sur une image

La pipette d'un logiciel de retouche de photo permet de récupérer le code RVB d'un pixel.

Ci-dessous, on a prélevé la couleur d'un même pixel sur une image en couleur, puis sur cette image après passage en niveaux gris.

pixelspixels

Source des images : SNT 2de, Sciences numériques et Technologie, page 109, édition Delagrave, Paris 2019.

Remarque

Pour chaque pixel, on calcule d’abord la valeur nommée g en niveau de gris en fonction des trois valeurs de ses composantes (r,v,b)

en utilisant la formule suivante :

g=0,11×r+0,83×v+0,06×b

Exercice

1. Donner les trois composantes (r,v,b) du pixel indiqué dans l'image en couleur ci-dessus.

2. Que représentent les trois valeurs 7, 62 et 79? Comment obtient-on ces valeurs ?

3. Que représente la valeur 146 indiquée sur l'image en niveau de gris ? Comment obtient-on cette valeur ?

4. Que représente la valeur 57? Comment obtient-on cette valeur ?

Transformation d'une image RVB en niveaux de gris

Lecture et écriture d’un pixel en langage Python

On a déjà vu que chaque pixel d’une image est repéré par ses coordonnées (x, y) et ses composantes (R,V,B).

Pour lire les informations (r, v, b) du pixel de coordonnées (x, y) de l’image nommée "im", on utilise l’instruction :

r,v,b =im.getpixel (( x , y ))

Dans ces instructions, les coordonnées (x, y) sont données par rapport au coin supérieur gauche de l’image "im" (et pas par rapport au coin de la fenêtre).

Pour récupérer les dimensions de l'image "im", on utilise l'instruction :

largeur,hauteur=im.size

Niveau de Gris

Dans ce paragraphe, nous allons décrire comment transformer une image en couleurs en une image en niveaux de gris.

pixels

Pour cela, il est nécessaire d’agir sur tous les pixels, les uns après les autres : à l’aide de deux boucles for imbriquées, on devra donc parcourir l’image entière par lignes et par colonnes.

for y in range (hauteur) : for x in range (largeur) :

 

Pour chaque pixel, on calcule d’abord la valeur en niveau de gris en fonction de ses trois composantes par la formule suivante :

g=0,11×r+0,83×v+0,06×b

On remplace ensuite, pour ce pixel, la couleur (r, v, b) par la couleur (g, g, g).

Voici un algorithme permettant de transformer une image en couleurs en une image en niveaux de gris :

ALGORITHME

Im ← ? # On charge une image en lui donnant le nom "Im" par exemple
L, H ← Im.size # On récupère les dimensions de l'image chargée
NegIm ← ? # On crée une nouvelle image nommée "GrisIm" de dimensions LxH


Pour y allant de 0 à H-1 : # On parcourt les pixels de l'image "Im" en hauteur
              Pour x allant de 0 à L-1 : # On parcourt les pixels de l'image "Im" en largeur
                                r, v, b ← ? On récupère les composantes RVB du pixel de coordonnées (x ; y) de l'image "Im"
                                On affecte à g la partie entière de (0.11*r+0.83*v+0.06*b)
                                On affecte au pixel de l'image "GrisIm" de coordonnées (x ; y) les composantes (g, g, g)
               Fin Pour
Fin Pour


On sauvegarde la nouvelle image "GrisIm" dans le dossier qu'on veut en lui donnant un nom
On affiche la nouvelle image "GrisIm"

Le but est que vous mettiez en oeuvre l'algorithme précédent sur l'image suivante :

pixels

pour aboutir à celle-ci :

pixels

Pour cela, on vous propose plusieurs exercices de niveau différent selon vos connaissances dans le langage Python :

le niveau fondamental si vous ne connaisez pas ou très peu Python, ne vous inquiétez pas ! Vous serez guidé.e.s pas à pas ;

le niveau confirmé si vous connaisez un peu Python et êtes capable d'extraire de l'information dispersée ;

le niveau expert si vous avez déjà une bonne expérience en Python et savez en particulier :

ouvrir et fermer une image particulière connaissant son adresse et son nom,

utiliser la documentation d'une bibliothèque,

Remarque

Ce niveau dépasse largement le niveau attendu en fin de seconde et en SNT