Aller au contenu principal

TP1 - Coder une image avec un éditeur de texte

Objectifs
  • Comprendre qu'une image numérique est une grille de valeurs numériques
  • Créer des fichiers image noir et blanc (PBM), en niveaux de gris (PGM) et en couleur (PPM) à partir d'un simple éditeur de texte

Dans ce TP, nous allons créer de véritables images numériques sans aucun logiciel de dessin, uniquement à l'aide d'un éditeur de texte (Notepad sur Windows). Chaque image sera un fichier texte contenant des valeurs numériques - la démonstration concrète que toute image numérique n'est, au fond, qu'une longue suite de nombres.

Matériel nécessaire
  • Un éditeur de texte : Notepad (Windows)
  • Un visionneur d'images PBM : GIMP (gratuit) ou le site Netpbm viewer directement dans le navigateur
  • Du papier et des crayons de couleur pour la partie sur papier

Coder des images sur papier

Avant de manipuler des fichiers sur ordinateur, nous allons expérimenter ce que fait un ordinateur quand il lit une image : interpréter des suites de 0 et de 1 comme des pixels colorés.

Lire une grille binaire

Chaque case de la grille correspond à un pixel. La règle est simple :

  • 0 : case blanche (ne pas colorier)
  • 1 : case noire (colorier en noir)

Grille en noir et blanc

On dispose de l'image suivante, où chaque case contenant un 0 ou un 1 correspond à un pixel noir ou blanc :

C1C2C3C4C5C6C7C8
L100111100
L201000010
L310000001
L410100101
L510000001
L610011001
L701000010
L800111100
✏️Exercices
  1. 1
    Reproduire sur feuille une grille vide contenant autant de case que l'image (pas besoin de faire une grille énorme).
  2. 2
    Colorier les cases contenant un 1. Quel motif reconnaissez-vous ?
  3. 3
    Quelle est la taille de cette image en pixels (largeur × hauteur) ?
  4. 4
    Combien de pixels noirs contient-elle au total ?

Grille en nuance de gris

Pour cette deuxième grille, chaque case contient une valeur entre 0 et 255. On dispose de l'échelle de couleur suivante :

ValeurNuance à utiliser
0Noir (appuyer fort)
64Gris très foncé
128Gris moyen
192Gris clair
255Blanc (ne pas colorier)

Ainsi que de cette grille :

C1C2C3C4C5C6
L12550000255
L225501921920255
L325501921920255
L42550000255
L5255128255255128255
L6255255128128255255
✏️Exercices
  1. 1
    Reproduire sur feuille une grille vide contenant autant de case que l'image (pas besoin de faire une grille énorme).
  2. 2
    Colorier chaque case selon l'échelle ci-dessus. Quel motif apparaît ?
  3. 3
    Quelle valeur correspond au noir ? Au blanc ? Pourquoi ne pourrait-on pas dépasser 255 ?

Grille de couleur

Les grilles établies au dessus ne permettent pas de mettre des couleurs sur nos images.

✏️Exercices
  1. 1
    Reproduire la grille ci-dessous :
    C1C2C3C4C5C6C7C8
    L1
    L2
    L3
    L4
    L5
    L6
    L7
    L8
  2. 2
    Imaginer une codification permettant de représenter des couleurs, en s'inspirant de ce qui s'est fait précédemment.
  3. 3
    Représenter un motif de votre choix (initiale, cœur, flèche, étoile…) en inscrivant les valeurs dans la grille, et la donner au voisin pour qu'il la recopie et colorie, à l'aide de la grille des couleurs de la question précédente.

Coder des images numériques

Image en noir et blanc - Format PBM

Un fichier PBM est un fichier texte respectant la structure suivante :

P1
largeur hauteur
0 1 0 1 ... (une ligne par ligne de pixels)

Où :

  • P1 représente l'identifiant du format (Portable BitMap, noir et blanc) ;
  • largeur hauteur les dimensions de l'image en nombre de pixels ;
  • 0 un pixel blanc et 1 pixel noir.

✏️Exercices

Voici le contenu d'un fichier PBM :

