Partie 1 : Commençons avec les images noir et blanc#

Le format PBM non compressé#

Dans la première partie de ce projet, on se contentera de lire et d’écrire des images en noir et blanc au format PBM non compressé.

Description du format PBM#

La page http://fr.wikipedia.org/wiki/Portable_pixmap détaille le format général d’un fichier PBM. L’entête est de la forme:

P1
nbColonne nbLigne

(par exemple 512 512) suivi d’une liste de 0 ou de 1, séparés par des espaces ou des sauts de lignes, décrivant les pixels de haut en bas et de gauche à droite

(Attention: les lignes de l’image ne sont pas forcément les mêmes que celles du fichier!).

Prenez le temps d’ouvrir (comme fichier texte et comme image) les fichiers PBM qui sont fournis dans le projet (cf Visualisation des images PBM PGM et PPM )

En principe, les spécifications du format de fichier PBM indiquent de plus qu’aucune ligne du fichier ne doit dépasser 70 caractères; cependant la plupart des logiciels s’en sortent même si cette contrainte n’est pas respectée. Les spécifications indiquent aussi qu’un fichier PBM peut contenir des commentaires, sous la forme de ligne commençant par un “#”.

Premiers programmes#

Exercice 1.1 (*) : Affichage d’une image PBM

Le premier exercice de ce projet consiste à afficher une image PBM dans le terminal: les pixels blancs seront des espaces et les pixels noirs des symboles « @ ».

Par exemple:

0 1 1 0                            @ @
1 0 0 1    s'affichera          @       @
1 0 0 1                         @       @
0 1 1 0                            @ @

Dans le fichier pbm-affiche.cpp, implantez la fonction affichePBM dont la documentation vous est fournie. Puis compilez et vérifiez que votre programme affiche correctement l’image smiley.

Exercice 1.2 (*) : Inverser le blanc et le noir

Complétez la fonction inversePBM du fichier pbm-affiche.cpp. Cette fois, il ne faut pas afficher mais créer un nouveau fichier PBM (avec le bon format !) pour fabriquer une nouvelle image en inversant le noir et le blanc.

Compilez et vérifiez que l’exécution donne le résultat attendu.

Comment visualiser l’image crée ? Voir les explications dans le préambule

Lecture et Ecriture avec un tableau#

Dans ce projet, on va effectuer de nombreux traitements d’images. Parfois, il sera utile de charger l’image dans un tableau pour effectuer ces traitements. En particulier, cela permet de séparer et d’implanter une fois pour toutes tout ce qui concerne la lecture et l’écriture des fichiers.

Pour cela, on définit le type suivant :

typedef vector<vector<int> > ImageNB;

Une image numérique en noir et blanc est donc représentée par un double tableau contenant des entiers (0 ou 1). Par convention, le pixel (0,0) (auquel on accède dans l’image img par img[0][0]) est le coin en haut à gauche de l’image. Le premier indice désigne les lignes et le deuxième les colonnes. Par exemple, le pixel (2,10) correspondant à img[2][10] est le pixel de la troisième ligne et de la onzième colonne (si l’image est suffisamment grande pour contenir ce pixel bien entendu).

Exercice 1.3 (*) Lecture d’une image PBM

Implantez la fonction lirePBM du fichier pbm-tout-en-un.cpp

Indication: utilisez les instructions suivantes pour ouvrir un fichier et émettre un message d’erreur si celui-ci n’existe pas:

ifstream PBM;
PBM.open(source);
if (not PBM)
    throw runtime_error("Fichier non trouve: "+source);

Optionnel: gérer les fichiers contenant des commentaires; si vous ne le faites pas, il vous faudra vérifier que les fichiers PBM que vous utilisez sont effectivement sans commentaires et les supprimer le cas échéant.

Exercice 1.4 (*) : Écriture d’une image PBM

Implantez la fonction ecrirePBM du fichier pbm-tout-en-un.cpp

Indications:

  • Pour l’écriture, il est acceptable de ne mettre qu’un pixel par ligne (c’est moins lisible pour l’humain mais plus facile à programmer et équivalent pour l’ordinateur).

Tests de lecture et d’écriture#

Des tests sont fournis dans le fichier pbm-tout-en-un.cpp. Par défaut, le programme lance ces tests. Compilez et exécutez le programme pbm-tout-en-un.cpp et vérifiez que vos codes sont corrects.

Affichage et Inversion#

Exercice 1.5 (*) :

Complétez à présent le fichier pbm-tout-en-un.cpp avec de nouvelles versions de vos fonctions affichePBM et inversePBM en utilisant le type imageNB.

Modifiez la fonction main pour qu’elle affiche et inverse l’image du smiley en utilisant ces nouvelles fonctions.

Compléter le rapport#

Ouvrez le fichier rapport.md et complétez ce qui correspond à la Partie 1. En particulier, vérifier que l’exécution et les tests proposés fonctionnent.

Bravo ! Avec ces premiers exercices, vous avez compris la base de la lecture / écriture d’images au format text Vous pouvez passer à la Partie 2