在SQL中找到与矢量(RGB)最接近的匹配,可调节容差?

时间:2015-04-15 13:39:50

标签: sql sql-server rgb

我有一个有趣的问题。给定像素RGB颜色值(向量,即255,255,255)并给出所有已知历史向量(颜色)的数据库表,在表中找到匹配的最有效/最快的方法是什么?

例如,假设我有一个浅蓝色(30,144,255)和一个包含数千种其他颜色的表,(但与上面的蓝色不完全匹配) - 如何构建一个sql查询以找到最接近的匹配?

理想情况下,如果我们正在寻找完全匹配,那么查询将不会返回任何内容,但在此示例中,(30,144,255)蓝色不在表中,因此我们需要一定程度的容差和/或距离提供的可接受距离矢量。

所以我们可能会说,找到我在n度/百分比/之内的匹配,我们可以调整这种容忍度。

我已经看到过这样的逻辑,如C#,C ++等,但理想情况下我想将其与数据库相抵消,我不知道如何以最有效/最快的方式表达这一点。方式。

提前致谢!

2 个答案:

答案 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

这是你的意思吗?