.TH IM_FMASKPROF 3 "8 Oct 1991"
.SH NAME
im_create_fmask \- create a frequency domain filter mask according to args
.SH SYNOPSIS
.B #include <vips/vips.h>

int 
.br
im_create_fmask( IMAGE *out, int xs, int ys, int type, double p1, ... )

.SH DESCRIPTION
im_create_fmask()
creates a float one band image mask.  Sizes  xs and ys must be powers of 2,
and must be square. Non-square masks may be added in a future version.

There are 18 types of filter mask supported in this VIPS - they are listed
below. For each type, you are expected to give the correct number of
additional parameters. See the table.

.br
-----------------------------------------------------------
.br
| Filter mask;         type; num_args; parameters         |
.br
-----------------------------------------------------------
.br
| Ideal high pass;          0;  1; fc                     |
.br
| Ideal low pass;           1;  1; fc                     |
.br
| Butterworth high pass;    2;  3; order, fc, ac          |
.br
| Butterworth low pass;     3;  3; order, fc, ac          |
.br
| Gaussian low pass;        4;  2; fc, ac                 |
.br
| Gaussian high pass;       5;  2; fc, ac                 |
.br
|                                                         |
.br
| Ideal ring pass;          6;  2; fc, width              |
.br
| Ideal ring reject;        7;  2; fc, width              |
.br
| Butterworth ring pass;    8;  4; order, fc, width, ac   |
.br
| Butterworth ring reject;  9;  4; order, fc, width, ac   |
.br
| Gaussian ring pass;      10;  3; fc, width, ac          |
.br
| Gaussian ring reject;    11;  3; fc, width, ac          |
.br
|                                                         |
.br
| Ideal band pass;         12;  3; fcx, fcy, r            |
.br
| Ideal band reject;       13;  3; fcx, fcy, r            |
.br
| Butterworth band pass;   14;  5; order, fcx, fcy, r, ac |
.br
| Butterworth band reject; 15;  5; order, fcx, fcy, r, ac |
.br
| Gaussian band pass;      16;  4; fcx, fcy, r, ac        |
.br
| Gaussian band reject;    17;  4; fcx, fcy, r, ac        |
.br
|                                                         |
.br
| fractal filter mask;     18;  1; fractal_dimension      |
.br
-----------------------------------------------------------

All masks are created with the four quadrants rotated so the (0,0) dc component
is at the top left corner of the image.  In order to view a mask,
the four quadrants must be rotated
(im_rotquad(3)) and scaled (im_scale(3)).  If the masks
are used for filtering in the frequency domain, there is no need for rotation.
Function im_flt_imag_freq(3) creates a mask and filter a square image in the
frequency domain.

As a matter of convention the positive x axis is from left to right while the
positive y axis is from top to bottom (on the image with the frequency (0,0)
close to the centre i.e the four quadrants rotated).
All produced filters are float images with the maximum value normalised to 1.0.
Ideal and Butterworth filters are given in the book by Gonzalez and Wintz.

HIGH PASS - LOW PASS FILTER MASKS (flag: 0 to 5)

A high pass filter mask filters the low frequencies while allowing the high
frequencies to get through.  The reverse happens with a low pass
filter mask.  The transition is controlled by the frequency
cutoff (fc). All masks are circularly symmetric and they are creating
by duplicating one forth of them.

Ideal high pass/low pass (argno=1):

The variable fc determines the frequency cutoff which can be given either as
percentage of the max spatial frequency (normalised by convention to 1.0) or
in pixels. In the latter case it is assumed that the input image is
square and that the maximum spatial frequency
corresponds to xs/2 points horizontally and and ys/2 points vertically. 
The following line of code creates an ideal circularly symmetric
high pass filter mask:

im_create_fmask(im, 128, 128, 0, .5);

with all values above half the max spatial frequency 
(corresponding to 32 pixels) set to 1.0 and the remaining set to 0.0.
The dc value (corresponding to the frequency (0,0)) is set to 1.0.
When the mask is properly scaled and has its four quadrants rotated it is a 
black circle within a white square.  The radius of the circle is 
determined by fc which is .5*max_spatial_frequency that is, for the example
above .5*64=32.
The centre of the circle is set to 1.0 (white), in order to allow
the dc component to pass unaltered.
A circularly symmetric ideal low pass filter mask is constructed in a similar
way.

Butterworth high pass/low pass (argno=3):

Each mask needs three arguments: the order, fc and ac.  Order corresponds to
the order of the Butterworth filter mask, fc is the frequency cutoff and 
ac is the amplitude cutoff.  The same conventions are valid for both fc and ac
as for the ideal high pass and low pass filter mask.
The amplitude cutoff is determined by ac and corresponds to the percentage
of the maximum amplitude at fc.  The maximum amplitude is always
normalised to 1.0.
If the transfer function of the filter is H(r) then H(fc) = ac*H(0).
The transfer function at frequency (0,0) is also set to 1.0.

