Compter les couleurs d'une image

Soyez le premier à donner votre avis sur cette source.

Vue 4 820 fois - Téléchargée 697 fois

Description

chose promise, chose due.
Voilà une petite méthode pour compter le nombre de couleur d'une image.
Il y en a plusieurs :
- parcourir tous les pixels et regarder si la couleur existe déjà dans un tableau, si oui, on passe au pixel suivant, sinon, on augmente la taille du tableau et on sauvegarde la couleur.
- Prendre le premier pixel, parcourir le reste de l'image et marquer les pixels identiques pour ne pas les recompter. Continuer au pixel suivant en sautant les pixels déjà marqués.
Dans ces deux cas, la recherche est longue (parcourir plusieurs fois l'image, ou parcourir un tableau de plus en plus grand...).
Dans la solution proposée, le principe est différent.
On crée un arbre binaire représentant les différents possibilités d'écrire les couleurs.
Le premier niveau de l'arbre correspondant au premier bit de la couleur, etc...
On avance dans le décodage de la couleur et on choisi la branche 0 ou 1.
Une fois le décodage terminé, on arrive sur la feuille représentant la couleur (feuille unique).
Seules les couleurs présentent dans l'images on une feuille de créée.
Dans mon code, on sauvegarde le nombre de fois où l'on arrive sur cette feuille. Ainsi, on obtient la redondance de la couleur. On peut donc rechercher la couleur la plus présente, la moins présente, ou encore le nombre de fois que la couleur X apparaît.

En guise d'exemple, je fait trois fois la manipulation de création de l'arbre pour scinder les fonctions. Dans la "vraie vie", la même fonction peut compter les couleurs, recherche une redondance,... en une seule fois...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26 -
Pas mal, j'avais fait un truc dans ce style un jours, mais ou je ne comptais pas les couleurs mais trouvais le nombres de nuances par calcul relativement rapidement 10Mp/30ms (325Kp/ms)

type
TColorsCounters = array[0..3, 0..$FF] of word;
TExplodedColor = packed array[0..3] of byte;
TScanLine = array[0..0] of TExplodedColor;
PScanLine = ^TScanLine;
TImageInfo = packed record
RenderTime : LongWord;
Pixels : LongWord;
ShadesOfAlpha : LongWord;
ShadesOfRed : LongWord;
ShadesOfGreen : LongWord;
ShadesOfBlue : LongWord;
TotalShades : LongWord;
MainShade : byte;
function getFromBitmap(BMP: TBitmap): TImageInfo;
end;

function TImageInfo.getFromBitmap(BMP: TBitmap): TImageInfo;
var Y,X,T: integer;
P: PScanLine;
Counters : TColorsCounters;
C : TExplodedColor;
begin
FillChar(Counters, 4*256, 0);
FillChar(self, 7*4+1,0);

BMP.PixelFormat := pf32bit;

RenderTime := getTickCount;
Pixels := BMP.Width * BMP.Height;

for Y := 0 to BMP.Height-1 do
begin
P := BMP.ScanLine[Y];
for X := 0 to BMP.Width-1 do
begin
C := P^[X];
Counters[0, C[0]] := 1;
if C[0] = $00 then
begin
Counters[1, C[1]] := 1;
Counters[2, C[2]] := 1;
Counters[3, C[3]] := 1;
end;
end;
end;

for X := $01 to $ff do
begin
if Counters[3, X] = 1 then inc(ShadesOfAlpha);
if Counters[0, X] = 1 then inc(ShadesOfRed);
if Counters[1, X] = 1 then inc(ShadesOfGreen);
if Counters[2, X] = 1 then inc(ShadesOfBlue);
end;
TotalShades := (1+ShadesOfRed) * (1+ShadesOfGreen) * (1+ShadesOfBlue);

if (ShadesOfRed > ShadesOfGreen) and (ShadesOfRed > ShadesOfBlue) then
MainShade := 0;
if (ShadesOfGreen > ShadesOfRed) and (ShadesOfGreen > ShadesOfBlue) then
MainShade := 1;
if (ShadesOfBlue > ShadesOfGreen) and (ShadesOfBlue > ShadesOfRed) then
MainShade := 2;

RenderTime := getTickCount-RenderTime;
result := self;
end;
cs_cantador
Messages postés
4992
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9 -
@caribensila:
sincère et désintéressé..
@barbichette :
des coquilles, en cherchant bien, il y en a dans les anciens codes
déposées (dans les miens surtout !)
la perfection à 100% n'est pas utile ici (sauf gros plantage bien sûr..)
l'essentiel n'est-il pas de montrer l'idée et chacun ensuite en fait ce qu'il veut..
Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13 -
Je vote pour la création d'une nouvelle Catégorie dans CodeS-SourceS !

- LES CODES MARRANTS & INNOVANTS 100% INUTILES
cs_barbichette
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
-
Je vais d'ailleurs essayé de faire un petit truc marrant et sans aucun intérêt pour fêter mes 10 ans sur codes-sources...
cs_barbichette
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
-
Ben, dis donc !
Que de papotage pour une simple fonction de comptage.
Je vais finir par poster une fonction de calcul du PGCD...
Bon, je plaisante...
Je suis d'accord avec Cantador sur le fait que ce genre d'échange et toujours intéressant. Et c'est d'ailleurs le but de ce genre de site. Le partage.
Enfin, il me semble.
Même si bon nombre de nouveaux inscrits ne me semble pas que peu intéressants, il y en a surement un petit nombre qui ne demande qu'a s’épanouir, monter leurs talents et nous transmettre du sang neuf.
Car même si les les vieux de la vieille donnent l'impression d'avoir une science infuse, elle infuse surtout dans une eau bien claire...
Je pense qu'on peut apprendre à tout âge, la preuve avec la question de Caribensila sur les tableaux [0..0].

Je suis aussi d'accord sur le fait qu'il manque de nos jour un peu d'humour et de légèreté... Mais en vieillissant, on devient tous plus sage... C'est la loi de la nature.

Enfin, malgré tout ces blabla, personne n'a remarqué que ma source était fausse...
Je vais donc me dépêcher de la modifié car la recherche de la couleur la moins présente n'est pas du tout la bonne...
Comme quoi, même les vieux peuvent se tromper...

Barbichette

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.