Comment interpoler un bitmap en 8 bits

Soyez le premier à donner votre avis sur cette source.

Vue 5 622 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
Désolé, j' étais en vacance :)
Donc, faut que je situe un peu: je suis né en France (Marcq en Baroeul), j' ai fais un BTS informatique de gestion au lycée Gaston Berger à Lille, j' ai quitté la France juste après pour vivre ds le pays d' origine de mes parents (Portugal). J' ai bossé 6 mois dans un commerce de vente/assistance informatique, puis je suis parti travaillé pour un de nos client dans un projet de gestion de production de confection textile. J' y est fais un module de gestion commerciale (facturation etc ...). Puis, j' ai fais un programme de gestion de commerciale (gestion stock/vente) pour 3 magasins que nous avons ouvert. Ça va faire 7 ans maintenant ... Ha oui, tout ça en Delphi, je suis le seul programmeur et même informaticien :(
Actuellement? bem je fais rien ... Non serieusement, j' etudie la possibilité de faire évoluer notre base de donnée vers SQL server ou Interbase. Je suis donc dans une phase d' apprentissage. Voilà, vous savez tout!
cs_Forman
Messages postés
600
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?
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
600
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_Forman
Messages postés
600
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...

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.