P1
8 8
0 0 1 1 1 1 0 0
0 1 0 0 0 0 1 0
1 0 0 1 1 0 0 1
1 1 1 0 0 1 1 1
1 1 1 0 0 1 1 1
1 0 0 1 1 0 0 1
0 1 0 0 0 0 1 0
0 0 1 1 1 1 0 0
  1. 1
    Quelle est la taille de cette image (en pixels) ?
  2. 2
    Combien de pixels noirs contient-elle au total ?
  3. 3
    Recopier cette grille sur papier et colorier les cases à 1. Quel motif peut-on reconnaître ?
  4. 4
    Télécharger l'image suivante et l'ouvrir soit sur Gimp soit sur un navigateur (Netpbm viewer ; attention l'image est très petite). Le résultat est-il le même ?
  5. 5
    Sur papier, dessiner une grille de 15 colonnes × 10 lignes. Colorier les cases qui formeront l'initiale de votre prénom.
  6. 6
    Traduir le dessin en 0 et 1.
  7. 7
    Ouvrir l'éditeur de texte et créer le fichier initiales.pbm en respectant scrupuleusement la structure ci-dessous, puis l'enregistrer avec l'extension .pbm (dans Notepad, choisir « Tous les fichiers » pour éviter l'ajout automatique de .txt) :
    P1
    15 10
    (vos 10 lignes de 15 valeurs séparées par des espaces)
    ⚠️ Chaque ligne doit contenir exactement 15 valeurs et il doit y avoir exactement 10 lignes de valeurs.
  8. 8
    Ouvrir le fichier avec GIMP ou le visionneur en ligne et vérifier que l'image correspond bien à initiale.

Voici trois fichiers PBM. Chacun encode une lettre.

Lettre 1 (7×9) :

P1
7 9
0 1 1 1 1 1 0
1 0 0 0 0 0 1
1 0 0 0 0 0 0
1 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 0 0 0 1
0 0 0 0 0 0 1
1 0 0 0 0 0 1
0 1 1 1 1 1 0

Lettre 2 (7×9) :

P1
7 9
1 0 0 0 0 0 1
1 1 0 0 0 0 1
1 0 1 0 0 0 1
1 0 0 1 0 0 1
1 0 0 0 1 0 1
1 0 0 0 0 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1

Lettre 3 (7×9) :

P1
7 9
1 1 1 1 1 1 1
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
  1. 9
    Recopier chaque grille sur un fichier au format pbm, et les ouvrir (gimp ou navigateur).
  2. 10
    Quelles sont les lettres formées ?

Image en nuance de gris - Format PGM

Un fichier PGM est un fichier texte respectant la structure suivante :

P2
largeur hauteur
valeur_max
valeurs des pixels (0 = noir, valeur_max = blanc)

Où :

  • P2 représente l'identifiant du format (Portable GrayMap) ;
  • largeur hauteur les dimensions de l'image en nombre de pixels ;
  • valeur_max la valeur maximale utilisée (255 par convention pour avoir des nuances de gris distinctes) ;

✏️Exercices

On dispose du tableau de valeur ci-dessous :

Valeur décimaleValeur binaire (8 bits)Nuance attendue
000000000Noir pur
64___________Gris très foncé
128___________Gris moyen
192___________Gris clair
25511111111Blanc pur
  1. 1
    Compléter la colonne Valeur binaire en utilisant la méthode des divisions successives par 2 étudiée en cours.
  2. 2
    Combien de nuances de gris distinctes peut-on représenter avec un octet (8 bits) ? Justifier.

Voici la structure attendue pour un dégradé horizontal du noir vers le blanc sur 8 × 4 pixels :

P2
8 4
255
0 36 72 109 145 181 218 255
0 36 72 109 145 181 218 255
0 36 72 109 145 181 218 255
0 36 72 109 145 181 218 255
  1. 3
    Créer le fichier degrade.pgm en recopiant la structure ci-dessus, puis l'ouvrir dans le visionneur.
  2. 4
    Combien d'octets de données (hors en-tête) contient ce fichier ?
  3. 5
    Quelle est la différence entre chaque valeur successive dans une ligne ? Ce pas est-il régulier ?
  4. 6
    Modifier le fichier pour créer un dégradé vertical (noir en haut, blanc en bas) : les quatre lignes doivent avoir des valeurs uniformes mais distinctes d'une ligne à l'autre.

