5.14. Gaussin tasoitus ja reunat

Kaksi tehtävää hallitsee sitä, mihin naapurustoikkunoita käytetään klassisessa konenäössä: pikselistä pikseliin tapahtuvan vaihtelun tasoitus siististi ja niiden reunojen löytäminen, joissa kuva muuttuu jyrkästi. Gaussin suodatin on ensimmäisen vakiotyökalu, Laplacen-pohjaiset tunnistimet toisen vakiotyökalu – ja ne yhdistyvät, koska jokainen reunantunnistin toimii paremmin kevyesti tasoitetulla syötteellä.

5.14.1. Gaussin suodatin

gaussian() on mean()-suodattimen keskipainotettu serkku. Molemmat laskevat keskiarvon kunkin pikselin naapurustosta, mutta Gaussin painokertoimet eivät ole tasaisia: lähempänä naapuruston keskustaa olevat pikselit painavat enemmän, naapuruston reunalla olevat pikselit vähemmän, ja painokertoimet noudattavat tuttua kellokäyrää, joka antaa suodattimelle nimensä.

Kellomainen painotus on se, mikä tekee Gaussin suodattimesta tasaisemman kuin laatikkokeskiarvo. Keskiarvosuodatus voi tuottaa näkyviä artefakteja objektien reunoilla – painotuksen jyrkkä katkaisu aiheuttaa pieniä värähtelykuvioita jyrkissä siirtymissä. Gaussin tasaisesti laskevat painokertoimet välttävät tämän värähtelyn ja tuottavat tuloksen, joka näyttää lähempänä sitä, miltä ”sumennetun” pitäisi näyttää. Hintana on enemmän pikselikohtaista laskentaa kuin keskiarvosuodattimella, mutta ei dramaattisesti – pikselikohtainen kustannus on edelleen paljon pienempi kuin bilateraalisuodattimella.

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

Gaussin tasoitus on lähes jokaisen reunantunnistusputken vakioensimmäinen vaihe. Kaikki alla olevat reunantunnistimet vahvistavat korkeataajuista sisältöä, mukaan lukien sensorin kohinaa, jota algoritmi ei oikeasti halua tunnistaa. Kevyen Gaussin ajaminen ensin vaimentaa tätä kohinaa pehmentämättä todellisia reunoja paljoakaan, jolloin reunantunnistin löytää todellisia reunoja täplien sijaan.

5.14.2. Epäterävyysmaski

Kuvan Gaussilla sumennettu kopio on raaka-aine, jota epäterävyysmaski-tekniikka käyttää klassiseen terävöintiin. Asettamalla unsharp=True suodattimeen se vaihtuu tilasta ”tuota sumennettu kuva” tilaan ”vähennä sumennettu kuva alkuperäisestä ja lisää erotus takaisin alkuperäiseen” – vaikutuksena on, että korkeataajuiset reunat vahvistuvat suhteessa tasaisiin sisäosiin.

img.gaussian(1, unsharp=True)

Valinnaiset mul- ja add-parametrit skaalaavat epäterävyystuloksen voimakkuutta; oletusarvot (mul=1.0, add=0.0) ovat maltillinen terävöinti, joka ei liioittele sensorin kohinaa.

5.14.3. Laplacen suodatin

laplacian() ajaa diskreetin approksimaation kuvan toisesta paikkaderivaatasta. Tulos on suuri siellä, missä pikseliarvot muuttuvat nopeasti, ja lähellä nollaa siellä, missä ne ovat vakioita tai muuttuvat lineaarisesti. Tuloksen luonteva tulkinta on reunavaste: pikselit, joissa kuva muuttuu nopeasti, syttyvät, ja pikselit tasaisissa sisäosissa pysyvät tummina.

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

Käytettävissä ovat samat parametrit kuin gaussian-metodilla. sharpen=True tuottaa terävöidyn kuvan (Laplacen lisättynä takaisin alkuperäiseen sen sijaan, että se palautettaisiin yksinään). mul ja add skaalaavat vasteen.

