【问题标题】:Why does greyscale work the way it does?为什么灰度会这样工作?
【发布时间】:2011-03-15 12:33:45
【问题描述】:

我原来的问题

我读到将 RGB 像素转换为灰度 RGB,应该使用

r_new = g_new = b_new = r_old * 0.3 + g_old * 0.59 + b_old * 0.11

我还阅读并理解,g 具有更高的权重,因为人眼对绿色更敏感。实现这一点后,我看到的结果与在 Gimp 等图像编辑器中将图像设置为“灰度”得到的结果相同。

在阅读本文之前,我设想要将像素转换为灰度,将其转换为 HSL 或 HSV,然后将饱和度设置为零(因此,移除所有颜色)。然而,当我这样做时,我得到了一个完全不同的图像输出,即使它也缺乏颜色。

s = 0 与我阅读的“正确”方式有何不同,为什么它“不正确”?

基于答案和其他研究的持续发现

似乎使用哪些亮度系数是一些争论的主题。各种组合和转灰度算法有不同的结果。以下是一些在电视标准等领域使用的预设:

  • ITU-R BT.601 (NTSC?) 定义的系数为0.299r + 0.587g + 0.114b
  • ITU-R BT.709(更新)定义的系数为0.2126r + 0.7152g + 0.0722b
  • 三分之二的系数(1/3)(rgb) 等价于s = 0

scientific article 详细介绍了各种灰度技术及其对各种图像的结果,以及对 119 人的主观调查。

但是,当将图像转换为灰度时,为了获得“最佳”艺术效果,几乎可以肯定不会使用这些预定义系数,而是调整每个通道的贡献以产生特定图像的最佳输出。

【问题讨论】:

  • 这不是一个真正的编程问题,但我不确定它属于哪个站点......这确实是一个艺术或科学问题。
  • 这可能是真的,但我是在编写一个进行灰度转换的函数的上下文中问这个问题的。

标签: colors rgb hsl hsv


【解决方案1】:

尽管存在这些变换系数,但没有什么可以约束您使用它们。只要每个像素的总强度不变,每个通道的贡献可以是任何值,范围从 0 到 100%。

将图像转换为灰度的摄影师使用通道混合器来调整每个通道的电平(RGB 或 CMYK)。在您的图像中,有许多红色和绿色,因此可能需要(取决于您的意图)使这些通道在灰度强度中的表现比蓝色更高。

这就是图像的“科学”转换与波段的“艺术”组合的区别。

另一个考虑因素是每个波段中值的动态范围,并试图将它们保留在灰度图像中。例如,增强阴影和/或高光可能需要增加蓝色波段的贡献。

【讨论】:

    【解决方案2】:

    关于这个主题的有趣文章在这里....“因为人眼不能检测亮度与颜色的线性关系”。

    http://www.scantips.com/lumin.html

    【讨论】:

    • 好的,具体回答刚才的问题,错了,因为:s=0版本的灰度之间的亮度与原图颜色之间的亮度不匹配。这通过花中心的茎(雄蕊?如果我记得三年级的话)明显地表现出来,在 s=0 版本中没有那么明显。
    • 这是给定系数的原始推导:cis.rit.edu/mcsl/research/broadbent/CIE1931_RGB.pdf
    • 另一篇利用 s=0 方法的好文章,试图制作一个在转换为灰度时完全褪色的图像:realtimerendering.com/blog/constant-luma-palette
    【解决方案3】:

    看起来这些系数来自旧的 CRT 技术,并不能很好地适应今天的显示器,来自Color FAQ

    系数 0.299、0.587 和 0.114 正确计算的具有荧光粉的显示器的亮度 当代的引入 1953 年的 NTSC 电视。他们是 仍然适用于计算视频 luma 将在下面的部分中讨论 11. 然而,这些系数不能准确计算亮度 现代显示器。

    但是,找不到正确的转换系数。

    另见RGB to monochrome conversion

    【讨论】:

      【解决方案4】:

      在 HSL/HSV 中使用 s = 0 并转换为 RGB 会得到 R = G = B,因此与使用 r_old * 1/3 + g_old * 1/3 + b_old * 1/3 相同。

      要了解原因,请查看描述转换 HSV->RGB 的 Wikipedia page。饱和度 s 将为 0,因此 CX 也将是。您最终会得到R_1,G_1,B_1(0,0,0),然后将m 添加到最终的RGB 值中,从而得到(m,m,m) = (V,V,V)。 HSL 也一样,结果将是 (m,m,m) = (L,L,L)。

      编辑:好的,只是发现上面不是完整的答案,尽管这是一个很好的起点。 RGB 值将完全相同,LV,但仍取决于最初计算 LV 的方式,再次参见 Wikipedia。似乎您用于转换的程序/公式使用了1/3 * R + 1/3 * G + 1/3 * B 解决方案或其他两个解决方案之一(hexcone/bi-hexcone)。

      所以毕竟,使用 HSL/HSV 只是意味着您必须决定更早使用哪个公式,稍后转换为 RGB 灰度值只是隔离最后一个组件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-04
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        相关资源
        最近更新 更多