5.24. Polära transformer¶
Polära koordinater namnger varje pixel med en vinkel från en referensriktning och ett avstånd från ett valt centrum, i stället för den horisontella och vertikala förskjutningen från origo i övre vänstra hörnet. Representationen gör sig förtjänt genom en enda identitet: rotation kring det valda centrumet blir translation längs vinkelaxeln, vilket låter en rotationsinvariant algoritm söka i ett betydligt enklare parameterrum än rotationer direkt. linpolar() och logpolar() utför omprojiceringen.
5.24.1. De två metoderna¶
linpolar() utför omprojiceringen från kartesiska till polära koordinater med en linjär avståndsaxel. Varje utdatakolumn motsvarar en fast vinkel kring centrumet; varje utdatarad motsvarar ett fast avstånd från centrumet.
img.linpolar()
logpolar() utför samma omprojicering med en logaritmisk avståndsaxel. Vinkelhanteringen är identisk; det som skiljer är att avstånden växer exponentiellt nedåt längs utdatats rader i stället för linjärt. Skillnaden spelar roll på grund av den andra geometriska identiteten som polära koordinater blottlägger: skalning av källan kring det valda centrumet blir translation längs avståndsaxeln – men endast när den axeln är logaritmisk. Med en linjär avståndsaxel sträcker skalning ut den polära bilden; med en logaritmisk avståndsaxel förskjuter skalning den med en fast mängd.
img.logpolar()
Båda metoderna tar nyckelorden x= och y= som anger centrumet för den polära omprojiceringen i källans pixelkoordinater, med standardvärden på halva bildens bredd respektive halva bildens höjd. Valet av centrum spelar roll: en polär transform kring fel punkt slutar med innehåll som är omkastat på sätt som förstör rotations-/translationsidentiteten.
En urtavla omprojicerad av linpolar() och logpolar(). Koncentriska cirklar i källan blir horisontella linjer i utdatan; vinkelskalstreck blir jämnt fördelade vertikala linjer längs vinkelaxeln. Den log-polära varianten komprimerar det radiella avståndet.¶
5.24.2. När man ska välja vilken¶
Valet mellan linpolar() och logpolar() är valet av vilken invarians applikationen behöver. För enbart rotationsinvarians – att upptäcka att samma scen förekommer i två bildrutor, där den andra är roterad med en okänd vinkel – räcker linpolar(): rotationen blir en horisontell förskjutning i den polära bilden, och en matchare som enbart hanterar translation, som find_displacement(), återvinner vinkeln som förskjutningens storlek. När skalinvarians också spelar roll – den andra bildrutan är roterad och inzoomad – reducerar logpolar() båda okända till translationer: horisontellt för rotation, vertikalt för skala.
Det är standardreceptet för en spårare som är robust mot rotations- och skalförändringar: omprojicera referensbildrutan och varje live-bildruta till log-polär kring samma centrum, kör find_displacement() på paret, och läs av fälten rotation och scale från resultatet.
5.24.3. Uppveckling av cirkulära särdrag¶
En separat användning av de polära transformerna är uppveckling av särdrag som är naturligt cirkulära i bilden. En urtavla, en mätarskala, ett inspektionsmål som är cirkulärt av design – alla blir de linjära i den polära projiceringen, vilket är den form som de flesta algoritmer finner lättare att arbeta med.
Figuren ovan visar det direkt: de tolv skalstrecken på en urtavla, jämnt fördelade runt omkretsen i kartesiska koordinater, blir tolv jämnt fördelade vertikala linjer i den polära bilden. En rektangel kring ett enskilt skalstreck i den polära bilden identifierar det skalstreckets position oavsett vilket håll urtavlan var roterad åt när den fångades. En mallmatchare som körs över den polära bilden hittar varje skalstreck i en enda genomgång.
5.24.4. Den omvända avbildningen¶
reverse=True kör inversen av den framåtriktade polära projiceringen: givet en polär bild produceras den kartesiska bild vars polära projicering den är. Applikationen anropar den framåtriktade formen för att köra en algoritm i polära koordinater, och anropar sedan den omvända formen för att projicera tillbaka resultatet till kartesiska koordinater för vilket nedströmssteg som än behöver se det.
Den vanligaste användningen är att modifiera en polär bild och projicera tillbaka: ett filter applicerat på den polära bilden – en horisontell utjämning som, i polära termer, suddar tvärs över vinklar men bevarar radiell struktur – ger ett kartesiskt resultat som har blivit vinkelmässigt suddat, vilket inte är något ett kartesiskt filter kan göra direkt.