Käytännöllinen käyttötarkoitus reunantunnistuksen lisäksi on tarkennuksen mittaus. Alueen yli keskiarvoistettu Laplacen vaste antaa karkean mitan siitä, kuinka paljon korkeataajuista sisältöä alue kantaa; hyvin tarkennetussa kehyksessä tämä keskiarvo on korkea, epäterävässä kehyksessä se laskee. Laplacen vasteen vertaaminen kehysten välillä on halpa tapa kysyä ”onko objektiivi tarkennettu?” ilman, että tarvitaan kalliimpaa kontrastimittaria.

5.14.4. find_edges-metodi

find_edges() ajaa täydellisen reunantunnistusputken eikä pelkkää reunavastesuodatinta. Se toimii harmaasävykuvilla, ja tulos on binäärinen kuva, jonka nollasta poikkeavat pikselit merkitsevät kohdat, joissa syötteessä on sellaista kirkkauden muutosta, joka tulisi lukea reunaksi.

Metodi ottaa edge_type-parametrin, joka valitsee kahden algoritmin väliltä:

EDGE_SIMPLE ajaa ylipäästösuodattimen, soveltaa kynnysarvoa ja palauttaa tuloksen. Nopea, mutta tulos sisältää jokaisen kynnysarvon ylittävän kirkkauden muutoksen, mukaan lukien kohinan ja tekstuurin, joista sovellus ei luultavasti välitä. Järkevä puhtaille kuville ja tapauksiin, joissa kohina aiotaan siivota myöhemmällä morfologisella läpikäynnillä.

EDGE_CANNY ajaa Canny-reunantunnistimen – klassisen monivaiheisen algoritmin. Se laskee kirkkausgradientin, vaimentaa jokaisen ei-maksimaalisen vasteen gradientin suunnassa (jolloin jokainen reuna on yhden pikselin levyinen) ja soveltaa hystereesikynnystä (jolloin reuna, joka on jossakin kohdassa vahva, jäljitetään silloinkin, kun se haalistuu välistä). Tulos on puhdas, ohut, yhtenäinen joukko reunapikseleitä, jollaista jokainen klassinen reunapohjainen algoritmi haluaa.

threshold-parametri on kaksialkioinen monikko (low, high). Tunnistimelle EDGE_CANNY high-arvo on katkaisukohta, jonka yläpuolella pikseli on varmasti reuna, ja low-arvo on katkaisukohta, jonka yläpuolella pikseli on reuna vain, jos se on yhteydessä varmaan reunaan. Tunnistimelle EDGE_SIMPLE vain high-arvolla on merkitystä; se on ainoa katkaisukohta, jonka yläpuolella pikseli luetaan reunaksi. Oletusarvo (100, 200) on lähtökohta, jota kannattaa virittää kohtauksen mukaan.

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

Canny-tunnistin on parempi valinta lähes jokaiseen sovellukseen, jossa reunoilla on merkitystä. Nopeampi EDGE_SIMPLE kannattaa muistaa niitä tapauksia varten, joissa Cannyn kustannus on ongelma eikä sen hystereesin kohinanpoistoa oikeasti tarvita.

5.14.5. Adaptiivinen kynnystys Gaussilla

Kuten tilastolliset suodattimet, gaussian() hyväksyy avainsanaparin threshold=True / offset=N adaptiiviseen kynnystykseen. Toiminta on sama kuin mean()-metodilla: Gaussin tunnusluku kussakin kohdassa muodostuu paikalliseksi katkaisukohdaksi, ja lähdepikseliä verrataan tunnuslukuun plus siirtymä binäärisen tuloksen tuottamiseksi.

Gaussin variantti on yleensä siistein valinta adaptiiviseen kynnystykseen, kun syöte on kohtuullisen kohinaton. Painotettu keskiarvo antaa tasaisemman katkaisukohdan kuin keskiarvosuodatin, ja artefakteja on vähemmän jyrkissä valaistussiirtymissä.