5.13. Lineaariset ja naapurustosuodattimet¶
Aiemmin tässä luvussa esitellyt pikselimatematiikan operaatiot yhdistivät kaksi kuvaa piste pisteeltä. Suodattimet tekevät vastaavaa työtä eri tavalla: ne laskevat jokaisen tuloskuvan pikselin arvon vastaavaa kohtaa ympäröivästä pienestä tulopikseleiden naapurustosta. Kohdan (x, y) tulos on jokin tilastollinen suure – keskiarvo, mediaani tai yleisin arvo – kohtaan (x, y) keskitetyn pienen laatikon sisällä olevista tulopikseleistä.
Tämä pieni näkökulman muutos – siirtyminen yhdestä pikselistä kerrallaan pikseli-ikkunaan kerrallaan – on se, mikä saa kokonaisen hyödyllisten operaatioiden perheen toimimaan. Yksinkertainen keskiarvotus pienen ikkunan yli tasoittaa sensorin kohinaa. Mediaani saman ikkunan yli poistaa yksittäisen pikselin pisteet ilman, että reunat pehmenevät yhtä paljon. Bilateraalinen keskiarvotus kieltäytyy tasoittamasta voimakkaiden kontrastirajojen yli, säilyttäen kohteiden reunat samalla kun se siistii niiden sisäisiä tekstuureja. Naapurusto on työn yksikkö; tilastollisen suureen valinta määrää, mitä suodatin tekee.
5.13.1. Ytimen koko¶
Jokainen naapurustosuodatin ottaa size-parametrin, joka asettaa ikkunan säteen pikseleinä. Ikkuna itsessään on neliön muotoinen ja kattaa (2 * size + 1) pikseliä kullakin sivulla – joten size=1 tarkoittaa 3 kertaa 3 -naapurustoa, size=2 tarkoittaa 5 kertaa 5 -naapurustoa, size=3 tarkoittaa 7 kertaa 7 -naapurustoa ja niin edelleen.
Naapurusto liukuu kuvan poikki yksi pikseli kerrallaan, vasemmasta yläkulmasta oikeaan alakulmaan. Jokainen tuloskuvapikseli on tulos siitä, kun suodattimen tilastollinen suure lasketaan siihen keskitetystä tulonaapurustosta.¶
Suuremmat koot tarkoittavat suurempia naapurustoja, mikä tarkoittaa tasaisempaa (tai aggressiivisempaa) suodatusta. Kustannus kasvaa ikkunan pinta-alan mukaan, joten size=3-suodatin tekee pikseliä kohti noin yhdeksän kertaa enemmän työtä kuin size=1-suodatin. Käytännöllinen oletusarvo useimpaan siistimistyöhön on size=1 tai size=2; tartu suurempiin kokoihin vain silloin, kun pienet naapurustot eivät riitä vaimentamaan sitä piirrettä, jota sovellus yrittää vaimentaa.
5.13.2. Keskiarvosuodatin¶
mean() korvaa jokaisen pikselin sen naapuruston aritmeettisella keskiarvolla. Tulos tasoittaa pikselistä toiseen tapahtuvaa vaihtelua ikkunan koon yli, mikä tekee siitä halvimman tavan vaimentaa sensorikohinan pisteitä: korkeataajuinen vaihtelu keskiarvoistuu pois, matalataajuinen sisältö säilyy.
Kompromissina reunat ja muut terävät piirteet keskiarvoistuvat myös. Kirkas reuna, joka oli ennen suodatusta yhden pikselin levyinen, on size=1-keskiarvosuodatuksen jälkeen kahden tai kolmen pikselin levyinen, ja kirkkaus laskee loivasti reunoilta. Puhtaaseen kohinanvaimennukseen tekstuuriköyhässä kuvassa (puhdas seinä, värillisen tussin sisäpuoli) kompromissi on hyvä. Vilkkaassa näkymässä, jossa reunoilla on merkitystä, jokin seuraavista suodattimista sopii yleensä paremmin.
img.mean(1) # 3x3 box average -- fast, gentle smoothing
img.mean(2) # 5x5 box average -- stronger, slower
5.13.3. Mediaani, moodi, keskipiste¶
Kolme muuta tilastollista naapurustosuodatinta vaihtavat yksinkertaisen aritmeettisen keskiarvon johonkin, joka kestää paremmin poikkeavia arvoja.
median() palauttaa naapuruston mediaanin – arvon, joka päätyy ikkunan pikselien lajitellun listan keskelle. Yksi hyvin kirkas tai hyvin tumma pikseli ikkunassa ei vedä mediaania puoleensa; siitä tulee vain yksi hylätyistä ääriarvoista. Käytännön vaikutus on, että mediaanisuodatus poistaa yksittäisen pikselin pisteet ja suola-pippuri-kohinan pehmentämättä reunoja niin kuin mean tekee. Kustannuksena on enemmän laskentaa pikseliä kohti – ikkunan lajittelu on hitaampaa kuin sen keskiarvotus – eikä tulos ole tiukasti ottaen keskiarvo, millä on joskus merkitystä myöhemmälle laskennalle.
percentile-parametri (oletus 0.5) siirtää valitun arvon pois tiukasta mediaanista. percentile=0.0 palauttaa naapuruston minimin, percentile=1.0 maksimin; väliarvot poimivat suhteellisesti niiden väliltä lajitellussa ikkunassa. Tämä antaa median-suodattimelle kyvyn korostaa naapuruston tummia tai kirkkaita osia menettämättä järjestystilaston poikkeamankestävyyttä.
mode() palauttaa naapuruston yleisimmän arvon. Hyödyllinen silloin, kun kohinamalli on ”useimmat pikselit ovat oikein, muutama on vahingoittunut eriasteisesti”, missä oikea vastaus on se arvo, joka esiintyy useimmin – minkä mediaani voi ohittaa, kun vahingoittuneet arvot kasautuvat lajitellun ikkunan toiselle puolelle.
midpoint() palauttaa painotetun yhdistelmän naapuruston minimistä ja maksimista – bias=0.5 antaa niiden välisen keskipisteen, bias=0.0 antaa minimin, bias=1.0 antaa maksimin. Käytetään harvemmin kuin muita, mutta hyvä tuntea silloin, kun tavoitteena on nimenomaan tummien tai kirkkaiden piirteiden poimiminen.
5.13.4. Bilateraalinen, reunat säilyttävä versio¶
bilateral() on naapurustosuodattimista se, jonka kannattaa ymmärtää parhaiten. Se tuottaa mean()-suodattimen tasoittavan vaikutuksen, mutta lisärajoituksella: mitä enemmän naapuruston pikseli eroaa keskuspikselistä, sitä vähemmän se vaikuttaa keskiarvoon. Tulos tasoittaa jokaisen yhtenäisen alueen sisäpuolen vuotamatta niitä erottavien reunojen yli, mikä on juuri sitä, mitä useimmat sovellukset todella haluavat.
Kaksi parametria ohjaa, kuinka aggressiivisesti suodatin alentaa pikselien painoa:
color_sigmapäättää, miten värierot vaikuttavat painotukseen. Pienemmät arvot tarkoittavat, että suodatin on tiukempi alentaessaan keskuspikselistä eroavien pikselien painoa.space_sigmapäättää, miten spatiaalinen etäisyys vaikuttaa painotukseen. Pienemmät arvot antavat enemmän painoa lähellä keskusta oleville pikseleille.
Oletusarvot (color_sigma=0.1, space_sigma=1.0) ovat järkeviä lähtökohtia; niiden virittäminen on yleensä asia, jossa suodatinta ajetaan näytekehyksellä ja säädetään, kunnes reunat ovat terävät ja sisäpuolet puhtaat.
Bilateraalinen on kalliimpi kuin median() ja huomattavasti kalliimpi kuin mean(), joten siihen kannattaa tarttua vain silloin, kun reunat säilyttävä käyttäytyminen on se, mitä sovellus tarvitsee.
5.13.5. Adaptiivinen kynnystäminen¶
Keskiarvo-, mediaani-, moodi- ja keskipistesuodattimilla on kaikilla sama avainsanaparametripari, joka muuttaa niiden tuloksen binääriseksi kynnysarvoksi:
threshold=Truevaihtaa suodattimen kynnystystilaan.offset=Nsiirtää paikallista raja-arvoaNyksiköllä ennen vertailua.
Mekanismi rakentuu suoraan suodattimen tavallisen käyttäytymisen päälle. Ilman threshold=True-asetusta suodatin laskee tilastollisen suureensa naapuruston yli ja kirjoittaa sen tuloskuvapikseliin. threshold=True-asetuksella suodatin laskee saman tilastollisen suureen, vertaa sitten lähdepikseliä samassa kohdassa tilastolliseen suureeseen plus siirtymään, ja kirjoittaa formaatin maksimiarvon, jos lähde on suurempi, muutoin nollan.
Tulos on binäärikuva, jonka raja-arvo liikkuu paikallisen kirkkauden mukana koko kehyksen yli. Kirkkaat alueet saavat korkean raja-arvon, himmeät alueet matalan raja-arvon, ja etualan pikseli, joka on paikallisesti naapureitaan kirkkaampi, osuu kohdalleen riippumatta siitä, sijaitseeko se kirkkaalla vai himmeällä alueella – mikä on juuri sitä käyttäytymistä, jota yksi globaali kynnysarvo ei voinut tuottaa epätasaisesti valaistussa kuvassa.
img.mean(3, threshold=True, offset=5)
offset-parametri on se, missä sovellus ohjaa, kuinka tiukka testi on. Pieni positiivinen siirtymä vaatii, että lähdepikseli on mitattavasti naapureitaan kirkkaampi ennen kuin se lasketaan osumaksi, mikä vaimentaa sensorikohinan vääriä positiivisia siihen hintaan, että heikko etuala putoaa pois. Pieni negatiivinen siirtymä saa kiinni heikon etualan siihen hintaan, että osa kohinasta pääsee läpi. Valinta riippuu siitä, mitä putken loppuosa aikoo tehdä binääritulosteella.
Epätasaisessa valaistuksessa yksi globaali kynnysarvo ei voi kuvata etualaa jokaisessa kohdassa. threshold=True-asetuksella ajettu naapurustosuodatin tuottaa raja-arvon, joka liikkuu paikallisen kirkkauden mukana ja luokittelee etualan oikein koko kehyksen yli.¶
Suodatinperhe ajaa adaptiivisen kynnysarvon, joten oikean suodattimen valinnalla on merkitystä: mean() halvimpaan adaptiiviseen kynnysarvoon, median() silloin, kun tulossa on suola-pippuri-kohinaa, jonka suodattimen tulisi hylätä ennen paikallisen raja-arvon laskemista.