5.13. Linearni i susjedski filtri

Operacije matematike nad pikselima ranije u poglavlju kombinirale su dvije slike točku po točku. Filtri obavljaju srodan posao na drugačiji način: vrijednost svakog izlaznog piksela računaju iz malog susjedstva ulaznih piksela koji okružuju odgovarajući položaj. Izlaz na (x, y) neka je statistika – prosjek, medijan, najčešća vrijednost – ulaznih piksela u malom okviru centriranom oko (x, y).

Ta mala promjena u pristupu – prelazak s jednog piksela odjednom na prozor piksela odjednom – ono je što omogućuje rad cijele obitelji korisnih operacija. Jednostavan prosjek preko malog prozora izglađuje šum senzora. Medijan preko istog prozora uklanja pojedinačne mrlje od jednog piksela bez tolikog omekšavanja rubova. Bilateralni prosjek odbija izglađivanje preko granica jakog kontrasta, čuvajući rubove objekata dok čisti teksture unutar njih. Susjedstvo je jedinica rada; izbor statistike odlučuje što filtar radi.

5.13.1. Veličina jezgre

Svaki susjedski filtar prima parametar size koji postavlja radijus prozora u pikselima. Sam prozor je kvadratan i pokriva (2 * size + 1) piksela sa svake strane – pa size=1 znači susjedstvo 3 puta 3, size=2 znači 5 puta 5, size=3 znači 7 puta 7, i tako dalje.

Mala mreža slike s istaknutom podmrežom 3 puta 3 koja predstavlja susjedstvo filtra. Strelica pokazuje kako susjedstvo klizi jedan piksel udesno. Druga strelica pokazuje kako klizi prema dolje u sljedeći red na kraju reda. Izlazni piksel za svaki položaj nacrtan je ispod susjedstva, uz malu napomenu koja kaže da je izlaz neka statistika ulaznog susjedstva.

Susjedstvo klizi preko slike jedan piksel odjednom, od gornjeg lijevog do donjeg desnog kuta. Svaki izlazni piksel rezultat je primjene statistike filtra na ulazno susjedstvo centrirano oko njega.

Veće veličine znače veća susjedstva, što znači glađe (ili agresivnije) filtriranje. Trošak raste s površinom prozora, pa filtar size=3 obavlja oko devet puta više posla po pikselu nego filtar size=1. Praktična zadana vrijednost za većinu poslova čišćenja je size=1 ili size=2; posegnite za većim veličinama samo kada mala susjedstva nisu dovoljna da potisnu značajku koju aplikacija pokušava potisnuti.

5.13.2. Srednji filtar (mean)

mean() zamjenjuje svaki piksel aritmetičkim prosjekom njegova susjedstva. Rezultat izglađuje varijaciju od piksela do piksela preko veličine prozora, što ga čini najjeftinijim načinom potiskivanja mrlja šuma senzora: visokofrekventna varijacija se uprosječuje, niskofrekventni sadržaj preživljava.

Kompromis je u tome što se i rubovi i druge oštre značajke uprosječuju. Svijetli rub koji je prije filtra bio širok jedan piksel postaje širok dva ili tri piksela nakon srednjeg filtra size=1, sa svjetlinom koja se postupno smanjuje na ramenima. Za čisto smanjenje šuma na slici siromašnoj teksturom (čist zid, unutrašnjost obojanog markera) kompromis je u redu. Za užurbanu scenu u kojoj su rubovi važni, neki od sljedećih filtara obično je bolji izbor.

img.mean(1)        # 3x3 box average -- fast, gentle smoothing
img.mean(2)        # 5x5 box average -- stronger, slower

5.13.3. Medijan, mod, sredina

Druga tri statistička susjedska filtra zamjenjuju jednostavan aritmetički prosjek nečim robusnijim na netipične vrijednosti.

median() vraća medijan susjedstva – vrijednost koja završi u sredini sortiranog popisa piksela prozora. Pojedinačan vrlo svijetli ili vrlo tamni piksel u prozoru ne povlači medijan; jednostavno postaje jedna od odbačenih krajnosti. Praktičan učinak je da filtriranje medijanom uklanja pojedinačne mrlje od jednog piksela te šum tipa sol-i-papar bez omekšavanja rubova kako to čini mean. Trošak je više računanja po pikselu – sortiranje prozora sporije je od njegova uprosječivanja – a rezultat nije strogo prosjek, što ponekad ima značaj za daljnju matematiku.

Parametar percentile (zadano 0.5) pomiče odabranu vrijednost od strogog medijana. percentile=0.0 vraća minimum susjedstva, percentile=1.0 maksimum; međuvrijednosti biraju proporcionalno između njih u sortiranom prozoru. To daje median mogućnost naglašavanja tamnih ili svijetlih dijelova susjedstva bez gubitka robusnosti na netipične vrijednosti svojstvene poredbenoj statistici.

