在一定色彩范围内找到最接近的颜色匹配

4
我有十个十六进制/RGB颜色值(它们是肤色调)——我想能够找到与特定十六进制/RGB值最接近的匹配项。
我应该如何从起始颜色开始迭代,直到我落在特定范围内?但是如何组织这些范围?
老实说,我完全不知道如何做,或者要搜索什么,因此任何帮助或指引都将不胜感激。
干杯

1
https://dev59.com/5GYq5IYBdhLWcg3wcgLq - ka_lin
1
这是用于计算两种其他颜色的平均颜色。这对我有什么帮助? - ojsglobal
3个回答

3

虽然在RGB空间中使用欧几里得距离可能有所帮助,但更好的选择是使用正确的颜色模型。我建议使用LCH或至少HSL。然后为每个通道分配权重。例如,对于人眼来说,亮度是以对数刻度感知的。减小其影响可能会得到更好的匹配结果。因此,以下情况将不会发生:

#400(非常暗的红色)与#222(接近黑灰色,距离12)匹配,而不是#800(暗红色,距离16)


实际上,当我使用欧几里得公式时,我得到了很多不正确的匹配。@cem-kalyoncu,你是否知道在哪里可以找到更好的公式? - gmoz22
使用HSL颜色系统并为通道分配乘数。对于H,使用更高的值。如果您想要更好的结果,请选择LCH颜色系统。公式广泛可用。 - Cem Kalyoncu
我觉得这很有趣。你能否提供一个JavaScript的示例吗?我找到了chroma.js,但其中的科学原理超出了我的理解范围。最近有一个关于颜色检测的问题,我觉得非常有趣,但我只提供了一个非常有限的答案。也许你可以在那里提供一些启发?;) - customcommander
转换并不是很难,它涉及到很多乘法。这里有一个经过测试的公式供您使用:https://en.wikipedia.org/wiki/Color_difference#CIELAB_%CE%94E* - Cem Kalyoncu

2

首先,这不一定是一个编程问题,但...

欧几里得距离是一个很好的方法。例如:

使用常规的html颜色名称,BlueViolet(#8A2BE2)和GoldenRod(#DAA520),哪个更接近LightSeaGreen(#20B2AA)?将3个十六进制值拆分为3D向量,如下所示:

BV = 138,43,226
GR = 218,165,32
LSG = 32,178,170

使用公式:
d(p,q) = sqrt((px - qx)^2 + (py - qy)^2 + (pz - qz)^2)

d(BV,LSG) = sqrt((138-32)^2 + (43-178)^2 + (226-170)^2)
d(BV,LSG) = sqrt(11236 + 18225 + 3136)
d(BV,LSG) = sqrt(32597)
d(BV,LSG) = 180.546

d(GR,LSG) = sqrt((218-32)^2 + (165-178)^2 + (32-170)^2)
d(GR,LSG) = sqrt(34596 + 169 + 19044)
d(GR,LSG) = sqrt(53809)
d(GR,LSG) = 231.967

正如您所看到的,d(BV,LSG)d(GR,LSG)小,因此BlueViolet比GoldenRod更接近LightSeaGreen。


0
我可以建议您使用两种颜色之间的欧几里得距离。如果您有任何两种颜色,例如#89a839和#ad9009,则可以将其转换为三维向量,并且您将获得这两个向量(ad,90,09)和(89,a8,39); 然后将数字转换为十进制范围。并计算这两个点之间的欧几里得距离。
d = sqrt((x1-x2)^2,(y1-y2)^2,(z1-z2)^2,)

只需计算您的颜色与所有颜色之间的距离,并找到最小值,那么您的颜色将最接近特定颜色。

如果您在编码时遇到任何问题,请随时提问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接