将RGB转换为灰度/强度
computer-vision
image-processing
language-agnostic
25
0

从RGB转换为灰度时,据说应该对通道R,G和B应用特定的权重。这些权重是:0.2989、0.5870、0.1140。

据说其原因是人类对这三种颜色的感知/敏感性不同。有时也有人说这些是用于计算NTSC信号的值。

但是,我在网上找不到很好的参考资料。这些值的来源是什么?

另请参阅以下先前的问题: 在这里这里

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

问题中的特定编号来自CCIR 601(请参阅下面的Wikipedia链接)。

如果您使用稍有不同的数字/不同的方法转换RGB->灰度,则在正常照明条件下,在普通计算机屏幕上根本看不到太大差异,请尝试一下。

一般而言,以下是一些有关颜色的链接:

维基百科Luma

布鲁斯·林德布洛姆Bruce Lindbloom )的出色网站

Colin Ware在书中第4章“颜色”,“信息可视化”,isbn 1-55860-819-2;在books.google.com中与Ware的长链接可能有效

cambridgeincolor :出色的,写得很好的“关于如何使用注重视觉而非过程的视觉导向方法来获取,解释和处理数码照片的教程”

如果您遇到的是“线性” RGB与“非线性” RGB,这是我对此的旧注释的一部分。重复一遍,在实践中您不会发现太大的区别。


RGB-> ^ gamma-> Y-> L *

在色彩科学中,常见的RGB值(如html rgb(10%,20%,30%))称为“非线性”或经过Gamma校正的 。 “线性”值定义为

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

其中,对于许多PC,伽玛为2.2。通常的RGB有时写为R'G'B'(R'= Rlin ^(1 / gamma))(纯粹单击舌头),但在这里我将删除'。

CRT显示器上的亮度与RGBlin = RGB ^ gamma成正比,因此CRT上50%的灰度非常暗:.5 ^ 2.2 =最大亮度的22%。 (LCD显示更为复杂;此外,某些图形卡可补偿伽玛。)

要从RGB获得称为L*的亮度度量,首先将RGB除以255,然后计算

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

在XYZ颜色空间中为Y ;它是颜色“亮度”的量度。 (实际公式并非完全是x ^ gamma,而是近似值;请坚持使用x ^ gamma作为第一遍。)

最后,

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

“ ...渴望感知统一性,并且与人类对亮度的感知紧密匹配。” - 维基百科实验室色彩空间

收藏
评论

这是一篇关于这些数字(或类似数字)如何得出的论文:

https://web.archive.org/web/20160303201512/http://www.cis.rit.edu/mcsl/research/broadbent/CIE1931_RGB.pdf

收藏
评论

这些值的来源是什么?

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

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

sRGB(和Rec709)的线性光3光谱权重为:

R lin * 0.2126 + G lin * 0.7152 + B lin * 0.0722 = Y

这些特定于sRGB和Rec709色彩空间,旨在代表计算机监视器(sRGB)或HDTV监视器(Rec709),并在ITU文档中针对Rec709BT.2380-2(10/2018)进行了详细说明

脚注 (1)视锥细胞是眼睛视网膜的颜色检测细胞。
(2)然而,所选的三刺激波长不在每个锥体类型的“峰值”处-而是选择三刺激值,以使它们对特定的锥体类型的刺激远大于另一种刺激类型,即刺激的分离。
(3)在应用系数之前,您需要线性化sRGB值。我在这里另一个答案中对此进行讨论

收藏
评论

这是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
        }
收藏
评论

我发现该出版物引用了对先前类似问题的回答。这非常有帮助:

http://cadik.posvete.cz/color_to_gray_evaluation/

它显示了“大量”的不同方法来生成具有不同结果的灰度图像!

收藏
评论

请查看颜色常见问题解答以获取有关此信息。这些值来自我们在显示器中使用的RGB值的标准化。实际上,根据色彩常见问题解答,您使用的值已过时,因为它们是原始NTSC标准而非现代显示器所使用的值。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号