如何计算具有相同感知亮度的RGB值

时间:2017-02-11 15:40:22

标签: math colors language-agnostic rgb

我尝试生成具有相同感知亮度的RGB颜色。

据说函数R * 0.2126 + G * 0.7152 + B * 0.0722可以计算给定RGB颜色的感知亮度(或等效灰度颜色)。

假设我们对所有RGB值使用区间[0,1],我们可以计算以下内容:

  • 黄色= RGB(1,1,0)=>亮度= 0.9278
  • blue = RGB(0,0,1)=>亮度= 0.0722

因此,为了使黄色调与蓝色调一样暗淡,我可以简单地为每个RGB分量执行黄色的简单计算:

  • dim_yellow =黄色* 0.0722 / 0.9278

然而,当做相反的事情时,因此"缩放"将蓝色上升到与原始黄色相同的感知亮度,B分量明显超过1,无法在计算机屏幕上显示。

我猜多余的B组件缺失的亮度可能是"重新分配"对于R和G组件,伪造更亮的蓝色。那么计算最终RGB值的最佳通用方法是什么?

2 个答案:

答案 0 :(得分:1)

我建议您使用HSV颜色模型而不是RGB,因为您可以轻松地实现仅修改“值(亮度)”组件的内容。 维基页面还包含如何将RGB转换为HSV并返回

编辑: 尝试使用CIELAB颜色空间,因为它接近人类的视觉

答案 1 :(得分:0)

这些不是您要寻找的东西

  

据说函数R * 0.2126 + G * 0.7152 + B * 0.0722用于计算给定RGB颜色的感知亮度(或等效的灰度色)。

否,这是不正确的,或者至少是不完整的。是的,R * 0.2126 + G * 0.7152 + B * 0.0722是光谱系数,但这还不是全部。

首先,在此情况下不要使用术语“亮度”。亮度不是光的量度,而是一种感知力,而不是可测量的量。当我们谈论光线和比色法时,请使用术语“亮度”(L或Y)。亮度是光线的线性度量,而不是感知。

CIELAB的

感知亮度或L *(Lstar)是基于人类对亮度变化的感知。它接近于约0.43的幂曲线。

sRGB是通常用于计算机显示器和Web的色彩空间,它不像光一样呈线性,并且也不完全像感知L *曲线一样。 sRGB的传输曲线接近1 / 2.2幂曲线。也就是说,将sRGB数据/信号提高到0.455的幂,然后监视器施加2.2的幂。

发生了什么事

您的数学没用,因为您没有考虑传输曲线。您必须在应用系数之前线性化sRGB值。那么这些总和将等于1的亮度。

sFF中的#FFFF00亮度等于0.9278,但这是sRGB值为96.76%或L *值为97.14%

s0000中的#0000FF亮度等于0.0722,但这是sRGB值29.79%或L *值32.3%

下面是一些值的图表,在您的示例中进行了扩展:

SRGB VS LUMINANCE VALUES

因此,要回答您的其余问题,要获得比显示器高的亮度以匹配亮度的蓝色,就需要对其进行去饱和处理,并添加R和G以增加亮度。

在此图表中,我们具有完全饱和的但较深的红色和绿色以匹配7%的蓝色亮度,然后我们具有18%的亮度(例如在18%的灰卡中),在这里我们必须将蓝色降低饱和度以达到调高亮度。

如何计算

首先,需要线性化sRGB分量,然后如果需要确定亮度,则应用系数。如果您想出一些值对线性化的组件进行数学运算,则需要重新进行伽玛编码才能返回到sRGB。

我已经讨论了其他几个答案,such as this here.