TD de Programmation Orientée Objets TD 8 : Arbres `a huit fils (octree)

TD de Programmation Orient´ee Objets
TD 8 : Arbres `a huit fils (octree)
M. Bosc, J-M. Dischler et J. Lamy
Le but de ce TD est de quantifier les couleurs d’une image RVB, charg´ee au format PPM. Quantifier
signifie r´eduire le nombre de couleurs de l’image. On suppose que l’on veut cr´eer des images ayant au
maximum Ncouleurs.
1 Principes de l’algorithme
L’algorithme est tr`es simple : on parcourt chaque pixel de l’image. A chaque pixel est associ´ee une
couleur au format RVB. L’espace RVB peut ˆetre consid´er´e comme un espace `a 3 dimensions formant un
cube de valeurs. Un octree est une structure de donn´ees adapt´e `a ce type de repr´esentation : un cube
de cot´e un, peut ˆetre divis´e en 8 cubes de cot´e 0.5, qui eux mˆemes peuvent ˆetre divis´es en 8 cubes, etc.
Chaque couleur RVB peut ˆetre plac´ee et stock´ee dans un octree, de profondeur 8 (puisque les couleurs
sont cod´ees avec des entiers allant de 0 `a 255). Une fois la couleur du pixel plac´ee dans l’octree, on v´erifie
si le nombre de feuilles est sup´erieur `a N. Si c’est le cas il faut r´eduire l’octree en remontant d’un cran
les feuilles les plus basses.
A la fin de l’algorithme on est sˆur d’obtenir un arbre ayant un nombre de feuilles inf´erieur ou ´egal `a N.
Ces feuilles correspondent aux couleurs de l’image finale. Il suffit de reparcourir l’image et d’associer `a
chaque pixel, la couleur de l’arbre la plus proche. Les classes `a d´efinir sont les suivantes :
1. ColRGBA, comme d´efini pr´ec´edemment avec quelques op´erations en plus, dont par exemple la
recherche d’une plus proche couleur dans un tableau.
2. PictRGBA, avec un convertisseur en PictQ
3. octree
4. PictQ, qui correspond `a une image quantifi´ee.
2 Exemple de fichier main
#include "image1.h"
#include "PictQ.h"
#include "iostream.h"
const int MAX_LEN=256;
int main()
{
PictRGBA pi, pi2;
char fname[MAX_LEN];
FILE *fd;
double d;
// lire un fichier ppm
cout<<"nom du fichier image ppm: ";
cin>>fname;
fd = fopen(fname, "rb");
if (fd==NULL) { perror("error loading file"); exit(1); }
pi.LoadPPM(fd);
fclose(fd);
// convertir en double, cad calculer le gris moyen
d = pi;
cout<<"moyenne:"<<d<<endl;
// quantifier en 8 couleurs
PictQ piq(pi,8);
cout<<"quantification achevee..."<<endl;
// reconvertir l’image quantifiee en image RGB pour sauvegarder
pi2 = piq;
// sauvegarder cette image
cout<<"nom du fichier image quantifiee ppm: ";
cin>>fname;
fd = fopen(fname, "wb");
if (fd==NULL) { perror("error saving file"); exit(1); }
pi2.SavePPM(fd);
fclose(fd);
return 0;
}
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !