2010-12-08 97 views
4

我们有一个数据库表,我们可以管理一系列颜色。 在此表中,我们保存用于彩色的以下属性:从数据库中查找最匹配的颜色

  • RBG值
  • HSV-值
  • 和Lab值

这些值中的每一个是在一个单独的场。我们现在想要实现的是如果您搜索这些值,找到最匹配的颜色。

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

结果不是很好,因为合并的值是从当你搜索并找到合适的行总是不同

是否有搜索我们的数据库中最匹配的颜色没有更好的办法

“最佳匹配”的解释:?
我们希望找到最接近的颜色,所以如果我们搜索为红色,我们只是想要红色。也许有可能计算匹配的百分比,以便用户可以选择是100%匹配还是50%也可以。

+1

你应该解释一下你想要使用的算法,它决定什么颜色被认为是“最佳匹配”。 – Jon 2010-12-08 12:40:54

+0

如果我知道我不想问这个问题;) 用户将有3个字段:R,G和B,如果他想用RGB值进行搜索。如上所述,结果并不令人满意。 – Tim 2010-12-08 12:45:17

回答

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 ...)

这给你的前10名最佳匹配颜色...

注:我不主张该公式,但它在实际情况下工作得很好。

0

最接近的匹配将是所请求的($ r,$ g,$ b)和存储值之间的矢量最短的一个。例如

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,取决于你有多少颜色,并且表示任何两个相邻点之间的最大向量距离(尝试一些值,看看会发生什么)。