Compresseur/décompresseur d'images en Haskell, implémentant un algorithme de compression avec perte de type quadtree.
Telecharger & tester
make && ./compressor -c|-d -i fichier_entree -o fichier_sortie (compression/decompression de fichiers)
Image Compressor est un projet Epitech (Tek4, module B-FUN-400) qui consiste a ecrire en Haskell un programme de compression d'image par reduction du nombre de couleurs, en implementant l'algorithme des k-means. Le projet se concentre uniquement sur l'etape de clustering : la lecture et l'ecriture reelles de fichiers image (JuicyPixels) sont reportees en bonus. Le programme lit sur un fichier une liste de pixels au format (x,y) (r,g,b) et doit regrouper les couleurs en un nombre N de clusters donne en parametre, avec une limite de convergence L egalement fournie en argument.
L'algorithme k-means doit etre implemente a la main : a chaque iteration, chaque point de donnees est associe au centroide le plus proche au sens de la distance euclidienne dans l'espace RGB (racine de la somme des carres des differences de rouge, vert et bleu), puis les centroides sont recalcules comme la moyenne des points de leur cluster, jusqu'a ce que le deplacement des centroides passe sous le seuil de convergence L fourni en ligne de commande.
La sortie standard affiche pour chaque cluster un en-tete '--' suivi de la couleur moyenne du cluster, puis la liste de tous les pixels (position et couleur d'origine) qui lui appartiennent ; le resultat peut legerement varier d'une execution a l'autre a cause de l'initialisation aleatoire des centroides. Le projet impose la chaine d'outils Stack (version 2.1.3 minimum) avec hpack (package.yaml) et un resolver stackage figeant la version LTS 16.16, sans extra-dependencies dans stack.yaml.
Les dependances autorisees dans les sections lib et executable sont strictement limitees a base, random, parallel, optparse-applicative et containers (JuicyPixels si le volet image bonus est traite), les fonctions de palettisation toutes faites etant explicitement interdites. Le bonus principal consiste a paralleliser le calcul, en particulier la recherche du centroide le plus proche pour chaque point qui est intrinsequement independante d'un point a l'autre, et donc parallelisable via le module parallel, avec verification du comportement multi-thread grace au profileur du runtime Haskell.
Projet suivant
