pnmnlfilt(1)                                         pnmnlfilt(1)

       pnmnlfilt  -  non-linear filters: smooth, alpha trim mean,
       optimal estimation smoothing, edge enhancement.

       pnmnlfilt alpha radius [pnmfile]

       This is something of a swiss army knife filter. It  has  3
       distinct  operating  modes. In all of the modes each pixel
       in the image is examined and processed according to it and
       its  surrounding  pixels  values.  Rather than using the 9
       pixels in a 3x3 block, 7 hexagonal area samples are taken,
       the  size  of  the hexagons being controlled by the radius
       parameter. A radius value  of  0.3333  means  that  the  7
       hexagons  exactly  fit  into  the center pixel (ie.  there
       will be no filtering effect). A radius value of 1.0  means
       that the 7 hexagons exactly fit a 3x3 pixel array.

Alpha trimmed mean filter.    (0.0 <= alpha <= 0.5)
       The value of the center pixel will be replaced by the mean
       of the 7 hexagon values, but the 7 values  are  sorted  by
       size  and  the  top  and bottom alpha portion of the 7 are
       excluded from the mean.  This implies that an alpha  value
       of  0.0 gives the same sort of output as a normal convolu-
       tion (ie. averaging or  smoothing  filter),  where  radius
       will  determine the "strength" of the filter. A good value
       to start from for subtle filtering is alpha = 0.0,  radius
       = 0.55 For a more blatant effect, try alpha 0.0 and radius

       An alpha value of 0.5 will cause the median value of the 7
       hexagons  to  be  used  to replace the center pixel value.
       This sort of filter is good for eliminating "pop" or  sin-
       gle  pixel noise from an image without spreading the noise
       out or smudging features on the image.  Judicious  use  of
       the  radius parameter will fine tune the filtering. Inter-
       mediate values of alpha  give  effects  somewhere  between
       smoothing  and "pop" noise reduction. For subtle filtering
       try starting with values of alpha = 0.4, radius = 0.6  For
       a more blatant effect try alpha = 0.5, radius = 1.0

Optimal estimation smoothing. (1.0 <= alpha <= 2.0)
       This  type of filter applies a smoothing filter adaptively
       over the image.  For each pixel the variance of  the  sur-
       rounding  hexagon  values is calculated, and the amount of
       smoothing is made inversely proportional to it.  The  idea
       is  that  if the variance is small then it is due to noise
       in the image, while  if  the  variance  is  large,  it  is
       because  of  "wanted"  image features. As usual the radius
       parameter controls the effective radius, but  it  probably
       advisable  to leave the radius between 0.8 and 1.0 for the
       variance calculation to be meaningful.  The alpha  parame-
       ter  sets  the  noise threshold, over which less smoothing
       will be done.  This means that small values of alpha  will
       give  the most subtle filtering effect, while large values
       will tend to smooth all parts  of  the  image.  You  could
       start  with  values like alpha = 1.2, radius = 1.0 and try
       increasing or decreasing the alpha parameter  to  get  the
       desired  effect. This type of filter is best for filtering
       out dithering noise in both bitmap and color images.

Edge enhancement. (-0.1 >= alpha >= -0.9)
       This is the opposite type of filter to the smoothing  fil-
       ter.  It  enhances edges. The alpha parameter controls the
       amount of edge enhancement, from subtle (-0.1) to  blatant
       (-0.9). The radius parameter controls the effective radius
       as usual, but useful values are between 0.5 and  0.9.  Try
       starting with values of alpha = 0.3, radius = 0.8

Combination use.
       The  various  modes of pnmnlfilt can be used one after the
       other to get the desired result. For instance  to  turn  a
       monochrome dithered image into a grayscale image you could
       try one or two passes of the smoothing filter, followed by
       a  pass of the optimal estimation filter, then some subtle
       edge enhancement. Note that using edge enhancement is only
       likely  to  be  useful after one of the non-linear filters
       (alpha trimmed mean or optimal estimation filter), as edge
       enhancement is the direct opposite of smoothing.

       For reducing color quantization noise in images (ie. turn-
       ing .gif files back into 24 bit files)  you  could  try  a
       pass  of  the optimal estimation filter (alpha 1.2, radius
       1.0), a pass of  the  median  filter  (alpha  0.5,  radius
       0.55), and possibly a pass of the edge enhancement filter.
       Several passes  of  the  optimal  estimation  filter  with
       declining  alpha  values  are more effective than a single
       pass with a large alpha  value.   As  usual,  there  is  a
       tradeoff   between  filtering  effectiveness  and  loosing
       detail. Experimentation is encouraged.

       The alpha-trimmed mean filter is based on the  description
       in  IEEE  CG&A May 1990 Page 23 by Mark E. Lee and Richard
       A. Redner, and has been enhanced to allow continuous alpha

       The  optimal  estimation  filter  is taken from an article
       "Converting Dithered Images Back to Gray Scale"  by  Allen
       Stenger,  Dr Dobb's Journal, November 1992, and this arti-
       cle references "Digital Image Enhancement and  Noise  Fil-
       tering  by  Use  of  Local Statistics", Jong-Sen Lee, IEEE
       Transactions on Pattern Analysis and Machine Intelligence,
       March 1980.

       The edge enhancement details are from pgmenhance(1), which
       is taken from Philip R. Thompson's "xim" program, which in
       turn  took  it from section 6 of "Digital Halftones by Dot
       Diffusion", D. E. Knuth, ACM Transaction on Graphics  Vol.
       6, No. 4, October 1987, which in turn got it from two 1976
       papers by J. F. Jarvis et. al.

       pgmenhance(1), pnmconvol(1), pnm(5)

       Integers and  tables  may  overflow  if  PPM_MAXMAXVAL  is
       greater than 255.

       Graeme W. Gill

                         5 February 1993                        1