Filtriranje slike omogućava da se primene različiti efekti na digitalne fotografije. Ovde će biti opisano filtriranje slika koje koristi 2D filtre slične onima koji su sastavni deo komercijalnih paketa za obradu slike.
Konvolucija
Trik kod filtriranja slike je da imate 2D filtarsku matricu i 2D sliku. Zatim, za svaki piksel slike računate sumu proizvoda. Svaki proizvod je kolorna vrednost tekućeg piksela ili njegovog suseda, u skladu sa odgovarajućim vrednostima filtarske matrice. Centar filtarske matrice mora da se množi sa tekućim pikselom, a drugi elementi filtarske matrice s odgovarajućim susednim pikselima.
Ova operacija kod koje sumirate proizvode elemenata od dve 2D funkcije, gde dozvoljavate da se jedna od dve funkcije pomera preko elemenata druge funkcije naziva se konvolucija ili korelacija. Razlika između konvolucije i korelacije je u tome što za konvoluciju morate da refleksivno preslikate (ogledalo) filtarsku matricu, ali obično je sve simetrično tako da nema razlike.
Filtri sa konvolucijom su relativno jednostavni. Složeniji filtri, koji koriste mnogo egzotičnije efekte takođe postoje i mogu da obave mnogo složenije stvari, ali ih ovde nećemo razmatrati.
Operacija 2D konvolucije zahteva 4 dvostruke petlje, tako da nije baš brza za izvršavanje ukoliko se ne koriste mali filtri. Ovde će biti korišćeni 3×3 ili 5×5 filtri.
Postoji nekoliko pravila koja se odnose na filtre:
Njihova dimenzija treba da bude neparna, tako da imaju centar, na primer 3×3,
5×5 i 7×7 sasvim je u redu.
Nije obavezno, ali suma svih elemenata filtra trebalo bi da bude 1 ako želite da obrađena slika ima isti osvetljaj kao originalna.
Ako je suma elemenata veća od 1, rezultat će biti svetlija slika, a ako je manja od 1, rezultat je tamnija slika. Ako je suma 0, rezultujuća slika ne mora biti potpuno crna, ali će biti vrlo tamna.
Slika ima konačne dimenzije i ako na primer izračunavate piksel na levoj strani, tada nema piksela levo od njega koji su potrebni za konvoluciju. Možete koristiti ili vrednost 0, ili „wrapovati” drugu stranu slike. Često se bira „wrapovanje” pošto može lako da se uradi sa modulo deljenjem.
Vrednosti rezultujućih piksela posle primene filtra mogu biti negativne ili veće od 255, ako se to dogodi možete da ih odsečete tako što će vrednosti manje od nule biti nula a vrednosti veće od 255 biti jednake 255. Kod negativnih vrednosti možete uzeti njihove apsolutne vrednosti.
U Furijeovom domenu (Fourier Domain) ili frekventnom domenu, operacija konvolucije postaje množenje, koje je brza operacija. U Furijeovom domenu mnogo snažniji i veći filtri mogu da se primene brže, pogotovu ako se koristi brza Furijeova transformacija (Fast Fourier Transform). No to je tema za sebe. Ovde ćemo razmotriti par tipičnih malih filtara kao što su blur(zamućenje), edge detection(detekcija ivica) i emboss (reljefna ispupčenja).
Filtriranje slike nije pogodno za aplikacije u realnom vremenu i igrice ali je vrlo zgodno za obradu slike.
Digitalni audio i elektronski filtri rade takođe sa konvolucijom, ali u 1D.
Diskretna 2D konvolucija
• piksel rezultujuće slike se računa kao suma proizvoda piksela iz polazne slike i odgovarajuće vrednosti kernela
• kernel je obično kvadratna matrica neparne dimenzije
Filtar BLUR
Da biste zamutili (blur) sliku potrebno je da kreirate filtar.
Filtar ima konkretnu veličinu (recimo 3 x 3 piksela, ili 5 x 5 piksela) i unutar filtra svakom pikselu se daje ponderisana vrednost kojom utiče na originalnu sliku kako bi se kreirala nova slika.
Ideja je da „prođete” filtrom piksel po piksel postavljajući redom centar ili ključnu tačku na svaki piksel originalne slike i izračunavajući boju ili senku novog piksela koji je na istoj lokaciji kao originalni piksel ali na novoj slici.
Na primer, pretpostavimo da kreirate sledeći 3 x 3 filtar: A B C
D E F G H I
Centar ili ključna tačka je E.
Svakom pikselu u filtru je dodeljena slovna oznaka zbog identifikacije a takođe je dodeljena i vrednost:
A = 0
B = 1
C = 0
D = 1
E = 1
F = 1
G = 0
H = 1
I = 0
tako da filtar ima oblik:
0 1 0
1 1 1
0 1 0
Imamo sliku a imamo i filtar koji treba da obradi sliku. Kako se kreira nova slika? Pođite od crno-bele slike (lakši slučaj…)
Za dati filtar, ignorišite piksele koji su izvan ivice, tj. filtar nema kompletno pokrivanje slike.
Krenite od gornjeg levog ugla slike i krećite se redom ka donjem desnom uglu, smeštajući centar filtra na svaki piksel redom.
Ako je filtar postavljen preko crno-bele slike tada, na primer, za vrednosti sivih nijansi originalne slike i ovaj filtar imamo:
22 27 29 | 0 1 0 | |
34 37 40 | sa filtrom | 1 1 1 preko slike. |
41 43 50 | 0 1 0 |
Centar filtra (E) se postavlja preko piksela koji ima vrednost 37 a da bi izračunali vrednost koju ima piksel istog položaja na novoj slici uzimaju se u obzir susedni pikseli slike i odgovarajući pikseli filtra.
Prema tome, nova vrednost za piksel koji je u originalnoj slici imao vrednost 37 dobija se pomoću proizvoda:
22 * A = 0
27 * B = 27
29 * C = 0
34 * D = 34
37 * E = 37
40 * F = 40
41 * G = 0
43 * H = 43
50 * I = 0
Sada usrednjavamo zbir proizvoda deljenjem sa brojem piksela u filtru i dobijamo novu vrednost:
(0 + 27 + 0 34 + 37 40 + 0 43 0) / 9 = 20.1
To je vrednost za piksel u novoj slici. Sada pomeramo filtar za jedan piksel i ponavljamo računanje. Na kraju reda pomeramo filtar za jedan piksel nadole itd.
Prost filtar za zamućenje ima oblik:
1 1 1
1 1 1
1 1 1
Razlog što on daje rezultat leži u činjenici da je svaki piksel nove slike usrednjena vrednost susednih piksela u originalnoj slici usled čega se dobija zamućenje. Centralni piksel obično ima znatno veću ponderišuću vrednost (težinski faktor) da bi se obezbedilo da ne bude suviše potisnut okolnim (susednim) pikselima.
Eksperimentišite sa različitim vrednostima za piksele u filtru (recimo 0.5 ili 0.2) kako bi dobili različite efekte.
Veći filtri će dati bolje rezultate za neke efekte obrade ali im je potrebno više vremena za obradu.
Vodite računa da ne menjate originalnu sliku već da treba da kreirate novu sliku koja ima izmenjene pikselske vrednosti.
Kod slika u boji stvar je nešto složenija pošto treba posebno da se obrađuje svaka komponenta (crvena, zelena, plava) za svaki piksel.
U cilju eksperimentisanja možete koristiti isti ili različite filtre za svaku kolornu komponentu kako biste boji dali željeni efekat.
Primer:
Izvedite zamućivanje tako što ćete usrednjiti tekući piksel i njegova četiri suseda. Izračunajte sumu tekućeg piksela i njegova četiri suseda i podelite je sa 5, ili popunite matricu sa vrednostima 0.2 tako da ima oblik:
0.0 | 0.2 | 0.0 |
0.2 | 0.2 | 0.2 |
0.0 | 0.2 | 0.0 |
Izvorni kôd za rad sa slikom sive skale (Lena.bmp) dat je u fajlu blur.c.
Izvorni kôd za rad sa slikom u boji (cvet.bmp) dat je u fajlu BlurKolor.c.
Sa sajta možete preuzeti arhivu filt_slike.rar. Dragan Marković