"Distance" entre les couleurs en PHP
Je suis à la recherche d'une fonction qui permet de représenter avec précision la distance entre deux couleurs, comme un numéro ou quelque chose.
Par exemple, je suis à la recherche d'avoir un tableau de valeurs hexa ou RGB tableaux et je veux trouver la plupart sont de la même couleur dans le tableau pour une couleur donnée
par exemple. Je passe d'une fonction d'une valeur RVB et le "plus proche" de la couleur dans le tableau est retourné
source d'informationauteur Phil
Vous devez vous connecter pour publier un commentaire.
Chaque couleur est représentée comme un tuple dans le code HEXADÉCIMAL. Pour déterminer des correspondances proches, vous devez soustraire de chaque composant RVB séparément.
Exemple:
modifier
Donc, vous voulez le plus proche de la couleur nommée? Créer un tableau avec les valeurs hexadécimales de chaque couleur, de le parcourir et de retourner le nom. Quelque chose comme ceci;
Voici un document sur le sujet qui devrait donner une bonne réponse.
Je pensais que la conversion à HSL/HSV première serait une bonne idée aussi, mais ensuite, j'ai pris conscience du fait que les valeurs extrêmes de l'indice S & L/V, H n'a pas d'importance, et dans le milieu, c'est le plus important.
Je pense que si vous voulez une solution simple, rester dans l'espace RVB serait plus sage. Je voudrais utiliser cartésien distance. Si vous envisagez de couleur
R G B
contreRi Gi Bi
pour plusieursi
vous voulez lei
qui minimiseVous devez d'abord choisir th espace de couleurs approprié vous voulez que la couleur des comparaisons de se produire dans (RGB, HSV, HSL, CMJN, etc.).
En supposant que vous voulez savoir comment fermer deux points dans les 3-dimenionsal de l'espace RVB sont les uns aux autres, vous pouvez calculer le Pythagoricien distance entre eux, c'est à dire,
Cela vous donne le carré de la distance. (En prenant la racine carrée n'est pas nécessaire si vous êtes à la comparaison des carrés des valeurs).
Cela suppose que vous voulez traiter la de R, G et B les valeurs aussi. Si vous préférez le poids de l'individu composantes de couleur, comme ce qui se passe quand vous convertir RVB en niveaux de gris, vous devez ajouter un coefficient à chaque terme de la distance, c'est à dire,
Ce qui suppose le populaire de conversion de RVB en niveaux de gris de 30% rouge + 59% vert + 11% bleu.
Mise à jour
Cette dernière équation devrait probablement être
Une approche très simple est de calculer la somme de la distance entre les trois dimensions. Par exemple simple_distance("12,10,255","10,10,250")=7
Une approche plus sophistiquée serait de prendre le carré de la distance pour chaque composants et la somme de ceux - de cette façon, les composants étant trop loin serait "puni" de plus: square_distance("12,10,255","10,10,250")=2*2+0*0+5*5=29.
Bien sûr, vous devez effectuer une itération sur la liste de couleurs et de trouver le plus proche.
vous pouvez convertir votre valeur RVB de LGV ou HSV. puis les couleurs sont faciles à comparer: ordre des couleurs en fonction de la teinte d'abord, puis par la saturation, puis par la luminance. dans la commande, 2 couleurs à côté de l'autre apparaît comme très proche en terme de perception.
attention, la teinte s'enroule autour de: pour une teinte allant de 0 à 255, une teinte de 0 et une teinte de 255 sont très proches.
voir l'article de wikipedia sur la LGV http://en.wikipedia.org/wiki/HSL_and_HSV pour la formule qui vous permettra de convertir RVB en HSL
(notez que d'autres espaces de couleurs, à l'instar de L. une.b., peut donner de meilleurs résultats, mais la conversion est plus compliquée)
nous allons définir ce mathématiquement:
où F est un facteur soigneusement choisis (quelque chose comme 256...)
la formule ci-dessus ne tient pas compte de la teinte enveloppante...