了解 NetPBM 的 PNM 非线性 RGB 颜色 space 用于转换为灰度

Understanding NetPBM's PNM nonlinear RGB color space for converting to grayscale

我正在尝试了解如何正确处理 PNM 格式中的 RGB 值,以便不可避免地将它们转换为灰度。

研究主题,似乎如果 RGB 值是非线性的,那么我需要先将它们转换为线性 RGB 颜色 space,应用我的权重,然后将它们转换回相同的颜色非线性颜色 space.

似乎是预期的格式 http://netpbm.sourceforge.net/doc/ppm.html:

In the raster, the sample values are "nonlinear." They are proportional to the intensity of the ITU-R Recommendation BT.709 red, green, and blue in the pixel, adjusted by the BT.709 gamma transfer function.

所以我认为这些值是非线性的,但不是 sRGB。我在 ImageMagick 周围发现了一些线程主题,说他们可以将它们保存为线性 RGB 值。

PNM 指定了一个标准,但 Photoshop 或 GIMP 等各种编辑器可能会或可能不会遵循它,我是否正确?

来自http://netpbm.sourceforge.net/doc/pamrecolor.html

When you use this option, the input and output images are not true Netpbm images, because the Netpbm image format specifies a particular color space. Instead, you are using a variation on the format in which the sample values in the raster have different meaning. Many programs that ostensibly use Netpbm images actually use a variation with a different color space. For example, GIMP uses sRGB internally and if you have GIMP generate a Netpbm image file, it really generates a variation of the format that uses sRGB.

我在其他地方看到这个 http://netpbm.sourceforge.net/doc/pgm.html:

Each gray value is a number proportional to the intensity of the pixel, adjusted by the ITU-R Recommendation BT.709 gamma transfer function. (That transfer function specifies a gamma number of 2.2 and has a linear section for small intensities). A value of zero is therefore black. A value of Maxval represents CIE D65 white and the most intense value in the image and any other image to which the image might be compared.

BT.709's range of channel values (16-240) is irrelevant to PGM.

Note that a common variation from the PGM format is to have the gray value be "linear," i.e. as specified above except without the gamma adjustment. pnmgamma takes such a PGM variant as input and produces a true PGM as output.

那里的大多数来源假设他们正在处理线性 RGB 并且只是应用他们的权重并保存,可能不保留亮度。我假设任何投诉渲染器都会假设这些 RGB 值是伽马压缩的......因此在技术上显示与我指定的不同的灰度 "colors"。这个对吗?也许换个方式问,这有关系吗?我知道这是一个有问题的问题,但如果我不能真正判断它是线性的还是非线性的,或者它是如何被压缩或预期被压缩的,那么如果我只是假设图像处理算法(二值化)会受到很大影响线性 RGB 值?

只有一种方法可以将彩色信号转换为灰度:转到线性 space 并添加光(以及颜色强度)。这样你就有了有效光,所以你可以计算出亮度。然后你可以"gamma"更正这个值。这是光的行为方式(线性 space),以及 CIE(按波长)测量亮度的方式。

在电视上,从 non-linear R、G、B 构建亮度然后是黑白图像是标准的。这样做是因为简单性和模拟彩色电视(NTSC 和 PAL)的工作方式:黑白信号(对于 BW 电视)作为主要信号,然后将颜色(作为副载波)添加到 BW 图像。因此,计算是在非线性 space.

中完成的

视频可以经常使用这样的因素(在 non-linear space),因为它计算起来非常快,而且你可以很容易地用整数来计算(有特殊的矩阵用于整数).

对于边缘检测算法,使用哪种方法并不重要:我们很难检测到具有相似 L 或 Y' 的边缘,因此我们不关心计算机是否有类似问题。

注意:我们的眼睛在检测光强度时是非线性的,并且与旧电视上的荧光粉具有相似的伽玛。出于这个原因,使用伽玛校正值是有用的:它以最佳方式压缩信息(或在 "analog-TV" 过去:它减少感知噪声)。

因此,如果您想要 Y',请使用非线性 R'、G'、B'。但是如果你需要真正的灰度,你需要计算真正的灰度去线性space。 您可能会看到差异,尤其是在 mid-greys 和紫色或黄色上,其中 R、G、B 中的两个几乎相同(并且是三者之间的最大值)。

但是在摄影程序中,有许多不同的算法可以将 RGB 转换为灰度:我们看不到灰度世界,因此不同的权重(可能是非线性的)可以帮助识别图像的某些部分,它是灰度照片的目的(通过去除分散注意力的颜色)。

注意 Rec.709 从未指定要应用的伽玛校正(标准上的 OETF 没有用,我们需要 EOTF,并且出于实际原因,通常一个不是另一个的倒数)。只有在连续的建议下,才最终提供了这些缺失的信息。但是因为很多人说Rec.709,用OETF的倒数作为gamma,这是不正确的。

如何检测:蓝天上的经典黄色太阳,选择相同L的黄色和蓝色。如果你在灰色图像中看到太阳,你正在用non-linear space进行变换(Y'是不相等)。如果看不到太阳,则线性变换。

我的问题可能有些混乱,所以我现在已经对情况进行了更深入的研究,现在想回答这个问题。

长话短说...似乎在保存为 PNM 格式 时,没有人真正关心 re-encode 图像的伽玛。因此,由于几乎所有内容都是 sRGB,因此根据规范,它将保持 sRGB 而不是技术上正确的 BT.709。

我联系了 NetPBM 的 Bryan Henderson。他持有相同的信念,并表示 伽玛压缩方法并不像知道是否应用它那么重要,我们应该始终假设在使用 PNM 颜色格式时应用了它 .

要重申该观点对图像处理的影响,请阅读 "Color-to-Grayscale: Does the Method Matter in Image Recognition?",Kanan 和 Cottrell ,2012 年。基本上,如果您计算 RGB 值的平均值,您最终会遇到以下三种情况之一:Gleam、Intensity' 或 Intensity。在比较了不同灰度转换公式的效果后,考虑到何时以及如何应用伽玛校正,他发现 Gleam 和 Intensity' 表现最好。它们的区别仅在于添加伽马校正的时间(Gleam 对输入的 RGB 值进行伽马校正,而 Intensity' 采用线性 RGB 并应用伽马后缀)。遗憾的是,当没有添加伽玛校正(即强度)时,您从第一和第二位下降到第八位。有趣的是,简单的均值公式效果最好,而不是大多数人吹捧的更流行的灰度公式之一。所有这些都表明 如果您使用平均公式将 PNM 颜色转换为图像处理应用程序的灰度,您将确保出色的性能,因为我们可以假设已经应用了一些伽玛压缩。我对 ImageMagick 和线性值的评论似乎只适用于他们的 PGM 格式。

希望对您有所帮助!