Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 将RGB转换为灰度/强度_Image Processing_Colors_Computer Vision_Language Agnostic_Rgb - Fatal编程技术网

Image processing 将RGB转换为灰度/强度

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转换为灰度时,据说应该应用通道R、G和B的特定权重。这些权重分别为:0.2989、0.5870、0.1140

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

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


另请参见前面的问题:和。

以下是关于这些数字(或类似数字)是如何推导出来的:


有关这方面的信息,请查看。这些值来自我们在显示器中使用的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值编程。如果你想让你的应用程序物有所值,那么将“真实世界”的值应用到这些计算中是非常重要的。许多程序员可能不在乎并计算出“错误”的灰度图片,但我在乎。我同意这是编码相关的——显然是一个整数