// enjoliveur de code // fin enjoliveur

Le format d'image pgm

Introduction

Qu'est-ce qu'une image numérique ?

Une image numérique est un ensemble d'informations stockées dans un fichier informatique, décrivant une image réelle appartenant à notre monde dit analogique.

Pour "coder" cette réalité, une image numérique est en fait constituée d'un ensemble de points élémentaires, appelés pixels; la vision de ces pixels de plus ou moins loin permet à l’œil de reconstituer globalement l'image réelle.

Image pixelisée
Image pixelisée
Image non pixelisée

On comprend que ce principe est à l'origine des limitations liées aux images numériques :

Un compromis est donc généralement à faire entre la finesse de l'image et la taille du fichier résultant; ce compromis dépend de la destination de l'image : affichage en petite ou grande taille, affichage ou impression,envoi ou pas sur un réseau,...


Quelques définitions :

Les deux valeurs de définition et de résolution permettent de faire le "lien" entre l'image numérique et les dimensions de son équivalent "réel" lorsqu'on cherchera à afficher ou imprimer cette image.

Par exemple : une image est formée de 1024 x 768 pixels, et sa résolution est 300 ppp; Lorsqu’on l'imprimera, sa taille sera alors :

De manière générale, on peut retenir que : dimension = définition / résolution

Modifier la définition ou la résolution d'une image permet donc de la redimensionner, la déformer, de diminuer sa taille d'impression ou d'affichage à l'écran, etc...

Quelques exercices pour s'approprier ces notions...

1. Compléter le tableau suivant :

Nombre de pixels horizontaux Nombre de pixels verticaux Nombre de pixels composant l'image
640 480 ? 307 200
1024 ? 768 786 432
? 1900 1440 2 736 000

2. Compléter le tableau suivant

Nombre de pixels horizontaux Résolution (ppp) Largeur réelle de l'image (cm)
640 300 ? 5,4
1024 ? 244 10,6
? 443 75 15

Et la couleur dans tout ça ???

En plus de sa définition, une image numérique utilise plus ou moins de mémoire selon le codage des informations de couleur qu'elle possède. C'est ce que l'on nomme le codage de couleurs ou profondeur des couleurs.

Plusieurs façons de coder les couleurs existent :

    Image en noir et blanc
    Image en noir et blanc
    Image en niveaux de gris
    Image en niveaux de gris
  1. Noir et blanc: Avec ce mode, il est possible d'afficher uniquement des images en deux couleurs: noir et blanc
  2. Niveaux de gris: il permet d'obtenir différentes valeurs de gris, afin d'afficher des images nuancées.
    Le nombre de niveaux de gris utilisables est donné par le codage de chaque pixel, exprimée en bits :
    • 8 bits -> 256 niveaux de gris
    • 16 bits -> 65 536 niveaux de gris
    • ...

  3. Synthèse additive des couleurs
    Synthèse additive des couleurs
  4. Mode colorimétrique RVB : pour les images en couleur, on se base sur le principe de la synthèse additive des couleurs, selon lequel toute nuance de couleur peut être reproduite par le "mélange" d'une quantité variable de trois couleurs primaires, le Rouge, le Vert et le Bleu; le blanc correspond au mélange de la même "quantité" de chacune de ces 3 couleurs, le noir à l'absence de ces trois couleurs.
    L'information sur chaque couleur primaire est stockée séparément, et la couleur d'un pixel est donc donnée par un ensemble de trois chiffres indiquant la "quantité" de chaque couleur primaire dans la teinte globale du pixel.
    Cette "quantité" est codée par un nombre d'autant plus grand que la couleur primaire est présente dans la teinte finale du pixel; en mode 8 bits, ce nombre peut varier de 0 à 255, en mode 16 bits, de 0 à 65 535 : le nombre de nuances possibles est donc alors plus élevé...

Pour coder un pixel rouge en mode 8 bits, les trois valeurs seront ainsi : (255,0,0); pour un bleu : (0,0,255); un jaune ( mélange de rouge et de vert ) : (255,255,0),etc...


Quelques applications...

1. Compléter le tableau ci-dessous :

Couleur du pixel R V B
Noir ? 0 ? 0 ? 0
Blanc ? 255 ? 255 ? 255
Vert ? 0 ? 255 ? 0
Magenta ? 255 ? 0 ? 255
Cyan ? 0 ? 255 ? 255

La spécification du format pgm

Nous allons aujourd'hui, après avoir vu ce qu'était une image numérique, nous intéresser à ce qu'il y a "à l’intérieur" d'un fichier image, aux caractères que l'on découvrira si l'on ouvre un fichier image non pas avec un logiciel de visualisation ou de traitement d'images (comme Gimp par exemple), mais avec un éditeur de texte. Nous allons donc retrouver les chiffres qui codent les couelrus de l'image et non l'image elle-même.
icone format pgm
icone notepad ++
Chaque format de fichier (jpg, bmp, mais aussi odt, docx etc...) est défini par une spécification qui indique à tous les programmeurs et tous les utilisateurs comment générer et utiliser ce format. Ces règles permettent à tous de parler le même langage.
Pour découvrir cette spécification nous allons tout d'abord créer une image de 80 pixels par 80 pixels au format pgm ASCII dans le répertoire /Images sur votre clef
Pour cela vous devez d'abord créer ce répertoire Images.
Alt+Tab Une fois le répertoire créé nous allons maintenant créer une image simple dans le logiciel Gimp.
Sur le réseau, le logiciel se lance à partir du menu : Démarrer > Tous les programmes > Utilitaires > GIMP 2.
Pour passer d'un logiciel à l'autre vous pouvez bien sûr utiliser la souris, mais vous gagnerez beaucoup de temps avec les raccourcis claviers ! les touches Alt+Tab permettent de passer d'un logiciel à l'autre rapidement.

