blob: a10c37b3ac9138bfa4b652a75d03a9a9f9094e5d [file] [log] [blame]
.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