2010-12-08 14 views
4

Nous avons une base de données-table où nous gérons une gamme de couleurs. Dans ce tableau, nous économisons les attributs suivants pour une couleur:Trouver les meilleures couleurs correspondant à partir d'une base de données

  • RBG valeurs
  • HSV-valeurs
  • et Lab-valeurs

Chacune de ces valeurs est dans un champ distinct . Ce que nous aimerions réaliser maintenant, c'est de trouver les meilleures couleurs correspondantes si vous recherchez ces valeurs.

L'utilisateur peut choisir pour lequel de ces modèles de couleurs il souhaite effectuer une recherche. Notre première approche a consisté à rechercher ces valeurs dans la base de données avec une gamme (donc si l'utilisateur recherche pour une valeur 150 de rouge (RVB), nous interroger la base de données avec BETWEEN 100 AND 200.

Le résultat est pas très bon, puisque les valeurs combinées sont toujours différentes de quand vous effectuez une recherche pour eux et de trouver des lignes appropriées

y at-il une meilleure approche pour la recherche de notre base de données pour les meilleures couleurs assorties

Explication de « meilleur match ».?
Nous voulons trouver la couleur la plus proche, donc si nous brûlons ch pour un rouge, on veut juste des rouges. Peut-être qu'il est possible de calculer le pourcentage de correspondance pour que l'utilisateur puisse choisir s'il doit correspondre à 100% ou si 50% sont également acceptables.

+1

Vous devez expliquer l'algorithme que vous voulez utiliser pour décider quelle couleur est considérée comme la "meilleure correspondance". – Jon

+0

Si je savais que je pense que je n'aurais pas besoin de poser cette question;) L'utilisateur aura 3 champs: R, G et B s'il veut effectuer une recherche avec une valeur RGB. Et comme indiqué ci-dessus, les résultats ne sont pas très satisfaisants. – Tim

+1

Ce n'est pas ce qu'il demande, il vous demande de définir ce que vous entendez par "meilleur match". Est-ce celui qui correspond à la couleur la plus proche ou la plus complémentaire, ou quelque chose de totalement différent? – wimvds

Répondre

2

J'ai travaillé sur un projet similaire plus tôt ... Ils ont utilisé une formule simple pour déterminer quelle couleur est le plus proche ...

Say est Rm,Gm,Bm couleur à apparier .... et Rx,Gx,Bx est une autre couleur. Donc, nous calculons e = (Rm-Rx)^2 + (Gm-Gx)^2 + (Bm-Bx)^2 .... L'un avec la valeur la plus basse était considéré comme proche ... Notre but est de trouver le (Rx,Gx,Bx) avec le minimum e.

Notre requête ressemblait à ceci Select ColorName from Colortable order by (Rm-Rx)*(Rm-Rx)+...(Bm-Bx) TOP 10 (je ne me rappelle pas la dernière requête eithor ...)

Cela vous a donné le top 10 des meilleures couleurs assorties ...

Note: Je ne défends la formule, mais cela fonctionne très bien dans des cas pratiques.

+0

Cela correspond une couleur par R, G et B, pas la valeur de couleur combinée. Peut-être que c'est le meilleur, mais je ne pense pas que les yeux humains seraient toujours d'accord. Il y a aussi le facteur personnel: certaines personnes pensent que la couleur X est bleue et d'autres pensent que c'est plus vert. – Rudie

+0

C'est ce que j'aurais aussi suggéré, après avoir lu ceci: http://en.wikipedia.org/wiki/Color_quantization (lire "Algorithms", la partie juste en dessous des images). – Jon

0

La correspondance la plus proche serait celle avec le vecteur le plus court entre les valeurs demandées ($ r, $ g, $ b) et les valeurs stockées. par exemple.

SELECT c.id, c.r, c.g, c.b 
FROM colours c 
ORDER BY ((c.r-$r)*(c.r-$r)) 
    + ((c.g-$g)*(c.g-$g)) 
    + ((c.b-$b)*(c.b-$b)) ASC 
LIMIT 0,1; 

(la même méthode fonctionnera pour HSV)

Mais placer des limites sur la requête permettrait tous les index à utiliser pour réduire le jeu de résultats:

SELECT c.id, c.r, c.g, c.b 
FROM colours c 
WHERE c.r BETWEEN ($r-$t) AND ($r+$t) 
AND c.g BETWEEN ($g-$t) AND ($g+$t) 
AND c.b BETWEEN ($b-$t) AND ($b+$t) 
ORDER BY ((c.r-$r)*(c.r-$r)) 
    + ((c.g-$g)*(c.g-$g)) 
    + ((c.b-$b)*(c.b-$b)) ASC 
LIMIT 0,1; 

(il valeur $ t, dépend du nombre de couleurs que vous avez et représente la distance maximale entre deux points adjacents (essayez quelques valeurs et voyez ce qui se passe).