计算颜色的“多彩”程度

时间:2016-01-05 21:01:05

标签: math colors

我喜欢在颜色的“丰富多彩”的0-1之间创建一个比例,用多彩的我的意思是:

  • 黑色的比例为0(无光)
  • 白色的比率为0(无饱和度)
  • 完全饱和/发光颜色的比率为1

我尝试将颜色转换为HSV颜色空间并将比率计算为:

ratio = (color.value / 100) * (color.saturation / 100)

这有些作用,但感觉曲线是错误的,例如

HSV(hue=0, saturation=80, value=80)

enter image description here

仅提供 0.64 的比率,但看起来非常接近完全饱和/发光的颜色。

也许我需要以某种方式在价值观上创造“缓和”?我考虑过考虑人类对颜色的感知(使用LAB或YUV颜色空间),但我不认为这里需要,但我可能错了。

2 个答案:

答案 0 :(得分:4)

HSV饱和度的定义并不是您想要的,因为它不能补偿颜色的亮度。

来自the Wikipedia article on Colorfulness

  

[感知饱和度]是纯色彩在总色感中的比例。

     

Formula for perceived saturation

     

其中S ab 是饱和度,L *是亮度,C * ab 是颜色的色度。

此定义使用CIELAB colorspace的L *和C * ab 组件。我的猜测是,对于您的应用程序,您可以使用Lab色彩空间。然后你的代码看起来像这样:

function perceived_saturation(L, a, b)
    return 100 * sqrt(a*a + b*b) / sqrt(L*L + a*a + b*b)

对于您的示例颜色RGB =(204,41,41),当通过路径RGB→sRGB→Lab转换颜色时,会返回约86%的感知饱和度。

答案 1 :(得分:1)

作为简单的近似,您可以使用max(r,g,b)/255 - min(r,g,b)/255。它具有您所寻找的属性,黑色和白色之间的灰色光谱上的任何颜色都具有0的色彩,并且只有完全亮起的颜色将具有1的色彩。完全饱和但暗色将介于两者之间,例如, (128,0,0)将具有~0.5的色彩。