Comment interpoler un bitmap en 8 bits

Description

C'est suite à une question de Mauricio (source http://www.delphifr.com/code.aspx?ID=30165). Le problème est le suivant: on a une image en 24 bits par pixels (c'est à dire que chaque pixel peut prendre plusieurs millions de couleurs différentes), et on voudrait la transformer en une image à 8 bits par pixel, où chaque pixel ne peut prendre que 256 couleurs différentes. Evidemment, il y aura une perte de qualité dans l'image obtenue, on cherche à minimiser cette perte. L'algorightme que j'ai fait travaille sur des histogrammes de répartition des couleurs. L'objectif est de "segmenter" chacun des domaines de l'histogramme en ses composantes les plus représentatives. Par exemple, pour une image où il y a beaucoup de rouge, il faut que dans la palette des 256 couleurs le rouge soit très représentatif.

C'est là que les problèmes arrivent. En effet, les espaces de couleur usuels comportent 3 dimensions orthogonales (c'est à dire en gros indépendantes). Et je ne connais pas vraiment de méthode efficace pour segmenter un histogramme dont le support est de dimension plus grande que 1. Il faut donc établir une hiérarchie arborescente du domaine. C'est à dire que l'on va déjà découper l'histogramme des répartitions dans la première dimension, puis pour chacune des composantes obtenues on découpera successivement les dimensions successives et ainsi de suite. Cette formalisation implique une disymétrie dans le rôle de chacune des 3 dimensions de l'espace de couleurs, il nous faut donc utiliser un espace de couleur asymétrique... L'espace HSV (Hue, Saturation, Value) en est un parfait exemple, c'est celui que j'utilise.

Il y a pas mal de maths dans le code, et quelques petite choses utiles, comme par exemple une représentation arborescente de l'histogramme des couleurs.

Source / Exemple :


Voilà, en gros ça a l'air de marcher, il y a sûrement des optimisations à faire, mais bon courage      ;-)

Conclusion :


J'ai mis le code dans la catégorie "divers", parce qu'il y a pleins de choses différentes dedans ;)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.