将 RGB 转换为灰度/强度

在从 RGB 到灰度的转换过程中,通道 R、 G 和 B 的特定权值应该被应用。这些权重是: 0.2989,0.5870,0.1140。

据说这是因为人类对这三种颜色的感知不同。有时也说这些是用来计算 NTSC 信号的值。

然而,我没有在网上找到一个很好的参考,这些价值观的来源是什么?

请参阅以下问题: 给你给你

216526 次浏览

查看 颜色常见问题了解这方面的信息。这些值来自于我们在显示器中使用的 RGB 值的标准化。实际上,根据颜色常见问题解答,您正在使用的值是过时的,因为它们是用于原始 NTSC 标准的值,而不是现代监视器。

问题中的具体数字来自 CCIR601(见 维基百科文章)。

如果你用稍微不同的数字/不同的方法转换 RGB-> 灰度, 你在普通的电脑屏幕上看不出有什么不同 在正常光照条件下,试试看。

以下是一些关于颜色的链接:

维基百科 卢玛

布鲁斯 · 林德布鲁姆的杰出网站

第四章《科林 · 威尔书中的色彩》 ,“信息可视化”,isbn 1-55860-819-2; 连接到 Books.google.com中的 Ware 的长链接 可能有用,也可能没用

剑桥彩色: 很好,写得很好 ”如何获取,解释和处理数码照片的教程 使用以视觉为导向的方法,强调概念而非程序

如果遇到“线性”和“非线性”RGB, 这是我写给自己的一张旧纸条的一部分。 重复一遍,实际上你看不出有什么不同。


# # # RGB-> ^ γ-> Y-> L *

在颜色科学中,常见的 RGB 值,如 html RGB (10% ,20% ,30%) , 被称为“非线性”或 伽马校正。 “线性”值定义为

Rlin = R^gamma,  Glin = G^gamma,  Blin = B^gamma

对于许多个人电脑伽马是2.2。 通常的 R G B 有时被写成 R’G’B’(R’= Rlin ^ (1/γ)) (纯粹主义者舌头点击)但在这里,我会去掉’。

CRT 显示器的亮度与 RGBlin = RGB ^ γ 成正比, 所以 CRT 上50% 的灰度是相当暗的: .5 ^ 2.2 = 最大亮度的22% 。 (液晶显示器更复杂; 此外,一些显卡可以补偿伽马值。)

为了从 RGB 中获得称为 L*的亮度测量值, 首先将 R G B 除以255,然后计算

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

这是 XYZ 颜色空间中的 Y,它是颜色“亮度”的度量。 (真正的公式不完全是 x ^ γ,而是相近的; 首次使用 x ^ γ。)

终于,

L* = 116 * Y ^ 1/3 - 16

“ ... ... 渴望感知上的一致性[并]与人类对轻盈的感知非常吻合。”—— Wikipedia < a href = “ http://en.Wikipedia.org/wiki/Lab _ color _ space”rel = “ noReferrer”> Lab 色彩空间

下面是一些用 c 编写的代码,它们可以将 rgb 转换成灰度。 用于 rgb 到灰度转换的实际权重为0.3 R + 0.6 G + 0.11 B。 这些重量不是绝对重要的,所以你可以玩它们。 我把它们设计成0.25 R + 0.5 G + 0.25 B,这样会产生一个稍微暗一点的图像。

注意: 下面的代码采用 xRGB 32位像素格式

unsigned int *pntrBWImage=(unsigned int*)..data pointer..;  //assumes 4*width*height bytes with 32 bits i.e. 4 bytes per pixel
unsigned int fourBytes;
unsigned char r,g,b;
for (int index=0;index<width*height;index++)
{
fourBytes=pntrBWImage[index];//caches 4 bytes at a time
r=(fourBytes>>16);
g=(fourBytes>>8);
b=fourBytes;


I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results
//I_Out[index]=((unsigned int)(r+g+b))/3;     //This runs in 0.0011s on my pc and produces a pure average
}

这些价值观因人而异,特别是对于色盲的人。

这一切真的有必要吗? 人类的感知和 CRT 与 LCD 的对比会有所不同,但 RG-B 的强度不会有所不同。为什么不把 L = (R + G + B)/3和新的 RGB 设置为 L,L,L?

这些价值观的来源是什么?

张贴的系数的“来源”是 NTSC 规范,可以在 Rec601电视的特点中看到。

“终极来源”是 CIE 大约1931年关于人类颜色感知的实验。人类视觉的光谱响应是不均匀的。实验导致了基于知觉的三刺激值的权重。我们的 L,M 和 S 锥体 1对我们识别为“红色”,“绿色”和“蓝色”(分别)的光波长敏感,这是三刺激原色的来源

SRGB (和 Rec709)的线性 light3光谱权重如下:

RLin.0.2126 + GLin.0.7152 + BLin.0.0722 = Y

这些是特定于 sRGB 和 Rec709色彩空间的,这些色彩空间用于表示计算机监视器(sRGB)或 HDTV 监视器(Rec709) ,并且在 Rec709BT.2380-2(10/2018)的 ITU 文档中有详细说明

脚注 (1)视锥细胞是眼睛视网膜的颜色检测细胞。
(2)然而,所选择的三刺激波长并不在每个锥形类型的“峰值”上-相反,所选择的三刺激值使得它们对特定锥形类型的刺激大大超过另一种,即刺激的分离。
(3)在应用系数之前,你需要线性化你的 sRGB 值,我在这里的另一个答案中讨论这个问题。

开始一个列表,列举不同的软件包是如何做到这一点的。

免费图片

#define LUMA_REC709(r, g, b)    (0.2126F * r + 0.7152F * g + 0.0722F * b)
#define GREY(r, g, b) (BYTE)(LUMA_REC709(r, g, b) + 0.5F)

OpenCV

NVidia 性能原型

英特尔性能指标

Matlab

nGray =  0.299F * R + 0.587F * G + 0.114F * B;