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
Comment Photofiltre détermine le nombre de couleur unique
Modérateurs : Modérateurs, Développeurs
-
- Nouveau(elle)|Nouveau|Nouvelle
- Messages : 6
- Inscription : 22 janv. 2022 14:22
-
- Administrateur(trice)|Administrateur|Administratrice
- Messages : 12813
- Inscription : 28 oct. 2003 22:49
Re: Comment Photofiltre détermine le nombre de couleur uniqu
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...
-
- Nouveau(elle)|Nouveau|Nouvelle
- Messages : 6
- Inscription : 22 janv. 2022 14:22
Re: Comment Photofiltre détermine le nombre de couleur uniqu
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 :
Mais le principe m'est complètement inconnu...
Merci comme même, je vais essayé de comprendre et adapter.
@ bientôt
LouReeD
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
-
- Administrateur(trice)|Administrateur|Administratrice
- Messages : 12813
- Inscription : 28 oct. 2003 22:49
Re: Comment Photofiltre détermine le nombre de couleur uniqu
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
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
-
- Nouveau(elle)|Nouveau|Nouvelle
- Messages : 6
- Inscription : 22 janv. 2022 14:22
Re: Comment Photofiltre détermine le nombre de couleur uniqu
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
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.
-
- Administrateur(trice)|Administrateur|Administratrice
- Messages : 12813
- Inscription : 28 oct. 2003 22:49
Re: Comment Photofiltre détermine le nombre de couleur uniqu
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
-
- Nouveau(elle)|Nouveau|Nouvelle
- Messages : 6
- Inscription : 22 janv. 2022 14:22
Re: Comment Photofiltre détermine le nombre de couleur uniqu
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
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
-
- Nouveau(elle)|Nouveau|Nouvelle
- Messages : 6
- Inscription : 22 janv. 2022 14:22
Re: Comment Photofiltre détermine le nombre de couleur uniqu
Voici les deux codes VBA :
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
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
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
-
- Administrateur(trice)|Administrateur|Administratrice
- Messages : 12813
- Inscription : 28 oct. 2003 22:49
Re: Comment Photofiltre détermine le nombre de couleur uniqu
n'ayant pas fait de vba depuis un moment je ne connaissais pas l’objet Dictionary et ça a l'air intéressant
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
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
-
- Nouveau(elle)|Nouveau|Nouvelle
- Messages : 6
- Inscription : 22 janv. 2022 14:22
Re: Comment Photofiltre détermine le nombre de couleur uniqu
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
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