我尝试生成具有相同感知亮度的RGB颜色。
据说函数R * 0.2126 + G * 0.7152 + B * 0.0722可以计算给定RGB颜色的感知亮度(或等效灰度颜色)。
假设我们对所有RGB值使用区间[0,1],我们可以计算以下内容:
因此,为了使黄色调与蓝色调一样暗淡,我可以简单地为每个RGB分量执行黄色的简单计算:
然而,当做相反的事情时,因此"缩放"将蓝色上升到与原始黄色相同的感知亮度,B分量明显超过1,无法在计算机屏幕上显示。
我猜多余的B组件缺失的亮度可能是"重新分配"对于R和G组件,伪造更亮的蓝色。那么计算最终RGB值的最佳通用方法是什么?
答案 0 :(得分:1)
答案 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的亮度。
下面是一些值的图表,在您的示例中进行了扩展:
因此,要回答您的其余问题,要获得比显示器高的亮度以匹配亮度的蓝色,就需要对其进行去饱和处理,并添加R和G以增加亮度。
在此图表中,我们具有完全饱和的但较深的红色和绿色以匹配7%的蓝色亮度,然后我们具有18%的亮度(例如在18%的灰卡中),在这里我们必须将蓝色降低饱和度以达到调高亮度。
首先,需要线性化sRGB分量,然后如果需要确定亮度,则应用系数。如果您想出一些值对线性化的组件进行数学运算,则需要重新进行伽玛编码才能返回到sRGB。
我已经讨论了其他几个答案,such as this here.