"Standard" RGB to Grayscale Conversion

algorithm, file-conversion, image, jpeg, pgm

Solution

The problem is that I can't understand how the "official" JPG->PGM convertitors work in terms of what value to assign to the final pixel (i guess, 0->255) starting from the classic RGB format.

There is likely a gamma adjustment in the conversion those "official" tools are using. That is, it is not just a linear transform.

See this Wikipedia section for the details: Converting color to grayscale

I believe you want to use the formula for `Csrgb`. Try it out and see if it matches the results you're expecting.

Basically, you'll do this:

- Take `R, G, B` color (each in `[0,1]` range)

- If they're in the range `0..255` instead, simply divide by `255.0`

- Compute `Clinear = 0.2126 R + 0.7152 G + 0.0722 B`

- This is likely the linear transform you were applying before

- Compute `Csrgb` according to it's formula, based on `Clinear`

- This is the nonlinear gamma correction piece you were missing

- Check out this WolframAlpha plot

- `Csrgb = 12.92 Clinear` when `Clinear <= 0.0031308`

- `Csrgb = 1.055 Clinear1/2.4 - 0.055` when `Clinear > 0.0031308`

Problem

I'm trying to write a converters algorithm that takes a JPEG image and returns its PGM (Portable Gray Map) version. The problem is that I can't understand how the "official" JPG->PGM convertitors work in terms of what value to assign to the final pixel (i guess, 0->255) starting from the classic RGB format. At the beginning, I used this formula (it's the same used by OpenCV's CV_RGB2GRAY conversion): 0.30*R + 0.59*G + 0.11*B = val I wrote a simple code to test my results: it takes a color image and its PGM version (already converted using GIMP). Then it converts the color image using the previous formula. The goal is to have a grayscale image that is pixel-to-pixel equal to the PGM input. At this point, it does not return the same values. Can you help me?

Original source