0

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

研究这个主题,如果 RGB 值是非线性的,那么我需要首先将它们转换为线性 RGB 颜色空间,应用我的权重,然后将它们转换回相同的非线性颜色空间。

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

在栅格中,样本值是“非线性的”。它们与像素中的ITU-R 建议 BT.709红色、绿色和蓝色的强度成正比,并由 BT.709 伽马传递函数进行调整。

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

我是否正确认为 PNM 指定了一个标准,但是像 Photoshop 或 GIMP 这样的各种编辑器可能会也可能不会遵循它?

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

使用此选项时,输入和输出图像不是真正的 Netpbm 图像,因为 Netpbm 图像格式指定了特定的颜色空间。相反,您使用的是格式的变体,其中栅格中的样本值具有不同的含义。许多表面上使用 Netpbm 图像的程序实际上使用具有不同颜色空间的变体。例如,GIMP 在内部使用 sRGB,如果您让 GIMP 生成 Netpbm 图像文件,它实际上会生成使用 sRGB 格式的变体。

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

每个灰度值是一个与像素强度成比例的数字,由 ITU-R 建议 BT.709 伽马传递函数调整。(该传递函数指定 2.2 的伽马数,并且具有小强度的线性部分)。因此,零值是黑色的。Maxval 的值表示 CIE D65 白色和图像中最强烈的值以及该图像可能与之比较的任何其他图像。

BT.709 的通道值范围 (16-240) 与 PGM 无关。

请注意,PGM 格式的一个常见变化是使灰度值为“线性”,即如上所述,除了没有伽马调整之外。pnmgamma 将这样的 PGM 变体作为输入,并产生一个真正的 PGM 作为输出。

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

4

2 回答 2

0

我的问题可能有些混乱,所以在我对情况进行了更深入的研究后,我想回答一下。

长话短说……在保存为 PNM 格式时,似乎没有人真正费心重新编码图像的伽玛。因此,由于几乎所有东西都是 sRGB,因此根据规范,它将保持 sRGB,而不是技术上正确的 BT.709。

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

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

我希望这会有所帮助!

于 2019-06-10T01:04:15.233 回答
0

只有一种将颜色信号转换为灰度的好方法:进入线性空间并添加光(以及颜色强度)。通过这种方式,您可以获得有效光,因此您可以计算亮度。然后您可以“伽玛”校正该值。这是光的行为方式(线性空间),以及 CIE 如何测量亮度(按波长)。

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

视频可以经常使用这样的因素(在非线性空间上),因为它的计算速度非常快,而且你可以用整数轻松完成(有特殊的矩阵可用于整数)。

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

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

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

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

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

如何检测:蓝天上的经典黄色太阳,选择L相同的黄色和蓝色。如果您在灰色图像中看到太阳,您正在与非线性空间变换(Y'不相等)。如果你看不到太阳,你就会线性变换。

于 2019-05-07T16:14:03.420 回答