5.14. Gaussovo zaglađivanje i rubovi

Dva posla dominiraju onime za što se prozori susjedstva koriste u klasičnom strojnom vidu: čisto zaglađivanje varijacija od piksela do piksela i pronalaženje rubova gdje se slika naglo mijenja. Gaussov filtar je standardni alat za prvo, detektori temeljeni na Laplaceovom operatoru standardni alat za drugo – a to se dvoje slaže, jer svaki detektor rubova bolje radi na lagano zaglađenom ulazu.

5.14.1. Gaussov filtar

gaussian() je središnje ponderirani srodnik filtra mean(). Oba računaju prosjek preko susjedstva svakog piksela, ali Gaussove težine nisu ujednačene: pikseli bliže središtu susjedstva broje se više, pikseli na rubu susjedstva broje se manje, pri čemu težine slijede poznatu zvonoliku krivulju koja filtru daje ime.

Zvonoliko ponderiranje čini Gaussov filtar glađim od box prosjeka. Filtriranje srednjom vrijednošću može proizvesti vidljive artefakte na rubovima objekata – oštar prekid u ponderiranju uvodi male uzorke titranja na naglim prijelazima. Glatko opadajuće Gaussove težine izbjegavaju to titranje i daju rezultat koji izgleda bliže onome kako bi „zamućeno” trebalo izgledati. Cijena je više računanja po pikselu nego kod filtra srednje vrijednosti, ali ne dramatično – trošak po pikselu i dalje je znatno niži od bilateralnog filtra.

img.gaussian(1)    # 3x3 Gaussian -- a clean light blur
img.gaussian(2)    # 5x5 Gaussian -- stronger smoothing

Gaussovo zaglađivanje standardni je prvi korak gotovo svakog cjevovoda za detekciju rubova. Svi dolje navedeni detektori rubova pojačavaju visokofrekventni sadržaj, uključujući šum senzora koji algoritam zapravo ne želi detektirati. Pokretanje laganog Gaussa prvo potiskuje taj šum bez znatnog omekšavanja stvarnih rubova, ostavljajući detektoru rubova da pronalazi stvarne rubove umjesto pjega.

5.14.2. Maskiranje neoštrinom (unsharp masking)

Gaussovim zamućenjem kopija slike sirovi je materijal koji tehnika unsharp mask koristi za klasično izoštravanje. Postavljanje unsharp=True na filtru ga prebacuje iz „proizvedi zamućenu sliku” u „oduzmi zamućenu sliku od izvorne i dodaj razliku natrag na izvornu” – efekt je da se visokofrekventni rubovi pojačavaju u odnosu na glatke unutrašnjosti.

img.gaussian(1, unsharp=True)

Neobavezni parametri mul i add skaliraju snagu rezultata neoštrine; zadane vrijednosti (mul=1.0, add=0.0) daju umjereno izoštravanje koje ne pretjeruje sa šumom senzora.

5.14.3. Laplaceov filtar

laplacian() pokreće diskretnu aproksimaciju druge prostorne derivacije slike. Izlaz je velik gdje se vrijednosti piksela mijenjaju brzo, blizu nule gdje su konstantne ili se mijenjaju linearno. Prirodno čitanje rezultata je odziv ruba: pikseli gdje se slika brzo mijenja zasvijetle, pikseli u glatkim unutrašnjostima ostaju tamni.

img.laplacian(1)   # 3x3 Laplacian -- edge response

Dostupni su isti parametri kao kod gaussian. sharpen=True proizvodi izoštrenu sliku (Laplaceov operator dodan natrag u izvornu umjesto vraćen sam za sebe). mul i add skaliraju odziv.

Praktična upotreba izvan detekcije rubova jest mjerenje fokusa. Laplaceov odziv usrednjen preko područja daje grubu mjeru koliko visokofrekventnog sadržaja područje nosi; na dobro fokusiranoj sličici taj je prosjek visok, na zamućenoj sličici opada. Uspoređivanje Laplaceovog odziva među sličicama jeftin je način da se pita „je li leća fokusirana?” bez potrebe za skupljom metrikom kontrasta.

5.14.4. Metoda find_edges

find_edges() pokreće cjelovit cjevovod za detekciju rubova, a ne samo filtar za odziv rubova. Radi na slikama u sivim tonovima, a rezultat je binarna slika čiji pikseli različiti od nule označavaju položaje gdje ulaz ima onu vrstu promjene svjetline koja se treba računati kao rub.

Metoda prima parametar edge_type koji bira između dva algoritma:

EDGE_SIMPLE pokreće visokopropusni filtar, primjenjuje prag i vraća rezultat. Brzo, ali izlaz uključuje svaku promjenu svjetline iznad praga, uključujući šum i teksturu do kojih aplikaciji vjerojatno nije stalo. Razumno za čiste slike i za slučajeve gdje će šum biti očišćen kasnijim morfološkim prolazom.

EDGE_CANNY pokreće Canny detektor rubova – klasični višestupanjski algoritam. Računa gradijent svjetline, potiskuje svaki odziv koji nije maksimum duž smjera gradijenta (tako da je svaki rub širok jedan piksel) i primjenjuje histerezni prag (tako da se rub koji je negdje jak prati i tamo gdje slabi). Rezultat je čist, tanak, povezan skup piksela ruba kakav želi svaki klasični algoritam temeljen na rubovima.

Parametar threshold je dvoelementna torka (low, high). Za EDGE_CANNY, high vrijednost je granica iznad koje je piksel definitivno rub, a low vrijednost je granica iznad koje je piksel rub samo ako je povezan s definitivnim. Za EDGE_SIMPLE bitna je samo high vrijednost; to je jedina granica iznad koje se piksel računa kao rub. Zadana vrijednost (100, 200) polazna je točka koju vrijedi podesiti za određenu scenu.

img.gaussian(1)                                   # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))

Canny detektor je bolji izbor za gotovo svaku aplikaciju gdje su rubovi važni. Brži EDGE_SIMPLE vrijedi zapamtiti za slučajeve gdje je trošak Cannyja problem, a odbacivanje šuma njegovom histerezom zapravo nije potrebno.

5.14.5. Prilagodljivo pragiranje na Gaussu

Poput statističkih filtara, gaussian() prima par ključnih riječi threshold=True / offset=N za prilagodljivo pragiranje. Ponašanje je isto kao kod mean(): Gaussova statistika na svakom položaju postaje lokalna granica, a izvorni piksel se uspoređuje sa statistikom uvećanom za offset kako bi se proizveo binarni rezultat.

Gaussova varijanta obično je najčišći izbor za prilagodljivo pragiranje kada je ulaz razumno bez šuma. Ponderirani prosjek daje glađu granicu nego što je proizvodi filtar srednje vrijednosti, s manje artefakata na naglim prijelazima osvjetljenja.