5.15. Morfološke operacije

Morfološke operacije rade na binarnim slikama – maskama koje izlaze iz postavljanja praga i detekcije rubova. Svaka operacija prolazi istu vrstu klizećeg susjedstva koju koriste filtri za izglađivanje, ali pitanje koje postavlja na svakom položaju je da/ne: je li svaki piksel u susjedstvu uključen, je li bilo koji piksel u susjedstvu uključen, kako izgleda uzorak uključeno/isključeno? Odgovori povećavaju područja, smanjuju ih i ponovno režu njihove granice na načine koje filtar uprosječivanja ne može.

Morfologija je ono što dolazi između početne binarne maske – izlaza postavljanja praga, detekcije rubova ili nekog drugog klasifikatora – i čiste binarne maske koju ostatak cjevovoda može koristiti. Sirovi izlaz praga obično ima izolirane piksele šuma raspršene kroz područja istinskog prednjeg plana, male rupe probijene u inače čvrstim područjima i nazubljene granice gdje je prag zarezao blizu ruba objekta. Morfologija uklanja te nedostatke.

5.15.1. Četiri klasične operacije

Dvije primitivne operacije i dvije njihove kompozicije čine morfološki komplet alata:

dilate() povećava svako područje prednjeg plana. Pravilo je: svaki piksel koji ima barem jednog susjeda prednjeg plana u svom prozoru (2 * size + 1) postaje prednji plan. Vidljivi učinak je da područja prednjeg plana postaju veća za size piksela u svakom smjeru, a rupe unutar njih se smanjuju (ili nestaju) za isti iznos.

erode() radi obrnuto. Svaki piksel koji nema svakog susjeda u svom prozoru u prednjem planu postaje pozadina. Područja prednjeg plana postaju manja za size piksela u svakom smjeru, izolirani pikseli prednjeg plana (koji nemaju susjeda prednjeg plana) potpuno nestaju, a male veze između većih područja se prekidaju.

Binarno ulazno područje u krajnjoj lijevoj ploči: čvrst kvadrat s rupom od jednog piksela u sredini i tri izolirana piksela šuma oko njega. Četiri ploče udesno prikazuju rezultat primjene dilate, erode, open i close na taj ulaz. Dilate povećava područje, popunjava rupu i povećava svaki piksel šuma u blok; erode smanjuje područje, povećava rupu i uklanja šum; open uklanja šum dok vjerno reproducira područje i njegovu rupu točno; close popunjava rupu dok vjerno reproducira obris područja i piksele šuma točno.

Četiri klasične morfološke operacije primijenjene na binarno područje sa šumom. Erode smanjuje; dilate povećava; open je erode pa dilate (uklanja šum); close je dilate pa erode (popunjava rupe).

open() je erode iza kojeg slijedi dilate. Erodiranoj slici uklonjen je svaki izolirani piksel šuma, ali je također smanjena za size piksela u svakom smjeru. Praćenje erode s dilate iste veličine vraća prava područja prednjeg plana otprilike na njihove izvorne granice dok šum ostaje uklonjen. Kompozicija je ono što čini open standardnom operacijom „ukloni šum” u klasičnoj morfologiji: izolirani pikseli prednjeg plana nestaju, prava područja se vraćaju neoštećena.

close() je zrcalna slika – dilate iza kojeg slijedi erode. Dilate popunjava male rupe unutar područja prednjeg plana i povezuje područja razdvojena malim razmacima; erode smanjuje rezultat natrag na njegovu izvornu vanjsku granicu dok popunjena unutrašnjost ostaje čvrsta. close je standardna operacija „popuni male razmake”.

binary_mask.open(1)       # remove single-pixel noise
binary_mask.close(2)      # fill small holes and gaps

Parametar size ima isto značenje kao u filtrima svjetline: size=1 znači susjedstvo 3 puta 3, size=2 znači 5 puta 5, i tako dalje. Veće veličine znače agresivnije čišćenje – i dulji trošak po pikselu.

5.15.2. Top-hat i black-hat

Dvije daljnje kompozicije vrijedi poznavati jer izvlače upravo one značajke koje open i close uklanjaju:

top_hat() vraća razliku između izvorne slike i njezine otvorene inačice – piksele prednjeg plana koje bi open uklonio. To je doslovno maska piksela šuma, izoliranih malih područja prednjeg plana, tankih struktura prednjeg plana koje operacija open nije mogla sačuvati. Korisno za izvlačenje malih značajki prednjeg plana kada su te značajke ono do čega je aplikaciji stalo, umjesto da ih uklanja.

black_hat() vraća razliku između zatvorene inačice slike i izvornika – piksele pozadine koje bi close popunio. To je maska malih rupa unutar područja prednjeg plana, uskih razmaka između područja koje bi operacija close premostila.

Za obje se poseže rjeđe nego za četiri osnovne operacije, ali obrazac vrijedi zapamtiti – kada aplikacija treba izvući male ili tanke značajke koje standardni prolaz čišćenja uklanja, top-hat i black-hat prirodan su način da ih se vrati.

5.15.3. Način praga

Sve četiri osnovne morfološke operacije prihvaćaju cjelobrojni ključni argument threshold koji omekšava test uključeno/isključeno na svakom položaju. Bez njega operacije se ponašaju onako kako su opisi gore rekli: erode() zahtijeva da svaki susjed bude uključen, dilate() zahtijeva barem jednog. S postavljenim threshold svaka operacija tolerira toliko susjeda koji glasaju suprotno. Za erode, threshold je broj susjeda pozadine koje piksel smije imati i još preživjeti: threshold=4 zadržava svaki piksel s barem četiri od svojih osam susjeda uključena (u prozoru 3 puta 3 središnji piksel ima osam susjeda), pa ne erodira tako agresivno. Za dilate, threshold je broj susjeda prednjeg plana koje piksel pozadine mora imati više prije nego što se uključi: threshold=2 zahtijeva barem tri susjeda prednjeg plana umjesto jednog, pa raste manje agresivno.

Oblik s pragom koristan je za ugađanje agresivnosti morfološkog prolaza bez mijenjanja veličine njegova prozora, što bi također promijenilo razmjer značajki na koje djeluje. Većina aplikacija drži se zadanog ponašanja; oblik s pragom postoji za slučajeve kada je zadano tek malo previše ili premalo.