bwmod — arithmetically modify pixel values in black and white bw file
Bwmod
will perform a series of arithmetic operations on each 8-bit pixel
of its input/output stream. This is a
bw(5)
file format.
The pixel values range from 0 to 255 and are internally operated on
in floating point form (unless the
-c
option has been specified) so that dynamic range, truncation, and sign,
are not a problem. On output they are converted back to 8-bit unsigned
values clipping to 0 and 255 if necessary. The number of pixels clipped
high and low, if any, are reported to standard error on completion.
If the
-c
option is specified, then intermediate results are stored as signed characters, though
the command line arguments remain in floating point
format.
This is useful when one wishes to take advantage of wrap-around
characteristics of binary mathematics.
Any number of operations can be given and they are applied in order.
The choices are:
-a
val
to add a value.
-s
val
to subtract a value.
-m
val
to multiply by a value.
-d
val
to divide by a value.
-A
to take to absolute value of each pixel.
-e
val
to exponentiate, i.e. raise each pixel to the power
val.
-r
val
to take the
val
root of each pixel.
All arguments can be floating point values. Note that this command can be applied to color pix(5) files also, but no distinction can be made between color planes.
The command
bwmod -m-1 -a255 < file.bw > file2.bw
will produce the negative of a file by first multiplying by minus
one, and then adding 255 to shift the pixels back into the 0->255 range.
One can apply a gamma factor to a file as follows:
bwmod -d255 -r2.2 -m255 < file.bw > file2.bw
which will first normalize the pixel values, then take the 2.2 root
of each pixel, and finally scale it back to 0->255.
[Note however that applying gammas this way is not recommended since
a function call per pixel results!]
Suppose you ran bwstat on a file and found min=80, max=210, mean=100.
If you wish to expand the range of intensities, while still preserving
the mean, this can be done by:
bwmod -s100 -m1.409 -a100 < file.bw > file2.bw
Where 1.409 results from (255-100)/(210-100) which is what one would use
by boost the max value (210) to full scale (255) after subtracting the
mean (100). Subtracting and adding 100 make the multiply occur
"about that point", i.e value less than 100 will get smaller; those
above, higher.