Colors 计算两个HSI颜色值之间的颜色明显差异

Colors 计算两个HSI颜色值之间的颜色明显差异,colors,rgb,hsv,hsl,Colors,Rgb,Hsv,Hsl,我有两个HSI颜色值(色调饱和度和强度),我想要一个数字,代表两种颜色之间的视觉差异。色调是一个介于0和360(含0和360)之间的数字。饱和度为0:1,强度为0:1 让我们考虑例如红色和蓝色,饱和度为100%,强度为100%。 红色是: hsv 0、100%、100% 蓝色是: hsv 240、100%、100% 显然,这是两种非常不同的颜色,因此我可以尝试计算颜色之间的差异的一种简单方法是使用色调分量,计算色调的绝对差异,即120(360-240),因为360在色调上也等于0 问题出现在

我有两个HSI颜色值(色调饱和度和强度),我想要一个数字,代表两种颜色之间的视觉差异。色调是一个介于0和360(含0和360)之间的数字。饱和度为0:1,强度为0:1

让我们考虑例如红色和蓝色,饱和度为100%,强度为100%。

红色是: hsv 0、100%、100%

蓝色是: hsv 240、100%、100%

显然,这是两种非常不同的颜色,因此我可以尝试计算颜色之间的差异的一种简单方法是使用色调分量,计算色调的绝对差异,即120(360-240),因为360在色调上也等于0

问题出现在饱和或强度很暗或很暗的情况下,考虑非常暗的红色和蓝色。 深红色是: hsv 0、100%、20%

深蓝色是: hsv 240,100%20%

很明显,这两种颜色之间的视觉差异小于明亮的红色和蓝色,这是一个人在被要求比较差异时会说的。我这里的意思是,问一个朋友“哪一对颜色最不一样?”他们很可能会说上面的亮红色和蓝色

我试图计算两种颜色之间的差异,就像人类会注意到的那样。如果一个人看两种颜色a和b,然后看两种颜色c和d,他会注意到哪一种是最不同的。首先,如果颜色是明亮的(但不是太亮),那么差异是基于色调的。如果颜色太亮(如白色)或太暗(如黑色)或太灰,则差异较小


应该可以有一个函数diff,其中x=diff(a,b)和y=diff(c,d)产生x和y,我可以使用x和y来比较差异,找到最不同的颜色或最不不同的颜色。

一般的答案似乎是David van Driessche所说的,使用Delta E。我在这里找到了一些Java代码:


这是问题的答案,可能不是最佳答案。

WCAG2.0和1.0指南都参考了不同的色差感知方程:

  • 对比度(http://www.w3.org/TR/2008/REC-WCAG20-20081211/Overview.html#对比度def)

  • 亮度差异和3。色差()

  • 我尝试了Delta-e方法(http://colormine.org/Delta-e-calculator/),但它是准量测的,因此差异测量可能会根据传递两种颜色的顺序而变化。如果在您的示例中,您希望diff(a,b)始终等于diff(b,a),那么这并不是您想要的(在这个名称下可能有不同的算法不是拟量的,但我在该站点之前没有研究过)

    我认为色差度量最符合我对色差测量的期望。例如,它将产生diff(a,b)>diff(c,d)


    您可以使用此网站上的工具自行测试:

    我怀疑是否有确切的答案。你可以试试RGB颜色空间,看起来区别比较容易。我在谷歌上搜索了一下,找到了一个色差算法,另外,维基百科上有一篇关于色差的文章,一定有很多方法可以解决这个问题。我有印刷/打样的专业背景,传统的计算色差的方法是Delta E。你可以在这里找到一篇维基百科文章:@Phil In RGB->HSI,只有在RGB中有纯白色时才能获得100%的强度。所以你关于红色和蓝色的例子是错误的。现在,到CieLAB查找颜色之间的距离通常被认为是一种更好的方法,但对于您的应用程序来说,在HSI中使用某些度量可能会受到影响。我稍后会给出一个答案,试图说明这一点。我认为这其实不是一个坏答案,因为你试图计算人类的感知,而这也是校对工作流程中发生的事情。当你在做一个证明的时候,你是在试图做一些看起来和预期的最终产品一样的东西。“相同”是由人类判断的,理论上是用这个δE值来测量(或近似)的。顺便说一句,根据你在做什么,注意观察条件。人类在不同的照明条件下看到的颜色非常不同(例如,日光照明和荧光照明)。照明条件可以极大地改变人类的颜色感知(从而改变感知到的色差)。某些颜色在一种照明条件下看起来相同,而在另一种照明条件下看起来不同(如果感兴趣,请搜索“同色异谱”)。