Voici une grille de départ pour un visage simplifié en 10 × 10 pixels (0 = contour noir, 200 = peau gris clair, 50 = yeux et bouche gris foncé) :

P2
10 10
255
0 0 0 0 0 0 0 0 0 0
0 200 200 200 200 200 200 200 200 0
0 200 50 200 200 200 200 50 200 0
0 200 200 200 200 200 200 200 200 0
0 200 200 200 200 200 200 200 200 0
0 200 50 200 200 200 200 50 200 0
0 200 200 50 50 50 50 200 200 0
0 200 200 200 200 200 200 200 200 0
0 200 200 200 200 200 200 200 200 0
0 0 0 0 0 0 0 0 0 0
  1. 7
    Créer le fichier visage.pgm à partir de la grille ci-dessus et l'ouvrir dans le visionneur.
  2. 8
    Améliorer le visage en ajoutant des sourcils et un nez. Modifier l'expression (sourire, regard neutre…). Décrire brièvement les modifications apportées.

Image en couleur - Format PPM

Un fichier PPM est un fichier texte respectant la structure suivante :

P3
largeur hauteur
255
R V B R V B R V B ...

Où :

  • P3 représente l'identifiant du format (Portable PixMap) ;
  • largeur hauteur les dimensions de l'image en nombre de pixels ;
  • 255 la valeur maximale donnée aux composantes de rouge vert et bleu ;
  • R V B les valeurs à donner, pour un pixel, aux composantes Rouge (R), Vert (V) et Bleu (B), comprises entre 0 et 255.

✏️Exercices

On dispose de la palette de couleur ci-dessous, où chaque couleur (que l'on utilise) est un mélange de rouge, vert et bleu. Quand une valeur est à 255, cela signifie quelle est au maximum, 0 signifie qu'elle est au minimum.
Pour du rouge pur, on met le maximum de la composante de rouge, rien en vert, et rien en bleu.

Couleur souhaitéeRVB
Rouge pur25500
Vert pur_________
Bleu pur_________
Jaune2552550
Cyan0255___
Magenta___0___
Blanc_________
Noir000
Gris 50 %_________
Orange2551280
  1. 1
    Compléter le tableau ci-dessus.
  2. 2
    Quelle règle générale peut-on formuler pour obtenir du gris (quelle que soit la nuance) à partir des valeurs R, V, B ?

Les couleurs officielles du drapeau français sont :

  • Bleu : R=0, V=35, B=149
  • Blanc : R=255, V=255, B=255
  • Rouge : R=237, V=41, B=57
  1. 3
    Créez un fichier drapeau.ppm représentant le drapeau français sur une grille de 9 × 6 pixels (3 colonnes de 3 pixels de large, 6 lignes de hauteur). Chaque ligne du fichier correspond à une ligne de pixels, soit 9 triplets RVB.
  2. 4
    Combien de triplets RVB contient ce fichier au total (hors en-tête) ?
  3. 5
    Une fois le drapeau français réalisé, créer le drapeau d'un autre pays de votre choix. Indiquer le pays choisi et les valeurs RVB utilisées.
  4. 6
    Transcrire le motif dessiné lors de la dernière question de la partie 1 ligne par ligne dans un fichier motif.ppm en utilisant les triplets RVB. Le fichier doit être valide et s'ouvrir correctement dans le visionneur.

Pour aller plus loin

Les formats JPEG et PNG utilisés quotidiennement contiennent exactement les mêmes triplets RVB - mais compressés afin de réduire la taille des fichiers. Le principe de base reste identique à ce qui a été réalisé dans ce TP.

Un fichier PPM de 1920 × 1080 pixels pèserait environ 6 Mo sans compression. Le même fichier en JPEG pèse généralement moins de 500 Ko !