Image processing 将RGB转换为灰度/强度
当从RGB转换为灰度时,据说应该应用通道R、G和B的特定权重。这些权重分别为:0.2989、0.5870、0.1140 据说这是因为人类对这三种颜色的感知/感受不同。有时也有人说这些是用来计算NTSC信号的值 然而,我在网上没有找到一个很好的参考资料。这些价值观的来源是什么Image processing 将RGB转换为灰度/强度,image-processing,colors,computer-vision,language-agnostic,rgb,Image Processing,Colors,Computer Vision,Language Agnostic,Rgb,当从RGB转换为灰度时,据说应该应用通道R、G和B的特定权重。这些权重分别为:0.2989、0.5870、0.1140 据说这是因为人类对这三种颜色的感知/感受不同。有时也有人说这些是用来计算NTSC信号的值 然而,我在网上没有找到一个很好的参考资料。这些价值观的来源是什么 另请参见前面的问题:和。以下是关于这些数字(或类似数字)是如何推导出来的: 有关这方面的信息,请查看。这些值来自我们在显示器中使用的RGB值的标准化。实际上,根据颜色常见问题解答,您使用的值已经过时,因为它们是用于原始NTS
另请参见前面的问题:和。以下是关于这些数字(或类似数字)是如何推导出来的:
有关这方面的信息,请查看。这些值来自我们在显示器中使用的RGB值的标准化。实际上,根据颜色常见问题解答,您使用的值已经过时,因为它们是用于原始NTSC标准的值,而不是用于现代显示器。我发现本出版物在回答之前的类似问题时引用了。这非常有帮助:
它显示了“吨”不同的方法,以产生不同的结果灰度图像 问题中的具体数字来自CCIR 601(见下面的维基百科链接) 如果使用稍微不同的数字/方法转换RGB->grayscale, 在普通的电脑屏幕上,你根本看不出有什么不同 在正常的照明条件下——试试看 以下是有关颜色的更多链接: 维基百科 中国优秀网站 科林·威尔《信息可视化》一书中关于颜色的第4章,isbn 1-55860-819-2; 此链接指向中的Ware 可能有效,也可能无效 : 好极了,写得很好 有关如何获取、解释和处理数码照片的教程 使用以视觉为导向的方法,强调概念而非过程” 如果遇到“线性”与“非线性”RGB, 这是我给自己写的一封旧信的一部分。 重复一遍,在实践中你不会看到太多的不同
RGB->^gamma->Y->L* 在颜色科学中,常见的RGB值,如html RGB(10%,20%,30%), 被称为“非线性”或 . “线性”值定义为:
Rlin = R^gamma, Glin = G^gamma, Blin = B^gamma
其中,对于许多PC,gamma为2.2。
通常的rgb有时写为R'G'B'(R'=Rlin^(1/gamma))
(纯粹主义者的舌头咔嗒一声)但在这里,我要放弃'这个词
CRT显示器上的亮度与RGBlin=RGB^伽马成正比,
所以CRT上50%的灰度相当暗:.5^2.2=最大亮度的22%。
(液晶显示器更复杂;
此外,一些图形卡会补偿gamma。)
要从RGB获取称为L*
的亮度度量,
首先将RGB除以255,然后计算
Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma
这是XYZ颜色空间中的Y
;它是颜色“亮度”的度量。
(实际公式不完全是x^gamma,但很接近;
第一次使用x^gamma。)
最后,
“……渴望感知上的一致性[并]与人类对亮度的感知紧密匹配。”--
维基百科
下面是一些用c语言编写的将rgb转换成灰度的代码。 用于rgb到灰度转换的实际权重为0.3R+0.6G+0.11B。 这些权重不是绝对重要的,所以你可以使用它们。 我已经做了0.25R+0.5G+0.25B。它会生成稍微暗一点的图像 注意:以下代码采用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
}
unsigned int*pntrBWImage=(unsigned int*)…数据指针//假设4*宽*高字节,32位,即每像素4字节
无符号整数四字节;
无符号字符r,g,b;
对于(int指数=0;指数>16);
g=(四字节>>8);
b=四字节;
I_Out[index]=(r>>2)+(g>>1)+(b>>2)//这在我的电脑上以0.00065秒的速度运行,并产生稍暗的结果
//I_Out[index]=((无符号整数)(r+g+b))/3//这在我的电脑上以0.0011秒的速度运行,并产生一个纯平均值
}
这些值因人而异,特别是对于色盲的人。所有这些都是必要的,人类的感知和CRT与LCD会有所不同,但RGB强度不会,为什么不L=(R+G+B)/3
并将新RGB设置为L,L,L
这些价值观的来源是什么
公布系数的“来源”是NTSC规范,可在和中看到
“最终来源”是大约1931年CIE关于人类颜色感知的实验。人类视觉的光谱响应是不均匀的。实验导致了基于感知的三刺激值加权。我们的L、M和S cones1对我们分别识别为“红色”、“绿色”和“蓝色”的波长非常敏感,这就是三刺激原色的来源。2
sRGB(和Rec709)的线性光3光谱权重为:
Rlin*0.2126+Glin*0.7152+Blin*0.0722=Y
这些颜色空间特定于sRGB和Rec709颜色空间,用于表示计算机显示器(sRGB)或HDTV显示器(Rec709),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)
nGray = 0.299F * R + 0.587F * G + 0.114F * B;
#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)
nGray = 0.299F * R + 0.587F * G + 0.114F * B;
#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)
nGray = 0.299F * R + 0.587F * G + 0.114F * B;
#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)
nGray = 0.299F * R + 0.587F * G + 0.114F * B;
#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)
nGray = 0.299F * R + 0.587F * G + 0.114F * B;
是的。我一直在用RGB值编程。如果你想让你的应用程序物有所值,那么将“真实世界”的值应用到这些计算中是非常重要的。许多程序员可能不在乎并计算出“错误”的灰度图片,但我在乎。我同意这是编码相关的——显然是一个整数