2009-11-20 20 views

Répondre

1

Vous pourriez essayer de trouver la somme des différences entre votre couleur prédéfinie et la couleur définie par l'utilisateur et choisir la couleur prédéfinie avec la "distance" minimale.

E.g. supposons que la couleur définie par l'utilisateur est [120 300 200] et une couleur prédéfinie est [100 250 150], la somme des différences au carré et le score est:

(120-100)*(120-100) + (300-250)*(300-250) + (200-150)*(200-150) = 5400 - et choisissez la couleur prefefined avec la moindre différence.

+0

Merci Jacob. Puis-je stocker la valeur UIColor pour chaque couleur prédéfinie et effectuer une comparaison la plus proche en fonction de sa valeur flottante? – yesimarobot

+0

Oui, vous pouvez le faire. Si vous voulez le rendre très rapide, vous pouvez construire un arbre KD à partir des couleurs prédéfinies - cela rendra l'interrogation très rapide. Sinon, vous pouvez le faire à la bruteforce - comparez chaque couleur. – Jacob

+0

Cool. Je regarde moins de 1000 comarisons max. J'ai implémenté votre suggestion en PHP et cela fonctionne bien. Je cherche à implémenter ceci pour l'iPhone. Un arbre KD vaut-il le coup? – yesimarobot

1

Cela soulève la question ou quelle est la proximité des couleurs.

Vous aurez besoin d'essayer ceci, les couleurs ne sont pas toutes des maths. Si l'on veut trouver la distance entre deux points dans l'espace 3D (il y a trois couleurs) les maths donnés color1 et color2 seraient: ((r2-r1)^2 + (b2-b2)^2 + (g2-g1)^2)^0,5 (la racine carrée finale n'est pas nécessaire à des fins de comparaison).

Possible une meilleure façon serait de faire les calculs dans l'espace HSB, possible en regardant simplement Teinte.

0

D'abord, vous devez définir une fonction de distance. Le trivial est une fonction de longueur de vecteur: somme de carrés de différence par toutes les dimensions.

Ensuite, il suffit de parcourir votre tableau et sélectionnez le placard (avec une distance minimale).

2

Vous devez décider dans quel espace colorimétrique vous testez.

HSL est sans doute un meilleur espace de couleur que RVB parce que vous pouvez donner plus de poids à "différence de teinte" et moins à "légèreté". Dans l'espace RVB, vous devez biaiser vos différences parce que l'œil est mieux à des nuances de vert clair que d'autres couleurs.