我们有一个数据库表,我们管理一系列颜色。 在此表中,我们为颜色保存以下属性:
这些值中的每一个都在一个单独的字段中。我们现在想要的是找到最佳匹配颜色,如果你搜索这些值。
用户可以选择他想要搜索哪些颜色模型。
我们的第一种方法是使用范围在数据库中搜索这些值(因此,如果用户搜索红色(RGB)的值150,我们使用BETWEEN 100 AND 200
查询数据库。
结果不是很好,因为组合的值总是与搜索它们并找到合适的行时不同。
有没有更好的方法来搜索我们的数据库以获得最佳匹配颜色?
“最佳匹配”的说明:
我们想找到最近的颜色,所以如果我们搜索红色,我们只想要红色。也许可以计算匹配的百分比,这样用户就可以选择是否必须是100%匹配,或者50%是否也可以。
答案 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的值,取决于你有多少颜色,并代表任意两个相邻点之间的最大矢量距离。(尝试一些值,看看会发生什么)。