Math “如何计算”;“多彩的”;一种颜色是

Math “如何计算”;“多彩的”;一种颜色是,math,colors,Math,Colors,我喜欢创建一个0-1的颜色“多彩”比率,我所说的“多彩”是指: 黑色的比例为0(无灯光) 白色的比例为0(无饱和度) 完全饱和/发光颜色的比率为1 我尝试将颜色转换为HSV颜色空间,并将比率计算为: ratio = (color.value / 100) * (color.saturation / 100) 这在某种程度上是可行的,但感觉曲线是错误的,例如 HSV(色调=0,饱和度=80,值=80) 仅给出0.64的比率,但看起来非常接近完全饱和/发光的颜色 也许我需要创造一个“放松”的

我喜欢创建一个0-1的颜色“多彩”比率,我所说的“多彩”是指:

  • 黑色的比例为0(无灯光)
  • 白色的比例为0(无饱和度)
  • 完全饱和/发光颜色的比率为1
我尝试将颜色转换为HSV颜色空间,并将比率计算为:

ratio = (color.value / 100) * (color.saturation / 100)
这在某种程度上是可行的,但感觉曲线是错误的,例如

HSV(色调=0,饱和度=80,值=80)

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


也许我需要创造一个“放松”的价值观?我也考虑过人类对颜色的感知(使用LAB或YUV颜色空间),但我不认为这是必要的,但我可能错了

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

发件人:

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

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

此定义使用了的L*和C*ab组件。我的猜测是,对于您的应用程序,您可以使用Lab colorspace。那么您的代码将如下所示:

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→转换颜色时,这将返回大约86%的感知饱和度;sRGB→实验室

作为一个简单的近似值,您可以使用
max(r,g,b)/255-min(r,g,b)/255
。它具有您所寻求的属性,在灰色光谱中,介于黑色和白色之间的任何颜色的色度为0,只有完全照亮的颜色的色度为1。完全饱和但较暗的颜色介于两者之间,例如,(128,0,0)的色度为~0.5。

尝试应用gamma校正并重试。