我有一个RGB值,如果它在我的数据库的颜色表中不存在,那么我需要找到最接近的颜色。我想比较所有值,并计算差值(红色,绿色和蓝色),然后取平均值。最低平均偏差应该是最接近的颜色。但我觉得可能有更好的方法,有什么建议吗?
我有一个RGB值,如果它在我的数据库的颜色表中不存在,那么我需要找到最接近的颜色。我想比较所有值,并计算差值(红色,绿色和蓝色),然后取平均值。最低平均偏差应该是最接近的颜色。但我觉得可能有更好的方法,有什么建议吗?
把颜色看作三维空间中的向量,你可以使用3D勾股定理轻松计算它们之间的差异:
d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)
然而,需要注意的是,由于颜色受到不那么完美的眼睛解释的影响,您可能需要调整颜色以避免它们具有相同的重要性。例如,使用典型的加权方法: 链接。d = sqrt(((r2-r1)*0.3)^2 + ((g2-g1)*0.59)^2 + ((b2-b1)*0.11)^2)
由于眼睛对绿色最为敏感,对蓝色最不敏感,因此,两种仅在蓝色分量上有差异的颜色必须具有更大的数值差异才能被认为是“更不同”,而与绿色分量相同的数值差异则相对较小。
此外,还有各种方法可以优化这个计算。例如,由于实际上并不关心值本身,因此可以省去平方根:
d = ((r2-r1)*0.30)^2
+ ((g2-g1)*0.59)^2
+ ((b2-b1)*0.11)^2
需要注意的是,在许多基于C语法的编程语言(如C#)中,^
并不意味着“乘方”,而是“二进制异或”。
所以如果这是C#,你应该使用 Math.Pow
来计算那部分,或者展开并进行乘法运算。
附加信息:根据维基百科上关于颜色差异的页面,有各种标准来处理视觉差异。例如,名为CIE94的标准使用不同的公式,在看起来值得研究的L*C*h
色彩模型中,但这取决于你想要多精确。
select (abs(my_R - t.r) + abs(my_G - t.g) + abs(my_B - t.b)) / 3 as difference, t.*
from RGBtable t
order by difference desc;
让数据库为您完成:
select top 1
c.r,
c.b,
c.g
from
color c
order by
(square(c.r - @r) + square(c.g - @g) + square(c.b - @b))
这里的@r
、@g
和@b
是您要搜索的颜色的RGB值(SQL Server参数语法,因为您没有指定数据库)。请注意,由于order by
中有一个函数调用,仍然需要进行表扫描。
请注意,额外的平方根调用实际上并不是必需的,因为它是单调函数。虽然可能不会有太大影响,但仍需注意。
difference = sqrt((red1 - red2)^2 + (green1 - green2)^2 + (blue1 - blue2)^2)
比平均水平更好的一步是最接近的平方根:
((delta red)^2 + (delta green)^2 + (delta blue)^2)^0.5
这将最小化3D颜色空间中的距离。
由于根是严格递增的,因此您可以搜索平方的最大值。如何在SQL中表达这一点取决于您使用的关系数据库管理系统(RDBMS)。
像这样计算平均值和距离:
(r + g + b) / 3 = average
(r - average) + (g - average) + (b - average) = distance
这应该能让你对最接近的值有一个很好的了解。