Bonjour,
Je cherche un algorithme de réduction du nombre de couleurs dans une image pour un besoin particulier.
Il faut que l'image obtenue comporte des formes bien nettes, sans couleurs intermédiaires.
Je vais prendre un exemple, ce sera plus parlant :
Cette image est en 24 bits, donc du fait de l'anti aliasing, il y a pas mal de pixels de couleurs intermédiaires entre les formes.
L'objectif est d'obtenir une image "pixelisée" en cinq couleurs, comme si l'image avait été dessinée sans anti-aliasing avec une ancienne version de Paint.
Précision importante : dans mon application, c'est l'utilisateur qui va choisir les couleurs à conserver.
Dans l'exemple donné, l'utilisateur choisira de conserver le blanc, le rouge, le jaune, l'orange et le bleu.
L'algorithme n'a donc pas à déterminer par le calcul le nombre de couleur à obtenir, ni la valeur de ces couleurs.
L'algorithme devra faire avec les couleurs imposées.
Un traitement sur la palette posera un problème au niveau de la frontière entre le cercle jaune et le rectangle rouge, car des pixels intermédiaires seront inévitablement reconnus comme orange qui est une couleur utilisée par une autre forme de l'image.
J'ai pu trouver toutes sortes d'algorithmes de réduction de couleurs (k-moyennes, k-moyennes++, Floyd-Steinberg, ...) mais ces algorithmes ont été élaborés pour du traitement d'image "classique" destiné à réduire le nombre de couleurs d'une photo en conservant le mieux possible son aspect esthétique pour l'œil humain.
Ca ne correspond pas à ce que je souhaite faire.
Auriez vous connaissance d'un type d'algorithme adapté à mon besoin ?
Je pensais procéder par "passes successives", c'est à dire :
- En faisant d'abord une conversion noir et blanc pour chaque couleur imposée, avec un seuil assez sévère pour que seuls les pixels très proches de la couleur voulue soient blancs et tous les autres noirs;
- Ensuite, j'effectue un filtrage pour éliminer les éventuels pixels blancs "isolés";
- On obtient une série d'images en noir et blanc pour chaque couleur (un peu comme des calques).
- Enfin, on peut ensuite recombiner ces "calques" pour obtenir l'image finale, en peignant successivement de la bonne couleur les zones blanches de chaque image en noir et blanc.
Mais je crains de me retrouver avec des "artefacts" dans l'image finale, car les "calques" risquent de ne pas bien se recouvrir
Ou alors il faut procéder par "couches", chaque couleur de l'image finale étant classée dans un certain ordre, et ensuite :
- le premier "calque" détecte tous les pixels de la couleur n°1
- le 2e "calque" détecte tous les pixels de la couleur n°1 ou de la couleur n°2
- le 3e "calque" détecte tous les pixels de la couleur n°1 ou de la couleur n°2 ou n°3
- le 4e "calque" détecte tous les pixels de la couleur n°1 ou de la couleur n°2 ou n°3 ou n°4
En quelque sorte, on élimine chaque couleur au fur et à mesure
Il faudra du filtrage là aussi
Ensuite, on peint sans anti aliasing l'image finale dans l'ordre inverse :
- d'abord la couleur n°5 en couleur de fond
- puis la couleur n°4 avec le calque n°4
- puis la couleur n°3 avec le calque n°3
- puis la couleur n°2 avec le calque n°2
- puis la couleur n°1 avec le calque n°1
A bientôt
Partager