5.13. Lineáris és környezeti szűrők

A fejezet korábbi részében tárgyalt képpontaritmetikai műveletek két képet pontról pontra kombináltak. A szűrők hasonló munkát végeznek, csak más módon: minden kimeneti képpont értékét a megfelelő pozíciót körülvevő bemeneti képpontok egy kis környezetéből számítják ki. A kimenet a (x, y) pozíción valamilyen statisztika – az átlag, a medián, a leggyakoribb érték – az (x, y) köré középre helyezett kis dobozban lévő bemeneti képpontokból.

Ez az apró nézőpontváltás – az egyszerre egy képpontról az egyszerre egy képpontablakra való áttérés – teszi lehetővé egy egész sor hasznos művelet működését. Egy kis ablakra vett egyszerű átlag elsimítja az érzékelő zaját. Ugyanazon ablak mediánja eltávolítja az egyetlen képpontos foltokat anélkül, hogy az éleket annyira elmosná. Egy bilaterális átlag nem hajlandó simítani az erős kontrasztú határokon át, így megőrzi az objektumok éleit, miközben megtisztítja a bennük lévő textúrákat. A környezet a munka egysége; a statisztika megválasztása dönti el, hogy a szűrő mit csinál.

5.13.1. A kernel mérete

Minden környezeti szűrő egy size paramétert vesz át, amely az ablak sugarát állítja be képpontokban. Maga az ablak négyzet alakú, és minden oldalon (2 * size + 1) képpontot fed le – tehát a size=1 3-szor-3-as környezetet jelent, a size=2 5-ször-5-öst, a size=3 7-szer-7-est, és így tovább.

Egy kis képrács, amelyen ki van emelve egy 3-szor-3-as alrács, amely a szűrő környezetét ábrázolja. Egy nyíl mutatja, ahogy a környezet egy képponttal jobbra csúszik. Egy második nyíl mutatja, ahogy a sor végén lecsúszik a következő sorba. Az egyes pozíciókhoz tartozó kimeneti képpont a környezet alatt van rajzolva, egy kis megjegyzéssel arról, hogy a kimenet a bemeneti környezet valamilyen statisztikája.

A környezet egyszerre egy képponttal csúszik végig a képen, a bal felső saroktól a jobb alsóig. Minden kimeneti képpont a szűrő statisztikájának a rá középre helyezett bemeneti környezetre való alkalmazásának eredménye.

A nagyobb méretek nagyobb környezeteket jelentenek, ami simább (vagy agresszívabb) szűrést jelent. A költség az ablak területével együtt nő, így egy size=3 szűrő képpontonként körülbelül kilencszer annyi munkát végez, mint egy size=1 szűrő. A legtöbb tisztító munkához a gyakorlati alapérték a size=1 vagy size=2; nagyobb méretekhez csak akkor nyúljon, ha a kis környezetek nem elegendőek az alkalmazás által elnyomni kívánt jellemző elnyomásához.

5.13.2. Az átlagszűrő

mean() minden képpontot a környezetének számtani átlagával helyettesít. Az eredmény elsimítja a képpontról képpontra mutatkozó eltérést az ablak méretén belül, ami a legolcsóbb módja az érzékelőzaj elnyomásának: a nagyfrekvenciás eltérés kiátlagolódik, az alacsonyfrekvenciás tartalom megmarad.

A kompromisszum az, hogy az élek és más éles jellemzők szintén kiátlagolódnak. Egy fényes él, amely a szűrő előtt egy képpont széles volt, egy size=1 átlagszűrő után két vagy három képpont széles lesz, a fényerő pedig a széleken lefelé lejt. Tiszta zajcsökkentéshez egy textúraszegény képen (egy tiszta fal, egy színes filctoll belseje) a kompromisszum rendben van. Egy zsúfolt jeleneten, ahol az élek számítanak, a következő szűrők egyike általában jobban illik.

img.mean(1)        # 3x3 box average -- fast, gentle smoothing
img.mean(2)        # 5x5 box average -- stronger, slower

5.13.3. Medián, módusz, középpont

A másik három statisztikai környezeti szűrő az egyszerű számtani átlagot valami olyasmire cseréli, ami robusztusabb a kiugró értékekkel szemben.

median() a környezet mediánját adja vissza – azt az értéket, amely az ablak képpontjainak rendezett listájának közepén végzi. Egyetlen nagyon fényes vagy nagyon sötét képpont az ablakban nem húzza el a mediánt; egyszerűen csak az eldobott szélső értékek egyikévé válik. A gyakorlati hatás az, hogy a mediánszűrés eltávolítja az egyetlen képpontos foltokat és a só-bors zajt anélkül, hogy úgy elmosná az éleket, ahogy a mean teszi. A költség képpontonként több számítás – egy ablak rendezése lassabb, mint az átlagolása – és az eredmény szigorúan véve nem átlag, ami néha számít a downstream matematikánál.

Egy percentile paraméter (alapértéke 0.5) elmozdítja a kiválasztott értéket a szigorú mediántól. A percentile=0.0 a környezet minimumát adja vissza, a percentile=1.0 a maximumát; a közbenső értékek arányosan választanak közöttük a rendezett ablakban. Ez megadja a median számára azt a képességet, hogy a környezet sötét vagy fényes részeit hangsúlyozza anélkül, hogy elveszítené a rendezési statisztika kiugróérték-robusztusságát.

