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;