JeuWeb - Crée ton jeu par navigateur
Couleur la plus proche - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Couleur la plus proche (/showthread.php?tid=4444)



Couleur la plus proche - DragonMaster - 16-11-2009

Bon j'avais sous-estimer le défi que représentait l'association d'une couleur à un type de terrain. Je pense que la chose est possible avec les fonctions prédéfinies du GD mais comme je ne suis pas pro il me manque probablement quelque chose. Donc voilà le problème, j'ai 12 types de terrains de 12 couleurs différentes et je dois prendre une image de 16 millions de couleurs pour la réduire le plus fidèlement possible à ces 12 couleurs.

Intuitivement j'ai premièrement fait la moyenne des différences entre chaque couleur:
Code PHP :
<?php 
$red
=abs($red1-$red);
$green=abs($green-$green);
$blue=abs($blue-$blue);
$proche=($red+$green+$blue)/3;

Ce qui a donné des résultats pas mal mais qui ne me satisfont pas. Ensuite j'ai découvert les fonctions de type: imagecolorresolve mais pour une raison que j'ignore, lorsque j'ai ma palette de 12 couleurs, la fonction attribut une nouvelle cas de la palette à chaque couleur envoyé jusqu'à ce que la palette contiennent 255 éléments. J'ai aussi essayé avec les image true color et puis imagetruecolortopalette...même problème.

Donc si quelqu'un à une idée je suis preneur. En attendant je vais googler...si quelqu'un connais les algorithme d'associations de couleurs, je suis aussi preneurs...je n'arrive simplement pas à le trouver par moi-même.
Bon déjà je viens de trouver un algo largement utilisé qui ressemble à ce que j'avais fait:

Code PHP :
<?php 
$red
=pow(($red1-$red),2);
$green=pow(($green-$green),2);
$blue=pow(($blue-$blue),2);
$proche=($red+$green+$blue);

if (
$ancien>$proche)
$ancien=$proche

Sa améliore légèrement...mais j'aimerais trouver mieux, mais si ce doit être plus complexe.


RE: Couleur la plus proche - Zamentur - 17-11-2009

peut être en essayant un facteur exponentiel différent
et au final est ce que la différence de luminosité t'importe beaucoup?


RE: Couleur la plus proche - DragonMaster - 17-11-2009

En fait c'est justement pas mal le facteur luminosité le problème. Comme ma palette de couleur est très réduite et pas uniforme, les couleurs trop foncé ou trop pâle ne s'associent pas correctement. J'explique, prenons exemple d'un bleu très foncé, ma palette qui ne contient q'un type de bleu #0000FF mais contient 3 type de vert dont #006400 va associé le bleu très foncé à mon vert...

Enfin, mis à part les couleurs vraiment loin de ma palette, l'algo fonctionne relativement bien...je crois que le fait qu'il y ait 3 type de vert dans ma palette et 3 type de gris (blanc est compté...) donne que forcément ces couleurs seront toujours prédominantes.


RE: Couleur la plus proche - Anthor - 17-11-2009

Essaye de convertir le RVB en HSV, c'est plus simple pour calculer des valeurs de couleurs proches.


RE: Couleur la plus proche - DragonMaster - 17-11-2009

Ah tu n'es pas le premier à me le dire...je vais y jeter un œil sur google.


RE: Couleur la plus proche - Anthor - 17-11-2009

Ben du coup en HSV tu pourras séparer la luminosité, donc tu auras plus de precision


RE: Couleur la plus proche - Zamentur - 19-11-2009

En fait ce que tu cherches c'est la couleur dominante... La raison de ma question sur la luminosité.
Peut être qu'un truc du type:
niveau_gris1=R1+V1+B1/3
niveau_gris2=R2+V2+B2/3
$red=pow(R1/niveau_gris1-R2/niveau_gris2,2);
$green=pow(V1/niveau_gris1-V2/moyenne2,2);
$blue=pow(B1/niveau_gris1-B2/niveau_gris2,2);

$proche=($red+$green+$blue);

Ainsi tu exprimes ta différence en fonction de la part que prend le bleu par rapport au rouge et au vert en oubliant la notion de lumière.

Ceci dit la j'ai complètement abolie le concept de luminosité si bien que du blanc pourra être pris pour du noir!
C'est pourquoi je rajouterai:
$niveau_gris=pow(niveau_gris1-niveau_gris2,2)
$proche=($red+$green+$blue+$niveau_gris);

A mon avis çà peut résoudre le problème ceci dit je ne suis sur de rien, j'ai pas essayer ni quoi que ce soit.
Notamment je suis parti sur le postulat que chaque couleur avaient le même poids vis à vis de l'oeil ce qui je pense n'est pas le cas, notamment j'ai trouvé çà:
http://www.linuxgraphic.org/grokking/node52.html a écrit :luminance, Y=0.30 R + 0.59 G + 0.11 B.