2020/10/13

Tőszomszédok - Nearest Neighbor

Fogadjunk, amíg nem gondolkozol el rajta, azt hinnéd a képek zoomolgatása, legyen az monitoron, vagy telefonon, egy banális művelet, széthúzod ujjbeggyel, vagy kontroll-pluszmínusz és kész. Az is világos, hogy egy digitális kép nem nagyítható akármekkorára, vagyis a filmekben, a megfigyelő kamera két pixeléből sem a CIA, sem az MI6 nem tudja kinyerni az elkövető kilétét, de aki kicsit érdeklődő, az már hallott arról is, hogy az AI megjelenésével ez valamennyire mégsem teljesen kizárt

De azért az mégis mekkora varázslat, amikor a kép mondjuk 100 pixele 101 pixelen kell megjelenjen. Vagy 99 pixelen. Az előző esetben ugyanis ki kell találni egy új pixelt, a második esetben meg el kell dobni egyet. Csak hát mindezt arányosan kell csinálni, nem elég egy új pixelt valahová beszúrni, vagy egyet eltüntetni. Mind az összes (diszkrét) pixelnek változnia kell, valamilyen szabály szerint. A dolog valahol rokon a BAYER demozaikolásával, ott is nemlétező információt kell kitalálni valamennyi létező információ alapján. És a felmerülő problémák is hasonlóak, tónusok, színek nem változhatnak, éles szegélyek, apró textúrák nem sérülhetnek túlságosan, nem jelenhetnek meg ronda artifactek illetve az egész számolgatás nem tarthat sokáig, ha telefonon belenagyítasz egy csücsörítős szelfi dekoltázsába, akkor annak lag nélkül kell működnie, mert hanem már élni sem érdemes.

Éppen ezért a különféle célokra különféle módszereket fejlesztettek. A legegyszerűbb eset, ami a cím is (amivel a neten a legtöbbet fogsz találkozni, mert majd hülyék lesznek az influenszerek sérvet kapni a problémásabb interpolációktól), az amikor a képet, kétszeresére/négyszeresére/stb. növeled. A tőszomszéd algoritmus ilyenkor nem csinál mást, mint minden pixelt megdupláz (mindkét irányba), ahol eddig egy - mondjuk fekete pixel volt, ott most négy vagy nyolc fekete pixel lesz. 

De mi van, ha egy pixelből nem négyet kell csinálni, hanem másfelet, vagy hármat, vagy egy felet, vagy mittudoménmennyit? Az alábbi ábra mutatja a Nearest Neighbor logikáját néhány esetre. 

A 3*3 pixeles kép különféle nagyításai láthatóak. Itt nincs átlagolás, csak azokat az értékeket vehetik fel az új pixelek, amelyek az eredetiben is voltak (jelen esetben fehér és fekete). A kiindulási mintát képzeletben ráhelyezzük a megnövelt képre (a középső oszlopban) és annak alapján színezzük az új pixeleket fehérre vagy feketére, hogy az új rács közepe a régi rács milyen színére esik. Másképpen megközelítve, az új pixelt milyen arányban fedi a régi leosztásból valamelyik szín. Ezt a PS és más képszerkesztők is pontosan ugyanúgy csinálják. 
Ugyanez a logika akkor is, ha csökkentjük a képet, mondjuk kétharmadára. Belátható, hogyha a fenti példában a középső pixelünk hupi-, vagy tiffanykék is lehetne, az új 2*2-es képen az semmit se nyomna a latban, az új csökkentett képről simán lemarad, tehát az eredmény 2*2 pixel fekete lesz. Tehát bizonyos szerencsétlen pozícióban levő információk teljesen el is tűnhetnek.  A neten többnyire azt emelik ki, hogy ez a módszer recés széleket okoz, de szerintünk ennél fontosabb tulajdonsága, hogy a nagyfrekvenciás képi részletek esetén, a nearest neighbor nem képes maradéktalanul az eredeti élményt hozni a megváltozott képméreten. Például a fenti 3*3 fekete-fehér pepitánk távolról nézve szürke. De 2*2-re csökkentve fekete lesz, akárhonnan nézed.  Például egy 8x8-as pepita 5x5-re csökkentve ilyen lesz:


Nagyobb mintázat esetén azért már van rá esély, hogy ha a textúrát nem is, de a tónust legalább megőrzi, hiszen az új kép fedettsége is nagyjából hasonlít az eredetiére. 

És ilyen a forgatás nearest neighborral:
Amit viszont nagyon tud ez a módsze, az a kemény szegélyek megtartása (preserve hard edges). Nagy képen ez okozhatja apró részletek, textúrák részleges, vagy teljes eltűnését, de sosem fog blúrolni.  2x, 4x, 8x, stb. növelésnél meg garantált a Minecraft-hatás.

Nincsenek megjegyzések:

Megjegyzés küldése