5.24. Napamuunnokset

Napakoordinaatit nimeävät jokaisen pikselin kulman avulla suhteessa vertailusuuntaan ja etäisyytenä valitusta keskipisteestä sen sijaan, että käytettäisiin vaaka- ja pystysuuntaisia poikkeamia vasemmasta yläkulmasta. Esitystapa ansaitsee paikkansa yhden ominaisuuden ansiosta: kierto valitun keskipisteen ympäri muuttuu siirtymäksi kulma-akselilla, mikä antaa kierrosta riippumattomalle algoritmille mahdollisuuden etsiä paljon yksinkertaisemmasta parametriavaruudesta kuin suoraan kierroksista. linpolar() ja logpolar() suorittavat uudelleenprojisoinnin.

5.24.1. Kaksi menetelmää

linpolar() suorittaa kartesiolaisesta napakoordinaatistoon tapahtuvan uudelleenprojisoinnin lineaarisella etäisyysakselilla. Jokainen ulostulosarake vastaa kiinteää kulmaa keskipisteen ympäri; jokainen ulostulorivi vastaa kiinteää etäisyyttä keskipisteestä.

img.linpolar()

logpolar() suorittaa saman uudelleenprojisoinnin logaritmisella etäisyysakselilla. Kulman käsittely on identtinen; erona on, että etäisyydet kasvavat eksponentiaalisesti ulostulon rivejä alaspäin lineaarisen kasvun sijaan. Ero on merkityksellinen toisen geometrisen ominaisuuden vuoksi, jonka napakoordinaatit paljastavat: lähteen skaalaaminen valitun keskipisteen ympäri muuttuu siirtymäksi etäisyysakselilla – mutta vain silloin, kun akseli on logaritminen. Lineaarisella etäisyysakselilla skaalaus venyttää napakuvaa; logaritmisella etäisyysakselilla skaalaus siirtää sitä kiinteän verran.

img.logpolar()

Molemmat menetelmät ottavat x=- ja y=-avainsanat, jotka asettavat napauudelleenprojisoinnin keskipisteen lähdepikselikoordinaateissa ja joiden oletusarvona ovat puolet kuvan leveydestä ja puolet kuvan korkeudesta. Keskipisteen valinta on merkityksellinen: väärän pisteen ympäri tehty napamuunnos päätyy sekoittamaan sisällön tavoilla, jotka tuhoavat kierto-/siirtymäominaisuuden.

Kolme paneelia rivissä. Vasemmanpuoleisin on kartesiolainen lähdekuva, jossa näkyy kellotaulu -- kaksi samankeskistä ympyrää ja kaksitoista viivamerkkiä ulkoreunaa pitkin 30 asteen välein, sekä yksi viisari, joka osoittaa yhteen suuntaan. Keskipaneelissa näkyy kyseisen lähteen linpolar-uudelleenprojisointi: suorakulmainen ulostulokuva, jossa kaksitoista viivamerkkiä näkyvät tasaisin välein olevina pystyviivoina ylärivillä, kaksi samankeskistä ympyrää näkyvät kahtena vaakaviivana eri pystysuuntaisissa kohdissa, ja kellon viisari näkyy yhtenä pystyviivana kohdassa, joka vastaa sen kulmaa lähteessä. Oikeanpuoleisin paneeli näyttää logpolar-uudelleenprojisoinnin: sama kulmajakauma vaaka-akselia pitkin, mutta sisemmän ja ulomman ympyrän välinen etäisyys on tiivistynyt, koska etäisyysakseli on logaritminen.

Kellotaulu uudelleenprojisoituna menetelmillä linpolar() ja logpolar(). Lähteen samankeskisistä ympyröistä tulee ulostulossa vaakaviivoja; kulmaviivamerkeistä tulee tasaisin välein olevia pystyviivoja kulma-akselilla. Logaritminen napamuunnos tiivistää säteittäisvälin.

5.24.2. Milloin kumpaakin kannattaa käyttää

Valinta linpolar()- ja logpolar()-menetelmän välillä on valinta siitä, mitä invarianssia sovellus tarvitsee. Pelkkään kiertoinvarianssiin – sen havaitsemiseen, että sama näkymä esiintyy kahdessa kehyksessä, joista toinen on kiertynyt tuntemattoman kulman verran – riittää linpolar(): kierto muuttuu vaakasuuntaiseksi siirtymäksi napakuvassa, ja pelkkä siirtymän tunnistava sovitin kuten find_displacement() palauttaa kulman siirtymän suuruutena. Kun myös skaalausinvarianssi on tärkeä – toinen kehys on kierretty ja zoomattu – logpolar() typistää molemmat tuntemattomat siirtymiksi: vaakasuuntaiseksi kierron osalta ja pystysuuntaiseksi skaalauksen osalta.

Tämä on vakiomenetelmä seurantalaitteelle, joka kestää kierto- ja skaalausmuutoksia: uudelleenprojisoi vertailukehys ja jokainen reaaliaikainen kehys logaritmiseen napakoordinaatistoon saman keskipisteen ympäri, suorita find_displacement() parille ja lue rotation- ja scale-kentät tuloksesta.

5.24.3. Ympyrämäisten piirteiden suoristaminen

Napamuunnosten erillinen käyttötapa on luonnostaan ympyrämäisten piirteiden suoristaminen kuvassa. Kellotaulu, mittarin numerotaulu, suunnitellusti ympyrämäinen tarkastuskohde – niistä kaikista tulee napaprojektiossa lineaarisia, mikä on muoto, jonka useimmat algoritmit kokevat helpommaksi käsitellä.

Yllä oleva kuva osoittaa sen suoraan: kellotaulun kaksitoista viivamerkkiä, jotka ovat tasaisin välein kehää pitkin kartesiolaisessa esityksessä, muuttuvat kahdeksitoista tasavälein olevaksi pystyviivaksi napakuvassa. Suorakulmio yhden viivamerkin ympärillä napakuvassa tunnistaa kyseisen viivamerkin sijainnin riippumatta siitä, mihin suuntaan kellotaulu oli kiertynyt kuvaushetkellä. Mallisovitin, joka ajetaan koko napakuvan yli, löytää jokaisen viivamerkin yhdellä läpikäynnillä.

5.24.4. Käänteinen kuvaus

reverse=True suorittaa eteenpäin tehtävän napaprojektion käänteistoiminnon: annetusta napakuvasta tuotetaan kartesiolainen kuva, jonka napaprojektio se on. Sovellus kutsuu eteenpäin-muotoa suorittaakseen algoritmin napakoordinaatistossa ja kutsuu sitten käänteismuotoa projisoidakseen tuloksen takaisin kartesiolaiseen koordinaatistoon, jotta seuraava vaihe näkee sen.

Yleisin käyttötapa on napakuvan muokkaaminen ja takaisinprojisointi: napakuvaan sovellettu suodatin – vaakasuuntainen pehmennys, joka napakoordinaateissa sumentaa kulmien yli mutta säilyttää säteittäisrakenteen – tuottaa kartesiolaisen tuloksen, joka on kulmittain sumennettu, mitä kartesiolainen suodatin ei voi tehdä suoraan.