从数据库中查找最匹配的颜色

时间:2010-12-08 12:38:10

标签: php mysql algorithm colors

我们有一个数据库表,我们管理一系列颜色。 在此表中,我们为颜色保存以下属性:

  • RBG值
  • HSV-值
  • 和Lab-values

这些值中的每一个都在一个单独的字段中。我们现在想要的是找到最佳匹配颜色,如果你搜索这些值。

用户可以选择他想要搜索哪些颜色模型。 我们的第一种方法是使用范围在数据库中搜索这些值(因此,如果用户搜索红色(RGB)的值150,我们使用BETWEEN 100 AND 200查询数据库。

结果不是很好,因为组合的值总是与搜索它们并找到合适的行时不同。

有没有更好的方法来搜索我们的数据库以获得最佳匹配颜色?

“最佳匹配”的说明:
我们想找到最近的颜色,所以如果我们搜索红色,我们只想要红色。也许可以计算匹配的百分比,这样用户就可以选择是否必须是100%匹配,或者50%是否也可以。

2 个答案:

答案 0 :(得分:2)

我之前曾在一个类似的项目上工作过...他们用一个简单的公式来确定哪个颜色最接近......

Rm,Gm,Bm是要匹配的颜色....而Rx,Gx,Bx是另一种颜色......

所以,我们计算e = (Rm-Rx)^2 + (Gm-Gx)^2 + (Bm-Bx)^2 ....具有最低值的那个被认为是接近...我们的目标是找到(Rx,Gx,Bx)最小e

我们的查询看起来像Select ColorName from Colortable order by (Rm-Rx)*(Rm-Rx)+...(Bm-Bx) TOP 10(我不记得确切的查询eithor ......)

这为您提供了十大最佳匹配颜色......

注意:我不支持这个公式,但在实际情况下它的效果很好。

答案 1 :(得分:0)

最接近的匹配是在请求的($ r,$ g,$ b)和存储值之间具有最短向量的匹配。 e.g。

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;

(同样的方法适用于HSV)

但是在查询上放置边界将允许使用任何索引来减少结果集:

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;

(他为$ t的值,取决于你有多少颜色,并代表任意两个相邻点之间的最大矢量距离。(尝试一些值,看看会发生什么)。