mode() a környezet leggyakoribb értékét adja vissza. Akkor hasznos, amikor a zajmodell az, hogy „a legtöbb képpont helyes, néhányat különböző mértékben rontottak el”, ahol a helyes válasz az, amelyik érték a leggyakrabban fordul elő – amit a medián elhibázhat, amikor a rontott értékek a rendezett ablak egyik oldalán halmozódnak fel.

midpoint() a környezet minimumának és maximumának súlyozott kombinációját adja vissza – a bias=0.5 a kettő közötti középpontot adja, a bias=0.0 a minimumot, a bias=1.0 a maximumot. Kevésbé gyakran használt, mint a többi, de érdemes tudni róla, amikor a cél kifejezetten a sötét vagy fényes jellemzők kinyerése.

5.13.4. Bilaterális, az élmegőrző változat

bilateral() a leginkább érdemes alaposan megérteni környezeti szűrő. Ugyanazt a simító hatást hozza létre, mint a mean(), de egy plusz megkötéssel: minél jobban különbözik egy környezeti képpont a középső képponttól, annál kevésbé számít az átlagban. Az eredmény minden egyenletes terület belsejét elsimítja anélkül, hogy átszivárogna az őket elválasztó éleken, ami pontosan az, amit a legtöbb alkalmazás valójában szeretne.

Két paraméter szabályozza, hogy a szűrő milyen agresszívan veszi figyelembe kevésbé a képpontokat:

  • A color_sigma dönti el, hogy a színkülönbség hogyan befolyásolja a súlyozást. A kisebb értékek azt jelentik, hogy a szűrő szigorúbban veszi figyelembe kevésbé a középponttól eltérő képpontokat.

  • A space_sigma dönti el, hogy a térbeli távolság hogyan befolyásolja a súlyozást. A kisebb értékek nagyobb súlyt adnak a középponthoz közeli képpontoknak.

Az alapértékek (color_sigma=0.1, space_sigma=1.0) ésszerű kiindulási pontok; a hangolásuk általában csak annyiból áll, hogy lefuttatja a szűrőt egy mintaképkockán, és addig állítgatja, amíg az élek élesek és a belső területek tiszták nem lesznek.

A bilaterális drágább, mint a median(), és lényegesen drágább, mint a mean(), ezért csak akkor érdemes hozzá nyúlni, amikor az élmegőrző viselkedés az, amire az alkalmazásnak szüksége van.

5.13.5. Adaptív küszöbölés

Az átlag-, medián-, módusz- és középpontszűrők mind ugyanazt a kulcsszó-argumentumpárt hordozzák, amely a kimenetüket bináris küszöbértékké alakítja:

  • A threshold=True küszöbölési módba kapcsolja a szűrőt.

  • Az offset=N a helyi vágási értéket N egységgel eltolja az összehasonlítás előtt.

A mechanizmus közvetlenül a szűrő szokásos viselkedésére épül. A threshold=True nélkül a szűrő kiszámítja a statisztikáját a környezet felett, és ezt a statisztikát írja a kimeneti képpontba. A threshold=True esetén a szűrő ugyanazt a statisztikát számítja ki, majd összehasonlítja az ugyanazon a pozíción lévő forrás képpontot a statisztika plusz az eltolás összegével, és a forrás nagyobb értéke esetén a formátum maximális értékét írja, egyébként nullát.

Az eredmény egy bináris kép, amelynek a vágási értéke a helyi fényerővel együtt mozog a képkockán át. A fényes területek magas vágási értéket kapnak, a homályos területek alacsonyat, és egy előtér-képpont, amely lokálisan fényesebb a szomszédainál, illeszkedik, akár fényes, akár homályos területen van – ami pontosan az a viselkedés, amelyet egyetlen globális küszöbérték nem tudna előállítani egyenetlenül megvilágított képen.

img.mean(3, threshold=True, offset=5)

Az offset paraméter az, ahol az alkalmazás szabályozza, hogy a teszt mennyire szigorú. Egy kis pozitív eltolás megköveteli, hogy a forrás-képpont mérhetően fényesebb legyen a szomszédainál, mielőtt találatnak számítana, ami elnyomja az érzékelőzaj okozta téves találatokat a halvány előtér elvesztésének árán. Egy kis negatív eltolás elkapja a halvány előteret azon az áron, hogy némi zajt átenged. A választás attól függ, hogy a folyamat többi része mit fog kezdeni a bináris kimenettel.

Három képpanel egy sorban. Az első egy bemeneti szürkeárnyalatos képkocka fényerő-gradienssel és egyenletes sötétséggel szétszórt előtérjelekkel. A második panel a rá alkalmazott globális küszöbértéket mutatja: az előtér a fényes oldalon helyesen van osztályozva, de az egész sötét oldal előtérként olvasódik be, mert a háttér és az előtér is a vágási érték alá esik. A harmadik panel az ugyanarra a bemenetre alkalmazott adaptív küszöbértéket mutatja: az előtér az egész képkockán át helyesen van osztályozva.

Egyenetlen megvilágítás mellett egyetlen globális küszöbérték nem tudja leírni az előteret minden pozíción. Egy threshold=True beállítással futtatott környezeti szűrő olyan vágási értéket állít elő, amely a helyi fényerővel együtt mozog, és helyesen osztályozza az előteret az egész képkockán át.

A szűrőcsalád futtatja az adaptív küszöbértéket, így a megfelelő szűrő kiválasztása számít: mean() a legolcsóbb adaptív küszöbértékhez, median() akkor, amikor a bemenet só-bors zajt tartalmaz, amelyet a szűrőnek el kell utasítania a helyi vágási érték kiszámítása előtt.