mode() vraća najčešću vrijednost u susjedstvu. Korisno kada je model šuma „većina piksela je ispravna, nekolicina je iskvarena u različitim stupnjevima”, gdje je ispravan odgovor ona vrijednost koja se najčešće pojavljuje – što medijan može promašiti kada se iskvarene vrijednosti nagomilaju na jednoj strani sortiranog prozora.

midpoint() vraća ponderiranu kombinaciju minimuma i maksimuma susjedstva – bias=0.5 daje sredinu između njih, bias=0.0 daje minimum, bias=1.0 daje maksimum. Rjeđe se koristi od ostalih, ali vrijedi ga poznavati kada je cilj specifično izvući tamne ili svijetle značajke.

5.13.4. Bilateralni, inačica koja čuva rubove

bilateral() je susjedski filtar koji najviše vrijedi dobro razumjeti. On proizvodi učinak izglađivanja kao mean(), ali uz dodatno ograničenje: što se piksel susjedstva više razlikuje od središnjeg piksela, to manje računa u prosjeku. Rezultat izglađuje unutrašnjost svakog jednolikog područja bez prelijevanja preko rubova koji ih razdvajaju, što je upravo ono što većina aplikacija zapravo želi.

Dva parametra upravljaju koliko agresivno filtar umanjuje piksele:

  • color_sigma odlučuje kako razlika u boji utječe na ponderiranje. Manje vrijednosti znače da je filtar stroži u umanjivanju piksela koji se razlikuju od središta.

  • space_sigma odlučuje kako prostorna udaljenost utječe na ponderiranje. Manje vrijednosti daju veću težinu pikselima blizu središta.

Zadane vrijednosti (color_sigma=0.1, space_sigma=1.0) razumne su početne točke; njihovo ugađanje obično je stvar pokretanja filtra na uzorku sličice i prilagođavanja dok rubovi ne postanu oštri, a unutrašnjosti čiste.

Bilateralni je skuplji od median() i znatno skuplji od mean(), pa za njim vrijedi posegnuti samo kada je ponašanje koje čuva rubove ono što aplikaciji treba.

5.13.5. Adaptivno postavljanje praga

Filtri mean, median, mode i midpoint svi nose isti par ključnih argumenata koji njihov izlaz pretvaraju u binarni prag:

  • threshold=True prebacuje filtar u način postavljanja praga.

  • offset=N pomiče lokalni prag za N jedinica prije usporedbe.

Mehanika se izravno nadograđuje na uobičajeno ponašanje filtra. Bez threshold=True filtar računa svoju statistiku preko susjedstva i upisuje tu statistiku u izlazni piksel. S threshold=True filtar računa istu statistiku, zatim uspoređuje izvorni piksel na istom položaju sa statistikom uvećanom za pomak, i upisuje najveću vrijednost formata ako je izvor veći, inače nulu.

Rezultat je binarna slika čiji se prag pomiče s lokalnom svjetlinom preko sličice. Svijetla područja dobivaju visok prag, tamna područja dobivaju nizak prag, a piksel prednjeg plana koji je lokalno svjetliji od svojih susjeda podudara se bez obzira nalazi li se u svijetlom ili tamnom području – što je upravo ponašanje koje jedan globalni prag ne bi mogao proizvesti na neravnomjerno osvijetljenoj slici.

img.mean(3, threshold=True, offset=5)

Parametar offset je mjesto gdje aplikacija upravlja koliko je strog test. Mali pozitivni pomak zahtijeva da izvorni piksel bude mjerljivo svjetliji od svojih susjeda prije nego što se računa kao podudaranje, što potiskuje lažne pozitive od šuma senzora po cijenu izostavljanja slabog prednjeg plana. Mali negativni pomak hvata slabi prednji plan po cijenu propuštanja nešto šuma. Izbor ovisi o tome što će ostatak cjevovoda raditi s binarnim izlazom.

Tri ploče slike u nizu. Prva je ulazna sličica u sivim tonovima s gradijentom svjetline i oznakama prednjeg plana raspršenima preko nje pri jednolikoj tamnoći. Druga ploča prikazuje globalni prag primijenjen na nju:  prednji plan ispravno je klasificiran na svijetloj strani, ali cijela tamna strana čita se kao prednji plan jer i pozadina i prednji plan padaju ispod praga. Treća ploča prikazuje adaptivni prag primijenjen na isti ulaz: prednji plan je ispravno klasificiran preko cijele sličice.

Pri neravnomjernom osvjetljenju jedan globalni prag ne može opisati prednji plan na svakom položaju. Susjedski filtar pokrenut s threshold=True proizvodi prag koji se pomiče s lokalnom svjetlinom i ispravno klasificira prednji plan preko cijele sličice.

Obitelj filtara pokreće adaptivni prag, pa je odabir pravog filtra važan: mean() za najjeftiniji adaptivni prag, median() kada ulaz ima šum tipa sol-i-papar koji bi filtar trebao odbaciti prije računanja lokalnog praga.