pnmgamma
perform gamma correction on a portable anymap
Synopsis
pnmgamma
[-ungamma] [-cieramp|-srgbramp]
[value [pnmfile]]
pnmgamma [-ungamma]
[-cieramp|-srgbramp] redgamma greengamma
bluegamma [pnmfile]
add an example, a script, a trick and tips
examples
no example yet ...
... Feel free to add your own example above to help other Linux-lovers !
description
Performs gamma
correction on pseudo-PNM images.
The PPM format
specification specify that certain sample values in a file
represent certain light intensities in an image. In
particular, they specify that the sample values are directly
proportional to gamma-corrected intensity values. The gamma
correction they specify is CIE Rec. 709.
However, people
sometimes work with approximations of PPM and PGM where the
relationship between the image intensities and the sample
values are something else. For example, the sample value
might be directly proportional to the intensity with no
gamma correction (often called "linear
intensity"). Or a different gamma transfer function may
be used.
pnmgamma
allows you to manipulate the transfer function, thus working
with and/or creating pseudo-PPM files that are useful for
various things.
For example, if
you feed a true PPM to pnmgamma -cieramp -ungamma,
you get as output a file which is PPM in every respect
except that the sample values are directly proportional to
the light intensities in the image. If you feed such a file
to pnmgamma -cieramp, you get out a true PPM.
The situation
for PGM images is analogous. And pnmgamma treats PBM
images as PGM images.
When you feed a
linear PPM image to a display program that expects a true
PPM, the display appears darker than it should, so
pnmgamma has the effect of lightening the image. When
you feed a true PPM to a display program that expects linear
sample values, and therefore does a gamma correction of its
own on them, the display appears lighter than it should, so
pnmgamma with a gamma value less than one (the
multiplicative inverse of whatever gamma value the display
program uses) has the effect of darkening the image.
options
-ungamma
Apply the inverse of the
specified transfer function (i.e. go from gamma-corrected
nonlinear intensities to linear intensities).
-cieramp
Use the CIE Rec. 709 gamma
transfer function. Note that it is true CIE Rec. 709 only if
you use the default gamma value (i.e. don’t specify
any gamma parameters). This transfer function is a power
function modified with a linear ramp near black.
If you specify
neither -cieramp nor -srgbramp, the transfer
function defaults to a simple power function.
-srgbramp
Use the Internation
Electrotechnical Commission (IEC) SRGB gamma transfer
function (as specified in the standard IEC 61966-2-1). Note
that it is true SRGB only if you use the default gamma value
(i.e. don’t specify any gamma parameters). This
transfer function is like the one selected by
-cieramp, but with different constants in it.
Note that SRGB
is often spelled "sRGB". In this document, we use
standard English typography, though, which doesn’t
allow for that kind of capitalization.
If you specify
neither -cieramp nor -srgbramp, the transfer
function defaults to a simple power function.
parameters
The only parameters are the specification of the input image file
and the gamma values. Every gamma transfer function
pnmgamma uses contains an exponent, which is the gamma
value, and you can choose that value.
Furthermore, you can choose different values for each of the
three RGB components. If you specify only one gamma value,
pnmgamma uses that value for all three RGB components.
If you don’t specify any gamma parameters, pnmgamma
chooses a default. For the transfer functions defined by
standards, the default is the value defined by the standard. If
you specify anything else, you will be varying from the standard.
For the simple power function transfer function, the default
gamma is 1/.45.
what is gamma
A good explanation of gamma is in Charles Poynton’s GammaFAQ at
<http://www.inforamp.net/~poynton/ColorFAQ.html> and
ColorFAQ at
<http://www.inforamp.net/~poynton/GammaFAQ.html>
In brief: The simplest way to code an image is by using sample
values that are directly proportional to the intensity of the
color components. But that wastes the sample space because the
human eye can’t discern differences between low-intensity colors
as well as it can between high-intensity colors. So instead, we
pass the light intensity values through a transfer function that
makes it so that changing a sample value by 1 causes the same
level of perceived color change anywhere in the sample range. We
store those resulting values in the image file. That transfer
function is called the gamma transfer function and the
transformation is called gamma correcting.
Virtually all image formats, either specified or de facto, use
gamma-corrected values for their sample values.
What’s really nice about gamma is that by coincidence, the
inverse function that you have to do to convert the
gamma-corrected values back to real light intensities is done
automatically by CRTs. You just apply a voltage to the CRT’s
electron gun that is proportional to the gamma-corrected sample
value, and the intensity of light that comes out of the screen is
close to the intensity value you had before you applied the gamma
transfer function!
And when you consider that computer video devices usually want
you to store in video memory a value proportional to the signal
voltage you want to go to the monitor, which the monitor turns
into a proportional drive voltage on the electron gun, it is
really convenient to work with gamma-corrected sample values.
see also
pnm
author
Copyright (C)
1991 by Bill Davidson and Jef Poskanzer.