[ Back to main ]
[ Back to colors page ]

Color to Gray Conversion                                        


Occasionally  the need arises to convert an  RGB color  image to
grayscale.  Until I faced this problem,  I naively thought  it a
trivial conversion. It is not at all. My goal was to collect all
the isoluminant colors  from the RGB color space for every level
of gray which is practically a gray conversion of all RGB colors
and a second step grading. I wanted to map the closest and least
distinguishable gray  value to every RGB color.  I explored many
of the existing methods,  I examined the results of many popular
softwares,  and got a headache.  Would you imagine,  that almost
all Photoshop versions does this conversion differently from the
others?  At least, Photoshop does a decent job, which is not the
case with some other softwares.  Despite GIMP 2.10 won this test
for me, I ended up using with my own method which is based again
on the Delta-E 2000 (dE2000) formula.  My results are very close
to the GIMP's and they fit better to the line of my research.   

Existing Methods                                                

Average of the Channels                                         

An intuitive way to convert a three component RGB color value to
a single gray value is to take  the average of  the red,  green,
and blue values  to get the grayscale  value.  This combines the
luminance contributed  by each color band into a reasonable gray
approximation. However, to our eyes, green looks about ten times
brighter than blue.                                             

Weighted Average of the Channels                                

There is no consensus about the weights.  According to a source,
Photoshop uses 30% red, 59% green and 11% blue. The ITU-R BT.601
standard uses 0.299 red, 0.587 green, and 0.114 blue ratios.    

Relative Luminance After Linearization                          

Scientists have figured out how different we  perceive the lumi-
nance or red, green, and blue.  The ITU recommends the following
commonly used formula for the HDTV standards:                   
      Y = 0.2126 * R_lin + 0.7152 * G_lin + 0.0722 * B_lin      
However, the RGB values should be linearized first. For that, we
divide the values by 255 to convert them to the range of 0 to 1.
Then, linearization. A simple method is to power the values with
2.2 exponent.  You can find the more complicated standard method
here. Finally, gamma correction, multiplication by 255, round to
integer has to be applied on the Y value to get our gray value. 

Other Methods                                                   

There are a plenty of other methods available.  You can see many
of them here and here.                                          

My Method                                                       

Taking the huge variety and inconsitency of the methods,  I made
my own one,  which fits better to my experiment than any other I
found.  As my whole color palette project is based on the CIELAB
Delta-E 2000 formula,  soon it came obvious to me  that I should
continue using that for this part of the project too.  Thus, for
every  RGB value I mapped  the R=G=B gray value  with the lowest
delta-E value. I stored the mapping in a lossless 4096x4096 Hald
CLUT. Later I found that the result is not fully monotonic. None
of the differences were more than 1 gray value in the range of 0
to 255. I fixed the monotonicity of the LUT anyway.             

Visual Comparision                                              

I collected many conversion  methods in the form of  Hald CLUTs.
Basically I applied  the methods  on the identity CLUT and saved
the results.  I also created  a comparision image with Python to
see them all together.  The best conversion methods are the ones
where  the readability of the text is  the worst over the entire
column. Personally I found GIMP 2.10 the best one.  Photoshop is
also good, except for version 21 (PS 2020).  The one tagged with
"lp" refers to the lodgepole Python module by Brandon Rohrer. My
own methods are "de2000" and "szieberth" (monotonic).  Despite I
visually find GIMP better by half a hair, I picked my own method
for the next steps of my project for consistency.               


With the Hald CLUTs provided, you can easily apply any grayscale
conversion to your images with the command prompt if ImageMagick
is installed. Use the following command:                        

magick inputimage.png haldclut.png -hald-clut outputimage.png   

You can find the GRAYSCALE and CVD palette projects on GitHub.