Valami a kép elmosódását a shaderek
Sőt, annak érdekében, hogy elhomályosítja a képet kell valahogy átlagolt értékei minden pixel színét a színek szomszédai egy bizonyos tartományon belül. Ez a tartomány fogják hívni egy elmosódott sugara. A kézenfekvő megoldás a következő:, hogy meghatározza a színértékeket minden egyes pixel található, amely nem tovább, mint az elmosódás sugara a jelenlegi, az X és Y koordinátákat, majd megosztja őket a tér a két folt sugara plusz egy (mivel mi balra, jobbra, felső és alsó válasszuk pixeles távolság nem nagyobb, mint a sugár a központi pixel +). Azonban nézzük hány pixel van, hogy ki a képet. Ennek az az eredménye kódot:
lesz az értéke egyenlő (1 + 2 • R) • (1 + 2 • r), ahol R - a sugara a folt. Elmosódottabbá sugár = 10 kapunk 441 minta! Ez egy hatalmas nehézség, ami nem mindig lehet használni. Ez egyszerűsítése ez a komplexitás, és jött a kétmenetes algoritmus blur. A lényege az ilyen algoritmusok, hogy a kép homályos első vízszintes (vagy függőleges) és tárolni az ideiglenes képet, majd az így kapott kép elmosódott a másik irányba. Ebben az esetben megkapjuk a komplexitás (1 + 2 • R) + (1 + 2 • R). Elmosódottabbá sugara = 10, megkapjuk 42 mintát pixelenként, ami majdnem az R-szer kevesebb.
Továbbá, a súlya pixelek figyelembe kell venni az elmosódás. Amikor ennek változatai állíthatók elő különböző eredményeket. Tehát, ha az összes képpont ugyanaz lesz a súlya, megkapjuk az átlagolt képet. Ha nagyobb súllyal a középső pixel, mint a határidőt, az izobazhenie lesz „koncentrált”. A változás a skála, akkor használja a különböző forgalmazási törvényi, ismert matematikai statisztika.
Tehát nézd meg a fő kétmenetes algoritmus blur. Például, hogy csak egy ilyen eredeti kép:
Átlagolása szomszédos képpontok
Ez a legegyszerűbb algoritmus. Az általunk használt egységes forgalmazási szabályokat. Ebben az esetben az összes képpont ugyanaz lesz a súlya. Hagyja blur sugár értéke tíz:
21, a bűvös szám összege tömegnek a szomszédos pixelek között (természetesen a blur sugár egyenlő 10). Ezen szám, akkor meg kell osztani az összeget a színek szomszédos képpontok. Mint látható, az összeg a központi és a szomszédos pixelek között (mindkét oldalon) pontosan megegyezik az érték 2 * R + 1. Tehát nincs szükség kiszámításához az összeg.
Tekintsük a végrehajtása ezen algoritmus a GLSL shader nyelv
Az input paramétereket a mintavevő az eredeti kép és a három-komponensű vektor, amely tartalmazza azt a lépést, és az elmosódás sugara. Lépés elmosódás ebben az esetben lesz (1,0 / (kép szélesség); 0,0) a vízszintes elmosódását és (0.0; 1.0 / (kép magassága)) függőleges. A további megvalósítások fogja használni ugyanazt a terminológiát. Miután két menetben elmosódott képet fog kinézni:
A háromszög alakú elosztó törvény
A következő komplexitás algoritmus egy algoritmus, amely a törvény eloszlása Simpson. Ez a törvény súlyelosztás szomszédos pont a textúra, ahogy nő a távolság a középpont, lineárisan csökken. Mint korábban, rakjuk blur sugara megegyezik tíz. Valamint kell használni, meg kell találnunk az összeg az összes súly szomszédos képpontok textúráját és ossza meg a végeredményt rá. Erre a célra, a központi pixelek vannak beállítva súlyával egyenlő (r + 1). Ebben az esetben, a súlyok a szomszédos pixelek változhat összhangban az f (x) (az alábbi képen). A súly az extrém pontok ebben az esetben egyenlő lesz egy.
Súlyainak összegét az összes pixel ebben az esetben van kifejezve a képlet (R + 1) 2.
Az ezen irányelv végrehajtásához algoritmus a GLSL alábbiakban mutatjuk be:
Ennek az az eredménye képfeldolgozó algoritmus fog kinézni:
normális eloszlás
A következő blur algoritmus, amely úgy gondoljuk, hogy az úgynevezett Gauss-elmosás. Ezt alkalmazzák a Photoshop. A lényege az, hogy az a normális eloszlás törvény. Jellemzően a normális eloszlás jog magában foglalja a két paramétert: az átlag és szórás. A mi esetünkben azt feltételezzük, hogy a várható értéke nulla. Ebben az esetben az értékesítési jog magában csak egy paraméter - a szórás. Az ilyen egyszerűsített forgalmazási szabályokat az alábbiakban mutatjuk be (egy f (x)). Amint ebben a törvény diszperzió értéke nem a sugár, a használata három szigma szabály. Ez kimondja, hogy a tartományban -3 # 963;. + 3 # 963; jelentkeznek 99,73% -át érték az eloszlás. Állítsa sugara megegyezik a tíz, amely esetben a # 963; egyenlő 10/3 = 3 (a törtrész nem veszi figyelembe, ahogy belép az egész pixel távolságra a központtól).
Meg kell jegyezni, hogy ebben az algoritmus, a súlyok összege az összes szomszédos pixelek közel lesz egységét. Vagyis, nem kell osztani, vagy szorozzuk meg az eredményt minden számot. De nem szabad elfelejteni, hogy a kiválasztott határérték alá tartozik, nem 100% -os értéket, de csak 99,73%. Ez azt jelenti, hogy ez az összeg kevesebb, mint egy, a végső kép lesz elhomályosítja. Ahhoz, hogy megszüntesse ezt a hátrányt növeli a tömegének változását a központi pont (1,0 - [súlyainak összegét szomszédos]), és végül kapjunk súlyok összege az összes pixel egyenlő egységét.
Tekintsük ezt a kódot algoritmus GLSL:
Mint látható, van végezzük egy csomó felesleges szabályozások. Minden alkalommal fordította állandók stb Nézzük optimalizálni ezt a kódot:
1) által bevezetett Sigma a gyökér és kiszámítja a konstans 1,0 / sqrt (2,0 * PI),
2) mivel a szigma már nem változott, így nem változtatják meg a teljes kifejezést, mielőtt a kitevő, valamint a relatív x a kifejezést a kitevő, tehát mindez lehet számítani egyszer, és „bezáró”
3) megszabadulni a felesleges működését felosztás három, ebben az esetben három kifejezést.
Miután a végrehajtott műveletek hogy itt ilyen shader
Az ilyen optimalizálás nemcsak csökkentette a méret a shader, hanem növelte az arány körülbelül 1,15-szer (teszteltük blur sugár = 50). Ez akkor egyetértek, egy kicsit, de hasznos :)
Az eredmény egy Gauss-blur az alábbiak lesznek:
Hagyja blur sugár egyenlő 30, és hasonlítsa össze az eredményt az elmosódást a Photoshop:
Az első kép elmosódott egy sugara 30 pixel, a második - a különbség az adott algoritmusok és szűrők Photoshop