The transfer function of the Butterworth high pass is:
.br
H(r)=1.0/(1.0+(1.0/ac-1.0)*pow((fc*fc)/(r*r),order)).
.br
For a Butterworth low pass:
.br
H(r)=1.0/(1.0+(1.0/ac-1.0)*pow((r*r)/(fc*fc),order)).
.br
Both masks are given in Gonzalez and Wintz (Digital Image Processing, 2nd edn,
1987).
By increasing the order, the filter becomes steeper introducing ringing.

Gaussian high pass/low pass (argno=2):

Each of these masks needs 2 arguments: fc and ac.  For both arguments the same
conventions as for the Butterworth mask are valid.  The transfer function
of a Gaussian high pass filter mask is given by the equation:
.br
H(r) = 1.0 - exp(log(ac)*r*r/(fc*fc)).
.br
The corresponding mask for a Gaussian high pass is:
.br
H(f) = exp(log(ac)*r*r/(fc*fc)).
.br
ac being the amplitude cutoff.
.br


RING PASS - RING REJECT FILTER MASKS (flag: 6 to 11)

A  circularly symmetric ring pass filter mask allows all
frequencies within a ring, to pass while blocking all other frequencies.
The ring is specified by its width and it radius which corresponds to fc
the frequency cutoff. The fc is centred within the width and, therefore,
the ring starts at point fc-width/2 up to fc+width/2 along the positive
horizontal x axis.  The reverse happens with a low pass
filter mask.  The transition is controlled by the frequency
cutoff (fc). All masks are circularly symmetric and they are creating
by duplicating one forth of them.

Ideal ring pass/ring reject filter masks (argno=2):

An ideal ring pass filter mask has two arguments, the width and the frequency
cutoff. The created mask when properly rotated, 
is a white ring of internal radius fc-df
and external radius fc+df, on a black square.  All band pass values
within the ring are set to 1.0 while the remaining band reject frequencies 
are set to 0.0.  The (0,0) frequency component is set to 1.0.
Both fc and width must be either between 0.0 and 1.0, or between 1.0 and
xs/2.  If both are between 0.0 and 1.0 then the program normalises then to the
maximum spatial frequency which is xs/2=ys/2.

An ideal ring reject filter mask is the reverse of the ideal ring pass filter
mask, that is it allows all frequencies to get through apart from the
frequencies within a ring specified  by the args of the function,
in a similar way as the ideal ring pass filter.

Butterworth ring pass/ring reject filter masks (argno=4):

.br
Each of these masks has 4 arguments: the order of the filter (order),
the frequency cutoff (fc), the width (width) and the amplitude cutoff (ac).
.br
A Butterworth ring pass filter mask is a circularly symmetric ring shape mask.
The profile of the mask along the horizontal positive axis is a shifted
low pass Butterworth filter mask, with the maximum value set to 1.0.
This mask is similar to the ideal ring pass but the transition 
between band pass and band reject zones instead of a sharp brick
wall, is a shifted Butterworth low pass filter
mask. The transfer function of the mask is given by the equation:
.br
H(r)=1./(1.+cnst*pow(((r-fc)*(r-fc)/(w2)),order))
.br
where cnst=1/ac, w2 = width*width/4.
.br
Both fc and width should be either between 0.0 and 1.0 or between 1.0 and xs/2
as in the case of the ideal ring pass or ring reject mask.  The amplitude
cutoff should be always between 0.0 and 1.0.  It should be noted that:
.br
H(fc+df)=H(fc-df)=ac*H(fc)
.br
The value of H(0) at frequency (0,0) has been set to 1.0 in order to allow
the dc component of the image to pass unaltered.

For the case of the Butterworth ring reject filter mask, its transfer function
is given by the equation:
.br
H(r)=1./(1.+cnst*pow((w2/((r-fc)*(r-fc))),order))
.br
where cnst=1/ac, w2 = width*width/4.
.br

Gaussian ring pass/ring reject filter masks (argno=3):

Each of these masks takes three arguments: the frequency cutoff (fc), the width
(width) and the amplitude cutoff (ac).  The conventions for the arguments
are the same as for the Butterworth ring pass and ring reject masks above; 
however the order is not needed.

The transfer function of a Gaussian ring pass filter mask is:
.br
H(r)=exp(log(ac)*(r-fc) * (r-fc)/w2)
.br
where w2 = width*width/4.
.br

BAND PASS - BAND REJECT MASKS (flag:13 to 17) 

These filter masks are used in order to eliminate spatial frequencies 
around a given frequency.  Since the masks must be symmetrical 
with respect to the origin, they cannot be realised by creating
one forth and replicating it four times.

Ideal band pass/band reject filter masks (argno=3):

