我喜欢在颜色的“丰富多彩”的0-1之间创建一个比例,用多彩的我的意思是:
我尝试将颜色转换为HSV颜色空间并将比率计算为:
ratio = (color.value / 100) * (color.saturation / 100)
这有些作用,但感觉曲线是错误的,例如
HSV(hue=0, saturation=80, value=80)
仅提供 0.64 的比率,但看起来非常接近完全饱和/发光的颜色。
也许我需要以某种方式在价值观上创造“缓和”?我考虑过考虑人类对颜色的感知(使用LAB或YUV颜色空间),但我不认为这里需要,但我可能错了。
答案 0 :(得分:4)
HSV饱和度的定义并不是您想要的,因为它不能补偿颜色的亮度。
来自the Wikipedia article on Colorfulness:
[感知饱和度]是纯色彩在总色感中的比例。
其中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的色彩。