Comment Photofiltre détermine le nombre de couleur unique

Discussion de programmation pour éviter d'empiéter dans les autres forums

Modérateurs : Modérateurs, Développeurs

LouReeD
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 6
Inscription : 22 janv. 2022 14:22

Comment Photofiltre détermine le nombre de couleur unique

Message par LouReeD »

Bonjour,

Je programme un peu sous VBA pour Excel, et je cherche à savoir comme photofiltre détermine le nombre de couleur unique d'une image ?
En effet, j'ai essayé d'extraire les méta données d'une image, mais aucune de celles que j'ai trouvées n'indique cette donnée.
Alors je me demande si c'est un algorithme interne à photofiltre qui le calcul "en direct" ou est-ce une méta donnée particulière dont je ne sais comment l'extraire ?

Merci @ vous de vous penchez sur mon message.

@ bientôt

LouReeD
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12791
Inscription : 28 oct. 2003 22:49

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par Antonio »

oui c'est algorithme interne qui nécessite pas mal de mémoire. Normalement il doit y en avoir sur le net vu que c'est là que je l'ai trouvé à l'époque...
LouReeD
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 6
Inscription : 22 janv. 2022 14:22

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par LouReeD »

Bonjour,

Merci pour la réponse et dommage pour moi ! :(
J'ai cherché sur le net, j'ai bien trouvé un site qui parle de ce genre d'algorithme mais le langage ne correspond pas à celui sur lequel j'aimerais l'utilisé...
Je cherche à le faire en VBA et ce que j'ai trouvé c'est sur Delphi (je crois) par contre c'est prometteur :
En effet, elle est plus rapide, elle renvoie le résultat en (environ) 200 ms. Elle fonctionne sur le principe du cube de couleurs. C'est la solution "idéale" en terme de traitement d'image, mais le problème est la taille prohibitive d'un cube "complet" (16 Mo au bas mot !!), ou la lourdeur de gestion d'un cube optimisé (listes chaînées hyper lourdes).

Mais le principe m'est complètement inconnu...

Merci comme même, je vais essayé de comprendre et adapter.

@ bientôt

LouReeD
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12791
Inscription : 28 oct. 2003 22:49

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par Antonio »

j'ai pas mes sources sous la main mais le principe est très simple :

1) on cré un tableau de Boolean à 3 dimensions correspondant au 16 millions de couleurs possibles. En partant du principe qu'on travaille sur des composantes R, G, B de 0 à 255 (8 bits)

Colors = Array [0..255, 0..255, 0.255] of Boolean

2) On initialise toutes le valeurs à False

3) On parcourt chaque pixel de l'image et on récupère les composantes R, G, B de notre pixel.

a) Si le tag dans notre tableau Colors[R, G, B] est à False, ça signifie que c'est une nouvelle couleur
==> on incrémente le nombre de couleurs et on passe le tag à True

b) si le tag est déjà à True on ne fait rien, ça signifie que la couleur est déjà comptabilisée
LouReeD
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 6
Inscription : 22 janv. 2022 14:22

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par LouReeD »

Bonsoir,

en fait sous VBA on peut récupérer la couleur par sa valeur "long" de 0 à 16777255.
il existe aussi un objet Dictionary qui n'accepte pas de doublon, donc à chaque pixel trouvé j'essaie de mettre sa couleur dans le dictionnaire, s'il n'existe pas, cela l'ajoute, si c'est un doublons, on passe à l'autre pixel. En fin de procédure il suffit de compter le nombre d'occurrence dans le dictionnaire. mais je trouve que cela ne va pas vite.

@ bientôt

LouReeD
Dernière modification par LouReeD le 25 janv. 2022 21:24, modifié 1 fois.
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12791
Inscription : 28 oct. 2003 22:49

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par Antonio »

c'est clair que parcourir une liste à chaque insertion est très long voir inexploitable sur une grande image, la méthode que j'ai décris plus haut est très rapide vu qu'il n'y a aucun tri
LouReeD
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 6
Inscription : 22 janv. 2022 14:22

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par LouReeD »

Bonsoir,

Faut que je fasse des tests mais pour moi l'objet Dictionary justement permet de ne pas tester les valeurs internes, il n'accepte pas deux données identiques...
ou bien c'est moi qui ne le comprend pas correctement : il se peut que nativement cet objet fasse la recherche de doublon et que du coup il fasse un scan de ses données malgré tout. pour moi je l'avais vu comme étant "instantané" on veut y mettre une donnée, elle existe paf on lui interdit l'entrée, je vais de ce pas faire un test sur une image qui ne comportera pas beaucoup de couleur unique.

@ bientôt

LouReeD
LouReeD
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 6
Inscription : 22 janv. 2022 14:22

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par LouReeD »

Voici les deux codes VBA :

Code : Tout sélectionner

Sub une()
    ' on compte le nombre de couleur de l'image
    For I = 0 To Max_X
        For J = 0 To Max_Y
            c = GetPixel(DeskHdc, J, I)
            r = Int(c Mod 256)
            g = Int((c Mod 65536) / 256)
            b = Int(c / 65536)
            If tabcoul(r, g, b) = False Then
                tabcoul(r, g, b) = True
                nbcoul = nbcoul + 1
            End If
            DoEvents
        Next J
    Next
End Sub

Sub deux()
    ' on compte le nombre de couleur de l'image
    For I = 0 To Max_X
        For J = 0 To Max_Y
            MonDico(GetPixel(DeskHdc, J, I)) = ""
            DoEvents
        Next J
    Next
End Sub
Les deux mon sortis le même nombre de couleur unique 49792 pour une image de 560 x 200 pixels et les deux codes ont mis environs 40 secondes.
Conclusion 1 : l'objet dictionary est aussi rapide que tester si une valeur existe dans un tableau à trois entrées.
Conclusion 2 : ce doit être l'instruction GetPixel qui ralenti les procédures, en effet celle-ci interroge les pixels écran et l'accès à cette donnée doit être chronophage ! Il me faudrait mettre l'image en mémoire et travailler le code dans la mémoire plutôt que sur l'écran...

je cherche encore, mais quand je vois que le clic sur propriété de photofilte, les données s'affichent instantanément, je me dis que j'ai de la marge de progression !

@ bientôt

LouReeD
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12791
Inscription : 28 oct. 2003 22:49

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par Antonio »

n'ayant pas fait de vba depuis un moment je ne connaissais pas l’objet Dictionary et ça a l'air intéressant :wink:

si la procédure GetPixel de vba appelle l'api windows correspondante, c'est en effet assez long, il faut travailler sur le bitmap en mémoire pour optimiser
LouReeD
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 6
Inscription : 22 janv. 2022 14:22

Re: Comment Photofiltre détermine le nombre de couleur uniqu

Message par LouReeD »

Bonjour,
voilà, je n'ai pas réussi à faire mieux en VBA...
Mon application de mosaïque aura donc un fonctionnement "ralentis" mais le résultat est là malgré tout.

Merci encore à vous pour la direction de recherche.

@ bientôt

LouReeD