RGB 转为灰度值的心理学公式 Gray = 0.30 * R + 0.59 * G + 0.11 * B 是怎么来的?

如题,这个公式最早是谁提的,另外效果跟RGB中max-min除以2有什么区别?
关注者
191
被浏览
10,614

4 个回答

因为人眼对RGB颜色的感知并不相同,所以转换的时候需要给予不同的权重。事实上这个原理普遍应用于计算机图像处理系统,比方说DXT压缩的时候,会给予G通道多一个比特,R:G:B为5:6:5。

另外需要指出的是,这个公式适用于sRGB空间的图像。基本上Photoshop等软件默认都是使用sRGB空间存储图像。另外没有记错的话,Windows操作系统也使用这个公式进行转换。
Y' = 0.299 R' + 0.587 G' + 0.114 B'
如果是线性空间的图像,则需要使用这个公式。
Y' = 0.2126 R' + 0.7152 G' + 0.0722 B'
具体参看这个Wiki页面:
Grayscale
怎么来的其他人回答了,我主要说一下有什么差别。

这里用了一张我在果壳日志 Excel 实现黑体辐射光谱中所写的方法得到的一张光谱图作为参考图片
【题外话先说一下这张图是怎么来的:首先根据黑体辐射公式得到能量分布,乘上系数得到在 CIEXYZ 色彩空间的 XYZ 值,然后再转换到 sRGB 色彩空间。】
问题中所说的这个 Gray = 0.30 * R + 0.59 * G + 0.11 * B 应该就是 XYZ 色彩空间中的 Y 值,下面是各种灰度计算方法的差别:
最后那个 L* 是 CIELAB 色彩空间中表示亮度的分量。
Lab颜色被设计来接近人类视觉。它致力于感知均匀性,它的L分量密切匹配人类亮度感知。
不像 RGB,CMYK 空间都小于人类视觉色域,Lab空间内的很多「颜色」超出了人类视觉的视域,纯粹是假想的,这些「颜色」不能在物理世界中再生。

由图可见,第一种算法在纯色部分较暗,混合色部分较亮;而第二种正好相反。
相比之下四种算法中,L* 似乎是最好的。各种色彩空间的转换参见 Bruce Lindbloom's Web Site 上的 Math 部分。

Update:发现之前的一个错误,由 RGB 到 L*a*b* 必须经过 XYZ,图中的 L* 是由中间过程中的 XYZ 值来计算的,而不是将最后的 RGB 再转成 XYZ 来计算的,由于 XYZ 转 RGB 时有损失,所以最后的 L* 应该有差异。