TP Niveaux de gris

1. 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)).

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

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()
		
  1. Dans votre dossier "SNT" créer un sous dossier "Photos" puis dans votre dossier "Photos" un sous dossier "Partie1".
    Puis sous Spyder Python, créer un fichier nommé fond.py et l’enregistrer dans le dossier "Photos"

  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.

    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.

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

2. 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.

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

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\times r+0,83\times v+0,06\times b\]

  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 ?

3.Transformation d'une image RVB en niveaux de gris

3.1 Lecture et écriture d’un pixel en langage Python

Chaque pixel d’une image est repéré par ses coordonnées (x, y) et ses composantes (R,V,B).

Attention !
Les coordonnées des pixels d'une image sont liées à un repère particulier :

pixels

3.2 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\times r+0,83\times v+0,06\times 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 :

Cliquez sur le niveau d'exercice qui vous convient pour y accéder directement.

  1. Dans le dossier "Photos", créer un dossier et l'appeler "Partie3"

  2. Ouvrir l'image du perroquet en cliquant ici puis faire un clic droit et l'enregistrer dans le dossier "Partie3".

  3. Utilisation du langage Python :

    1. Télécharger le fichier acccessible ici où une partie du programme en langage Python est déjà écrite et l'enregistrer dans le dossier "Partie3" sous le nom gris.py

      Attention à bien enregistrer ce fichier dans le même répertoire que l'image du perroquet sinon le programme ne sera pas fonctionnel car la quatrième ligne du code devrait être modifiée.

    2. Pour chacune des questions suivantes, lire le commentaire précédent la ligne du code à modifier et cliquer sur le lien afin d'obtenir un exemple d'utilisation qu'il suffit d'adapter.

    3. Compléter la ligne 6 du programme en utilisant l'instruction size présentée ici afin de stocker dans les variables largeur et longueur les deux dimensions de l'image initiale du perroquet.

    4. Compléter la ligne 8 du programme en utilisant l'instruction new présentée ici afin de stocker dans la variable nommée imageBut une image nouvelle créée dont les dimensions sont celles de l'image initiale.

      Penser à utiliser des variables déjà créées dans ce programme.

    5. Compléter la ligne 13 du programme en utilisant l'instruction getpixel présentée ici afin de stocker dans les variables nommées r, v et b les composantes RVB du pixel de coordonnées (x,y) de l'image du perroquet initiale.

      Penser à utiliser la variable déjà créée dans ce programme qui stocke l'image initiale du perroquet.

    6. Compléter la ligne 15 du programme en utilisant la formule donnant le niveau de gris donnée ici afin de stocker dans la variable nommée g le niveau de gris calculé.

      l'instruction int permet de ne garder que la partie entière (c'est-à-dire celle devant la virgule) du résultat du calcul.

    7. Compléter la ligne 17 du programme en utilisant l'instruction putpixel présentée ici afin de mettre le pixel de coordonnées (x,y) de l'image nouvellement construite au niveau de gris calculé.

      Penser à utiliser une variable déjà créée dans ce programme.

  4. Vérifier que l'image obtenue est similaire celle attendue.

  1. Dans le dossier "Photos", créer un dossier et l'appeler "Partie3"

  2. Ouvrir l'image du perroquet en cliquant ici puis faire un clic droit et l'enregistrer dans le dossier "Partie3".

  3. Utilisation du langage Python :

    1. Télécharger le fichier acccessible ici où une partie du programme en langage Python est déjà écrite et l'enregistrer dans le dossier "Partie3" sous le nom gris.py

      Attention à bien enregistrer ce fichier dans le même répertoire que l'image du perroquet sinon le programme ne sera pas fonctionnel car la quatrième ligne du code devrait être modifiée.

    2. Pour chacune des questions suivantes, lire le commentaire précédent la ligne du code à modifier et cliquer sur le lien afin d'obtenir un exemple d'utilisation qu'il suffit d'adapter.

      Penser à utiliser les différentes instructions présentées avec un exemple ici.

    3. Compléter la ligne 6 du programme en utilisant l'instruction size afin de stocker dans les variables imposées largeur et longueur les deux dimensions de l'image initiale du perroquet.

    4. Compléter la ligne 8 du programme en utilisant l'instruction new afin de stocker dans la variable nommée imageBut une image nouvelle créée dont les dimensions sont celles de l'image initiale.

    5. Compléter la ligne 13 du programme en utilisant l'instruction getpixel afin de stocker dans les variables nommées r, v et b les composantes RVB du pixel de coordonnées (x,y) de l'image du perroquet initiale.

    6. Compléter la ligne 15 du programme en utilisant la formule donnant le niveau de gris afin de stocker dans la variable nommée g le niveau de gris calculé.

      l'instruction int permet de ne garder que la partie entière (c'est-à-dire celle devant la virgule) du résultat d'un calcul.

      int(1.2+3.4)

      renvoie 4 qui est la partie entière de 4.6, résultat de l'addition 1.2+3.4.

    7. Compléter la ligne 17 du programme en utilisant l'instruction putpixel afin de mettre le pixel de coordonnées (x,y) de l'image nouvellement construite au niveau de gris calculé.

      Penser à utiliser la variable déjà créée dans ce programme stockant la nouvelle image.

  4. Vérifier que l'image obtenue est similaire celle attendue.

  1. Dans le dossier "Photos", créer un dossier et l'appeler "Partie3"

  2. Ouvrir cette image en cliquant ici puis faire un clic droit et enregistrer la dans le dossier "SNT/Photos/Partie3".

  3. Traduire l'algorithme de niveau de gris en langage Python pour pouvoir charger une image en couleur et l'afficher en niveaux gris.

    Pour maîtriser les fonctions du module Image de la bibliothèque PIL, vous pouvez utiliser la documentation accessible ici

  4. Vérifier que l'image obtenue est similaire celle attendue.

Si vous êtes perdu, voici une aide en vidéo :

  1. Dans le dossier "Photos", créer un dossier et l'appeler "Partie4"

  2. Créer un nouveau module dans Spyder Python et l'enregistrer dans votre dossier "Partie4"

  3. Réaliser le programme qui dessine le drapeau français en 600x300.
    (Vous rechercherez préalablement le code couleur du bleu France et du rouge France)
    en utilisant l'instruction getpixel présentées avec un exemple ici