An ideal band reject filter mask takes three arguments: the coordinates
of the centre of the one circle (fcx,fcy) and its radius r.  The produced
filter mask has all values 0.0 except two disks centred at (fcx,fcy),
(-fcx,-fcy) each one having radius r.  The two disks have values of 1.0.
The value of the mask corresponding to (0,0) spatial frequency, as also
set to 1.0.  

All three arguments fcx, fcy and r should be either between 0 and 1 or
between 1 and the max spatial frequency which is xs/2=ys/2.  In the
case that the arguments are between 0.0 and 1.0 they are interpreted
as percentage of the maximum spatial frequency.  For the case of band
pass filter masks the value of the (0,0) frequency is set to 1.0 so that
the dc component can pass unaltered.

Butterworth band pass/band reject filter masks (argno=4):

A Butterworth band pass/band reject 
filter mask allows/rejects spatial frequencies
around a given frequency.  The mask consists of the sum of two
Butterworth shape filters centered at (fcx,fcy) and (-fcx,-fcy).
The shape of each mask is determined by the parameters of the function.
The arguments fcx, fcy and r obey the same conventions as for those
of the ideal band pass / band reject masks.  The transfer function of the
filter at point (0,0) is set to 1.0.

The function works by adding the two Butterworth masks.
As a result, if the whole mask is normalised with respect to
frequency (fcx,fcy), the cutoff frequency at (fcx+||r||,fcy+||r||) will
be different to that of (fcx-||r||,fcy-||r||), since the tail of
the mask centered at (-fcx,-fcy) will give a different contribution
to (fcx+||r||,fcy+||r||) than that to (fcx-||r||,fcy-||r||).
In order to simplify the calculations, the function estimates the
amplitude at a cutoff frequency ((fcx-||r||,fcy-||r||) as if the contribution
comes only from the mask centred at (fcx,fcy).  The side effect of this 
approach is that for big values of r the cutoff frequency of the filter mask
is different at frequencies (fcx+||r||,fcy+||r||) and (fcx+||r||,fcy+||r||).

More specifically, given that each disk has a Butterworth shape of radius r
with centres at (x0, y0) and (-x0,-y0),
the transfer function of a Butterworth band pass filter
mask is given by the equation:
.br
H(d)=  { H1(d) + H2(d) }
.br
H1(d) = cnst1/(1 + cnst2 * pow((d-d0)/r, 2*order))
.br
H2(d) = cnst1/(1 + cnst2 * pow((d+d0)/r, 2*order))
.br
where
.br
cnst1=1./(1.+1./(1.+cnst1*pow(d02/((r/2)*(r/2)),order)))
.br
cnst2=1./ac - 1.,
.br
d02 = x0*x0+y0*y0.
.br
With this configuration for d=+d0, H(+d0) = 1.0; for d=-d0 H(-d0) = 1.0.
If da=(xa,ya), then for d=+da, H1(+da)=ac and for d=-da, H1(-da)=ac.  In the
latter case it is assumed that xa=x0*(1-radius/sqrt(x0*x0+y0*y0)) and that
ya=y0*(1-radius/sqrt(x0*x0+y0*y0)).

The transfer function of a Butterworth band reject filter H_bbr(d) is given
by the equation:
.br
H_bbr(d) = 1.0 - H_bbp(d),
.br
where H_bbp(d) is the transfer function of the Butterworth bandpass filter
defined above.

Gaussian band pass/band reject filter masks (argno=3):

For a Gaussian band pass or band reject filter mask, similar conventions 
to those of the Butterworth filter masks, are valid however the order as an
argument is not needed.

The  transfer function of a Gaussian band pass filter mask is given by the
equation
.br
H(d)=  { H1(d) + H2(d) }
.br
H1(d) = cnst1 * exp(-cnst2 * (d-d0)*(d-d0)/(r*r))
.br
H1(d) = cnst1 * exp(-cnst2 * (d+d0)*(d+d0)/(r*r))
.br
where
.br
cnst1=1/( 1+exp(-cnst*d02/((r/2)*(r/2))) ),
.br
d02 = x0*x0+y0*y0 and cnst2=-log(ac).

The transfer function of a Gaussian band reject filter H_gbr(d) is given
by the equation:
.br
H_gbr(d) = 1.0 - H_gbp(d),
.br
where H_gbp(d) is the transfer function of the Gaussian bandpass filter
defined above.

FRACTAL FILTER MASK (flag:18)

The fractal filter mask should be used only to filter square images of
white Gaussian noise in order to create fractal surfaces of a given fractal
dimension.  The fractal dimension should be between 2.0 and 3.0.  The produced
mask has a power spectrum which decays according to the rule entered by the
parameter fractal dimension.
.SH RETURN VALUE
The function returns 0 on success and -1 on error.
.SH SEE\ ALSO
im_flt_image_freq(3).
.SH COPYRIGHT
.br
N. Dessipris
.SH AUTHOR
N. Dessipris \- 10/08/1991
