L’objectif principal du projet ImageCompressor est d’appliquer l’algorithme de K-means pour compresser une image en réduisant son nombre de couleurs, tout en conservant un rendu visuel proche de l’original. Ce projet met en pratique des notions avancées de programmation fonctionnelle en Haskell. À partir d’un fichier contenant les coordonnées et couleurs des pixels, le programme regroupe les couleurs similaires en un nombre limité de clusters, et remplace chaque pixel par la couleur moyenne de son groupe. Cela permet d’illustrer concrètement des techniques de traitement d’image tout en renforçant la maîtrise du paradigme fonctionnel.
L'ImageCompressor regroupe les pixels d’une image selon leur couleur, puis les remplace par la couleur moyenne de chaque groupe. Ce processus permet de compresser l’image en limitant le nombre total de couleurs à un nombre défini (-n).
L'entrée est un fichier texte contenant la position (x,y) et la couleur (r,g,b) de chaque pixel. L'algorithme itère jusqu'à ce que les couleurs des clusters convergent, selon une tolérance donnée (-l).
Le projet se compile simplement avec :
make./imageCompressor -n <nombre_de_clusters> -l <limite_convergence> -f <fichier_d’entrée>| Option | Description |
|---|---|
-n |
Nombre de clusters (ou de couleurs finales) |
-l |
Seuil de convergence (valeur flottante) |
-f |
Chemin vers le fichier contenant les pixels |
Chaque ligne du fichier contient les coordonnées d’un pixel et sa couleur RGB :
(x,y) (r,g,b)
Exemple :
(0,0) (255,255,255)
(0,1) (200,200,200)
(1,0) (10,10,10)
...
./imageCompressor -n 3 -l 0.3 -f img1.txt
Figure 2 – Résultat après compression avec K=3
./imageCompressor -n 10 -l 0.1 -f img2.txt
Figure 3 – Résultat après compression avec K=10
Ce qui produira une sortie de pixels compressés, chaque pixel étant remplacé par la couleur de son cluster.
- Initialisation aléatoire de
ncentres. - Attribution de chaque pixel au cluster le plus proche.
- Recalcul du centroïde de chaque cluster.
- Répétition jusqu’à ce que les mouvements des centroïdes soient inférieurs à
-l.
(0,0) (128,128,128)
(0,1) (128,128,128)
(1,0) (10,10,10)
...
Chaque couleur a été remplacée par celle de son groupe.
