Partie 5 : Abordons maintenant les images en couleurs#
Description du format PPM#
La page http://fr.wikipedia.org/wiki/Portable_pixmap détaille le format général d’un fichier PPM non compressé. L’entête est de la forme:
P3
nbColonnes nbLignes
255
suivi d’un certain nombre 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!) ayant le format suivant:
rouge vert bleu rouge vert bleu ...
Ce format est très similaire au format PGM; les commentaires faits précédemment s’appliquent toujours.
La structure Couleur
et le type Image
#
Tout comme pour les images en noir et blanc et pour les images en niveau de gris, les images en couleur seront stockées dans un double tableau.
Tout d’abord, on définit la structure suivante :
/** Structure de donnees pour representer un pixel en couleur **/
struct Couleur {
/** Intensite de rouge **/
double r;
/** Intensite de vert **/
double g;
/** Intensite de bleu **/
double b;
};
Une fois la structure ainsi définie, les lignes suivantes
permettront par exemple de définir une variable de type
Couleur
et de l’initialiser à un bleu cyan:
Couleur cyan;
cyan.r = 0;
cyan.g = 255;
cyan.b = 255;
Chaque pixel sera représenté par une variable de type Couleur
.
Une Image
est donc un double tableau de Couleur
:
/** Structure de donnees pour representer une image **/
typedef vector<vector<Couleur> > Image;
Pour obtenir le niveau de bleu du pixel le plus en haut à gauche
d’une image convenablement lue et stockée dans une variable
Image1
de type Image
,
il suffira donc de taper Image1[0][0].b
.
Exercice 5.1 (**) Lecture et écriture d’image PPM
Compléter le fichier image.hpp avec les types Couleur
et Image
donnés ci-dessus.
Implémentez les fonctions lirePPM
et ecrirePPM
dans ppm.cpp.
La documentation est disponible dans le fichier ppm.hpp
Consulter le programme ppm-test.cpp, puis lancez-le pour vérifier vos fonctions. Pour la compilation, procéder comme dans la Partie 5
Exercice 5.2 (**) De la couleur au niveau de gris
La méthode qui semble faire consensus pour transformer une image couleur en image en niveaux de gris consiste à remplacer la couleur de chaque pixel, codée généralement par 3 couleurs \(r,g,b\), par le niveau de gris $\(0.2126 * r + 0.7152 * g + 0.0722 * b.\)$
Il s’agit donc d’une
simple moyenne pondérée des trois couleurs pour obtenir un niveau de
gris. Dans l’autre sens, étant donné un niveau de gris
c
, on l’associe souvent à la couleur (c,c,c)
c’est à dire r==c,g==c,b==c
.
Compléter gris-couleurs.cpp avec les fonctions CouleurAuGris
et GrisACouleur
dont la documentation est donnée dans gris-couleurs.hpp
Lancer les tests comme précédemment.
Aller plus loin#
Dans le préambule, regardez comment vous pouvez créer de nouvelles images PGM et PPM
Convertir des images jpg de votre choix et tester vos fonctions
Attention nos programmes sont assez gourmands en mémoire car les images sont non compressées. Pensez à réduire la taille de vos jpeg pour obtenir des images en 512x512.