5.15. Morfologiset operaatiot

Morfologiset operaatiot toimivat binäärikuvilla – maskeilla, jotka tulevat kynnystämisestä ja reunantunnistuksesta. Jokainen operaatio kulkee samanlaisen liukuvan naapuruston läpi kuin tasoitussuodattimet käyttävät, mutta kysymys, jonka se esittää jokaisessa kohdassa, on kyllä/ei: onko jokainen naapuruston pikseli päällä, onko jokin naapuruston pikseli päällä, miltä päällä/pois-kuvio näyttää? Vastaukset kasvattavat alueita, kutistavat niitä ja muotoilevat niiden rajoja uudelleen tavoilla, joihin keskiarvosuodatin ei pysty.

Morfologia on se, mikä tulee alkuperäisen binäärimaskin – kynnystämisen, reunantunnistuksen tai jonkin muun luokittimen tuloksen – ja sen puhtaan binäärimaskin väliin, jota putken loppuosa voi käyttää. Raa’assa kynnystulosteessa on yleensä eristyneitä kohinapikseleitä siroteltuna todellisille etualan alueille, pieniä reikiä lyötynä muuten yhtenäisiin alueisiin sekä rosoisia rajoja kohdissa, joissa kynnys leikkasi lähelle kohteen reunaa. Morfologia poistaa nämä viat.

5.15.1. Neljä klassista operaatiota

Kaksi alkeisoperaatiota ja kaksi niiden yhdistelmää muodostavat morfologisen työkalupakin:

dilate() kasvattaa jokaista etualan aluetta. Sääntö on: mistä tahansa pikselistä, jolla on vähintään yksi etualan naapuri sen (2 * size + 1)-ikkunassa, tulee etualaa. Näkyvä vaikutus on, että etualan alueet kasvavat size pikseliä joka suuntaan, ja niiden sisällä olevat reiät kutistuvat (tai katoavat) saman verran.

erode() tekee päinvastoin. Mistä tahansa pikselistä, jolla ei ole jokaista naapuria ikkunassaan etualalla, tulee taustaa. Etualan alueet pienenevät size pikseliä joka suuntaan, eristyneet etualan pikselit (joilla ei ole etualan naapureita) katoavat kokonaan, ja pienet yhteydet suurempien alueiden välillä katkeavat.

Binäärinen tuloalue vasemmanpuoleisimmassa paneelissa: yhtenäinen neliö, jonka keskellä on yhden pikselin reikä ja sen ympärillä kolme eristynyttä kohinapikseliä. Neljä paneelia oikealla näyttävät dilate-, erode-, open- ja close-operaatioiden tuloksen tähän tuloon sovellettuna. Dilate kasvattaa aluetta, täyttää reiän ja kasvattaa jokaisen kohinapikselin lohkoksi; erode kutistaa aluetta, kasvattaa reikää ja poistaa kohinan; open poistaa kohinan toistaen samalla alueen ja sen reiän tarkalleen; close täyttää reiän toistaen samalla alueen ääriviivan ja kohinapikselit tarkalleen.

Neljä klassista morfologista operaatiota kohinaiseen binäärialueeseen sovellettuna. Erode kutistaa; dilate kasvattaa; open on erode ja sitten dilate (poistaa kohinan); close on dilate ja sitten erode (täyttää reiät).

open() on erode ja sen jälkeen dilate. Erodoidusta kuvasta on poistettu jokainen eristynyt kohinapikseli, mutta se on myös kutistunut size pikseliä joka suuntaan. Kun erode-operaatiota seuraa samankokoinen dilate, todelliset etualan alueet palautetaan suunnilleen alkuperäisille rajoilleen samalla kun kohina pysyy poissa. Yhdistelmä on se, mikä tekee open-operaatiosta klassisen morfologian vakio-operaation ”poista kohina”: eristyneet etualan pikselit katoavat, todelliset alueet palaavat vahingoittumattomina.

close() on peilikuva – dilate ja sen jälkeen erode. Dilate täyttää pienet reiät etualan alueiden sisällä ja yhdistää pienillä raoilla erotetut alueet; erode kutistaa tuloksen takaisin alkuperäiseen ulkorajaansa jättäen täytetyn sisäpuolen yhtenäiseksi. close on vakio-operaatio ”täytä pienet raot”.

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

Size-parametrilla on sama merkitys kuin kirkkaussuodattimissa: size=1 tarkoittaa 3 kertaa 3 -naapurustoa, size=2 tarkoittaa 5 kertaa 5 -naapurustoa ja niin edelleen. Suuremmat koot tarkoittavat aggressiivisempaa siistimistä – ja pidempää pikselikohtaista kustannusta.

5.15.2. Top-hat ja black-hat

Kaksi muuta yhdistelmää on hyvä tuntea, koska ne poimivat tarkalleen ne piirteet, jotka open ja close poistavat:

top_hat() palauttaa erotuksen alkuperäisen kuvan ja sen open-version välillä – ne etualan pikselit, jotka open olisi poistanut. Se on kirjaimellisesti maski kohinapikseleistä, eristyneistä pienistä etualan alueista ja ohuista etualan rakenteista, joita open-operaatio ei voinut säilyttää. Hyödyllinen pienten etualan piirteiden poimimiseen silloin, kun nämä piirteet ovat se, mistä sovellus on kiinnostunut, niiden poistamisen sijaan.

black_hat() palauttaa erotuksen kuvan close-version ja alkuperäisen välillä – ne taustan pikselit, jotka close olisi täyttänyt. Se on maski etualan alueiden sisällä olevista pienistä rei’istä ja alueiden välisistä kapeista raoista, jotka close-operaatio olisi sillannut.

Molempiin tartutaan harvemmin kuin neljään perusoperaatioon, mutta kuvio kannattaa muistaa – kun sovelluksen tarvitsee poimia pieniä tai ohuita piirteitä, jotka vakiosiistimisajo poistaa, top-hat ja black-hat ovat luonnollinen tapa saada ne takaisin.

5.15.3. Kynnystila

Kaikki neljä morfologista perusoperaatiota hyväksyvät kokonaisluku-threshold-avainsanan, joka pehmentää päällä/pois-testiä jokaisessa kohdassa. Ilman sitä operaatiot käyttäytyvät yllä olevien kuvausten mukaisesti: erode() vaatii, että jokainen naapuri on päällä, dilate() vaatii vähintään yhden. Kun threshold on asetettu, jokainen operaatio sietää sen verran toisin äänestäviä naapureita. Erode-operaatiossa threshold on niiden taustanaapureiden määrä, joita pikselillä saa olla ja silti säilyä: threshold=4 säilyttää minkä tahansa pikselin, jolla on vähintään neljä sen kahdeksasta naapurista päällä (3 kertaa 3 -ikkunassa keskuspikselillä on kahdeksan naapuria), joten se ei erodoi yhtä aggressiivisesti. Dilate-operaatiossa threshold on niiden etualanaapureiden määrä, jotka taustapikselillä täytyy olla enemmän ennen kuin se kytkeytyy päälle: threshold=2 vaatii vähintään kolme etualan naapuria yhden sijaan, joten se kasvaa vähemmän aggressiivisesti.

Kynnysmuoto on hyödyllinen morfologisen ajon aggressiivisuuden virittämiseen muuttamatta sen ikkunan kokoa, mikä muuttaisi myös niiden piirteiden mittakaavaa, joihin se vaikuttaa. Useimmat sovellukset pitäytyvät oletuskäyttäytymisessä; kynnysmuoto on olemassa niitä tapauksia varten, joissa oletus on juuri hieman liikaa tai liian vähän.