GRID
koja sadrži dimenzije (širinu i visinu)
u pikselima i pokazivač na polje kompleksnih brojeva (polje je kompleksno da bi se omogućilo
direktno korištenje standardnih rutina za izvođenje brzih Fourierovih transformacija):
typedef struct {
int width, height;
complex double *image;
} GRID;
Za učitavanje koristi se rutina read_PGM
koja sama alocira
i potrebnu memoriju. Primjer:
GRID *slika1;
...
slika1 = read_PGM("slika.pgm");
...
Sadržaj strukture tipa GRID
ispisuje se rutinom write_PGM
,
na primjer:
write_PGM("slika.pgm", slika1, 'r');
Treći parametar je tipa char
, 'r'
za realni dio kompleksnog broja,
'i'
za imaginarni, no u praksi će nam trebati samo 'r'
('i'
može biti koristan za testiranje i eksperimentiranje).
pgm.h
izrezivanje.c
koji kao primjer manipulacije slikom zacrnjuje srednji dio slike
i ostavlja samo uglove željene veličine izražene u pikselima.
izrezivanje.c
iz Primjera 1.
GIMP
(učitajte sliku u proizvoljnom formatu i kod snimanja sa
Save As...
odaberite na Select File Type
opciju
PGM image
te snimite u ASCII formatu).
izrezivanje.c
u program obrada.c
koji prvo izračunava Fourierovu transformaciju slike u frekvencijsku domenu, potom filtrira
visoke frekvencije (ekvivalentno izrezivanju iz Primjera 1, ali u frekvencijskoj domeni),
te izračunava inverznu Fourierovu transformaciju, tj. rekonstruira sliku samo iz preostalih
modova.
libfftw3-dev
i on bi trebao "povući" sve ostale potrebne pakete. Upute za
korištenje i primjeri mogu mogu se naći u PDF formatu
ovdje.
libfftw3-dev
, potom proučiti primjere
u poglavljima 2.1 i 2.2, te implementirati dvodimenzionalne Fourierove transformacije u program
obrada.c
. Najprije treba
učitanu sliku transformirati u frekvencijsko područje - postaviti predznak (sign)
tranformacije na FFTW_FORWARD
, potom obaviti filtriranje (već gotova rutina
izrezivanje()
iz Primjera 1) te rekonstruirati sliku inverznom transformacijom
- postaviti predznak na FFTW_BACKWARD
.
(SAVJETI: u rutini fftw_plan_dft_2d(...)
prvi argument je visina slike, a drugi
širina; za peti argument flag odabrati FFTW_ESTIMATE
; transformirati se može
nad istom matricom, dakle nije potrebno alocirati dodatnu memoriju).