Comment interpoler un bitmap en 8 bits

Soyez le premier à donner votre avis sur cette source.

Vue 5 605 fois - Téléchargée 539 fois

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

Ajouter un commentaire

Commentaires

cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Salut Forman!
Je vois que le sujet t' a inspiré :)

Je suppose que là, ben t' attends mon avis ? hein ? c' est ça ? ben non !!!
quand je compile j' obtiens l' erreur suivante:
internal error: X865 à la ligne 231 de histo.pas
Chui dégouté, je vais me pendre !!!
Aller, je suis sûr que tu nous résouds ça sans utiliser de marteau ! keep good work ...
PS: rien que ton commentaire au début de cette page m' a donné une idée pour faire ce que je voulais, je vais attendre de voir ton code et je te proposerai ma soluce si elle est plus efficace!
cs_Forman
Messages postés
663
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1 -
Ha ha!
C'est un bug (presque) connu du compilateur Delphi! Fait une recherche Google sur "delphi error X865" et tu verras qu'on n'est pas les premiers...
Pour que ça compile, il suffit de ne pas activer les optimisations du code dans les options du projet, rubrique "compiler". Je ne m'en étais pas aperçu parce qu'elles étaient désactivées chez moi...
cs_Forman
Messages postés
663
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1 -
En fait, la solution est assez simple:
dans le constructeur

constructor TComponents.Create(AHistogram: TTreeHistogram; AMin, AMax: Cardinal);
var
...
h:TTreeHistogram;
begin
...
end;

C'était la ligne suivante qui provoquait l'erreur:

h:=TTreeHistogram.Create(FHistogram.SubHistogram[0].FBounds);

Sachant que juste avant, on avait fait:

FHistogram:=AHistogram;

Tout simplement, il suffisait de la remplacer par:

h:=TTreeHistogram.Create(AHistogram.SubHistogram[0].FBounds);

ce qui est strictement équivalent. Je pense que le bug vient de ce qu'il essaie d'optimiser ce code d'une façon ou d'une autre (par exemple en essayant d'utiliser moins de variables intermédiaires) et qu'il y a un bug dans la gestion des optimisations de Borland...
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
J' ai changé la ligne plutôt que de changer les options de compilation.
Cette fois, je vais pouvoir essayé le programme :)
Et bien, comment dire ... heuh ... je t' avoue que je suis bleuffé:
En dehors de la finalité de ce prog, il est très didacticiel, ouai c' est le mot qui lui convient le mieux!
Sinon, ha oui ... est-ce bien ce que je désirait? et bien c' est encore mieux !!!
Non, je te jure, il est bon ce Forman hein les gars?!
Au fait, pourrais-tu nous raconter un peu qui tu es, genre profession etc ... pour que l' on sache un peu qui se cache derriere toutes ces sources de GRANDE kalité?!
Un mauvais point tout de même (si si !): les compos ne sont pas nommés, mais cette fois je m' en tape!
Je te mettrai bien 500/10 mais on peut mettre que 10/10 maximum ...
Et moi qui disait que j' avais trouvé une soluce, je vais aller me coucher ...
cs_Forman
Messages postés
663
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1 -
Lol, merci!

Je suis étudiant en 2ème année de thèse de maths actuellement, et je donne des cours en même temps, je crois que ça peut s'appeller enseignant-chercheur.

Et toi?

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.