Une fois dans le logiciel Gimp : Format pgm ASCII Maintenant que cette image est créée nous allons étudier ce que contient le fichier .pgm


En conclusion, dans l'entête du fichier on retrouve donc :

entête du fichier .pgm

Dans le "corps" du fichier on trouve donc...

corps du fichier .pgm

Expérimenter le format pgm

 notepad++
Nous allons maintenant modifier le fichier image, non pas avec un logiciel de traitement comme Gimp, mais "à la main" pour comprendre son organisation.
Nous travaillerons donc sous Notepad ++.

Créer des images

Modifier des images

Nous allons maintenant modifier les caractères sous Notepad++ puis visualiser les conséquences de nos modifications sous Gimp.

Les colonnes de Buren dans la cours du palais royal à Paris
Toile de Michel Parmentier, proche de Buren à la fin des années 1960
Vous avez normalement compris l'organisation des pixels dans un fichier pgm : le premier pixel est en haut à gauche, le dernier en bas à droite, les pixels sont organisés en ligne
Il est maintenant facile pour vous de :

Créer des fichiers .pgm sous python

Maintenant je pense que vous avez compris la démarche, nous allons donc maintenant tenter d'automatiser la création d'image au format pgm grâce à un programme en python.
Nous allons donc dans un premier temps prendre en main l'interface de python avant de se lancer dans la programmation...

Outil utilisé pour la programmation Python

De nombreux logiciels existent pour le développement Python.

Prise en main de python

Sur le réseau du lycée, on le lance à partir du Menu > Démarrer > Tous les programmes > Mathématiques

Par défaut, il se lance en mode interpréteur ( "Python shell" ) :

Interpréteur Python

Vous pouvez déjà commencer à utiliser l’interpréteur en vous en servant, par exemple, comme d'une calculatrice.
Tapez quelques opérations, et Python en affiche immédiatement le résultat.

>>> 7+3
10
>>> 10*33
330
>>> 7/3
2.3333333333333335
				

Un premier programme...

Mais il est plus intéressant d'écrire un premier "script".
Pour écrire et éditer un script, faire : File > New Window; l'éditeur s'ouvre alors :

Editeur Python

Entrer les lignes de code suivantes dans l'éditeur (ou faire un Copier/Coller : Ctrl+c Ctrl+v c'est encore plus rapide...).
Bien respecter le retrait, appelé indentation au début de la dernière ligne !

print('P2')
print('# generation automatique de fichier pgm')
print('10 10')
print('255')
for i in range (0,100):
    print('0')

				

Modification du programme


Si vous avez bien compris tous les concepts précédents, il va être facile de modifier le programme en python pour générer une image unie grise. Testez votre programme et comme précédemment en copiant les lignes du shell dans Geany et en nommant judicieusement le fichier.

Plus difficile, je vous propose de générer une image de dimensions 15x15 remplie de pixels dont le niveau de gris est aléatoire.
La fonction "nombre entier aléatoire" n'est pas intégrée directement dans python, il est nécessaire, pour l'utiliser, d'importer le module random. Pour cela la première ligne de votre programme doit être :
from random import randint
				
Pour tester la fonction randint(,) tapez dans la fenêtre de shell :
>>> from random import randint
>>> randint(0,255)
				
et observez le résultat. retapez plusieurs fois :
>>> randint(0,255)
				

Génération automtique de fichiers images sous python

Je vous propose maintenant de modifier le programme précédent pour éviter les copier/coller fastidieux de la fenêtre de shell python vers Notepadd++.
En effet python peut créer lui même des fichiers. Pour cela il suffit de remplacer dans le programme précédent l'inscruction d'affichage à l'écran
print('P2')
			
Par une instruction d'écriture dans un fichier.
FichierImage.write('P2\n')
			
Dans cette ligne \n signifie qu'il faut aller à la ligne après avoir écrit P2 dans le fichier.
Cependant ce n'est pas tout à fait si simple, car il faut préciser au programme dans quel fichier vous allez écrire, ouvrir ce fichier, puis le fermer à la fin de l'écriture.
Au final pour écrire uniquement P2 dans un fichier nommé toto.pgm trois lignes sont nécessaires :
FichierImage = open('toto.pgm','w')
FichierImage.write('P2\n')
FichierImage.close()
			
Mais si vous avez d'autres lignes à écrire, il suffit de placer l'instrcution correspondante entre l'ouverture et la fermeture du fichier. Le fichier sera créé dans le répertoire où se trouve le fichier python .py contenant le programme.