【问题标题】:Calculating how "colorful" a color is计算颜色有多“多彩”
【发布时间】:2016-01-05 21:01:05
【问题描述】:

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

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

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

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

这有点工作,但感觉曲线是错误的,例如一个

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

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

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

【问题讨论】:

  • 尝试应用伽马校正并重试。

标签: math colors


【解决方案1】:

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

来自the Wikipedia article on Colorfulness

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 2022-12-06
      相关资源
      最近更新 更多