"标准"RGB到灰度转换

The*_*ted 14 algorithm jpeg image file-conversion pgm

我正在尝试编写一个转换器算法,该算法采用JPEG图像并返回其PGM(便携式灰度图)版本.问题是我无法理解"官方"JPG-> PGM转换器如何根据从经典RGB格式开始分配给最终像素(我猜,0-> 255)的值来工作.

一开始,我使用了这个公式(它与OpenCV的CV_RGB2GRAY转换使用的公式相同):

0.30*R + 0.59*G + 0.11*B = val

我写了一个简单的代码来测试我的结果:它采用彩色图像及其PGM版本(已使用GIMP转换).然后它使用前面的公式转换彩色图像.目标是使像素到像素的灰度图像等于PGM输入.

此时,它不会返回相同的值.你能帮助我吗?

Tim*_*lds 18

问题是我无法理解"官方"JPG-> PGM转换器如何根据从经典RGB格式开始分配给最终像素(我猜,0-> 255)的值来工作.

这些"官方"工具正在使用的转换中可能存在伽玛调整.
也就是说,它不仅仅是线性变换.

有关详细信息,请参阅此维基百科部分:将颜色转换为灰度

我相信你想用这个公式.试一试,看看它是否与您期望的结果相符.Csrgb

基本上,你会这样做:

  1. R, G, B颜色(每个[0,1]范围内)
    • 如果他们在范围内0..255,只需分开255.0
  2. 计算 Clinear = 0.2126 R + 0.7152 G + 0.0722 B
    • 这可能是您之前应用的线性变换
  3. 计算根据它的公式,根据CsrgbClinear
    • 这是您缺少的非线性伽玛校正件
    • 查看这个WolframAlpha图
    • Csrgb = 12.92 Clinear 什么时候 Clinear <= 0.0031308
    • Csrgb = 1.055 Clinear1/2.4 - 0.055 什么时候 Clinear > 0.0031308

  • Timothy,如果我错了,请纠正我,但我认为在步骤 (1) 之后,您必须将这些值转换为线性强度,因为当您从文件中获取 RGB 值时,它们已经使用幂 1/2.4 进行了伽玛编码。因此,首先您需要通过应用幂 2.4 的变换来删除此编码,然后才执行答案的步骤 (2) 和 (3)。是对的吗? (2认同)