我有一个有趣的问题。给定像素RGB颜色值(向量,即255,255,255)并给出所有已知历史向量(颜色)的数据库表,在表中找到匹配的最有效/最快的方法是什么?
例如,假设我有一个浅蓝色(30,144,255)和一个包含数千种其他颜色的表,(但与上面的蓝色不完全匹配) - 如何构建一个sql查询以找到最接近的匹配?
理想情况下,如果我们正在寻找完全匹配,那么查询将不会返回任何内容,但在此示例中,(30,144,255)蓝色不在表中,因此我们需要一定程度的容差和/或距离提供的可接受距离矢量。
所以我们可能会说,找到我在n度/百分比/之内的匹配,我们可以调整这种容忍度。
我已经看到过这样的逻辑,如C#,C ++等,但理想情况下我想将其与数据库相抵消,我不知道如何以最有效/最快的方式表达这一点。方式。
提前致谢!
答案 0 :(得分:1)
颜色可以在RGB空间中在数学上闭合,而不会被人类感知到。如果首先将RGB映射到YUV颜色空间,它将与人类视觉更好地对齐。
DECLARE @R int, @G int, @B int
SELECT TOP(1)
R,G,B
,distance = (Y-@Y)*(Y-@Y)+(U-@U)*(U-@U)+(V-@V)*(V-@V)
FROM MyTable AS rgb
CROSS APPLY (
SELECT
Y = (0.299*R + 0.587*G + 0.114*B)
,U = 0.492 * (B - (0.299*R + 0.587*G + 0.114*B) )
,V = 0.877 * (B - (0.299*R + 0.587*G + 0.114*B) )
,iY = (0.299*@R + 0.587*@G + 0.114*@B)
,iU = 0.492 * (@B - (0.299*@R + 0.587*@G + 0.114*@B) )
,iV = 0.877 * (@B - (0.299*@R + 0.587*@G + 0.114*@B) )
) yuv
ORDER BY distance
答案 1 :(得分:0)
不是100%肯定你为什么要这样做,或者如果我理解正确,但是你说你有一个RGB值表,即...
CREATE TABLE Colors (R int, G int, B int);
然后你想找到哪一行是"最近的"一些示例颜色(比如R = 128,G = 54,B = 13),你可以找到绝对差值最小的记录,例如......
SELECT R, G, B, ABS(R - 128) + ABS(G - 54) + ABS(B - 13) FROM Colors ORDER BY 4 LIMIT 1
这是你的意思吗?