5.24. Pooltransformaties

Poolcoördinaten benoemen elke pixel met een hoek ten opzichte van een referentierichting en een afstand vanaf een gekozen centrum, in plaats van de horizontale en verticale verschuivingen vanaf de oorsprong linksboven. De voorstelling bewijst haar nut dankzij één identiteit: rotatie rond het gekozen centrum wordt translatie langs de hoek-as, waardoor een rotatie-invariant algoritme een veel eenvoudigere parameterruimte kan doorzoeken dan rechtstreeks rotaties. linpolar() en logpolar() voeren de herprojectie uit.

5.24.1. De twee methoden

linpolar() voert de cartesisch-naar-polaire herprojectie uit met een lineaire afstands-as. Elke uitvoerkolom komt overeen met een vaste hoek rond het centrum; elke uitvoerrij komt overeen met een vaste afstand vanaf het centrum.

img.linpolar()

logpolar() voert dezelfde herprojectie uit met een logaritmische afstands-as. De verwerking van de hoek is identiek; het verschil is dat afstanden exponentieel groeien naar beneden over de rijen van de uitvoer in plaats van lineair. Het verschil is van belang vanwege de tweede geometrische identiteit die poolcoördinaten blootleggen: het schalen van de bron rond het gekozen centrum wordt translatie langs de afstands-as – maar alleen wanneer die as logaritmisch is. Met een lineaire afstands-as rekt schalen de polaire afbeelding uit; met een logaritmische afstands-as verschuift schalen haar met een vaste hoeveelheid.

img.logpolar()

Beide methoden nemen de sleutelwoorden x= en y= die het centrum van de polaire herprojectie instellen in pixelcoördinaten van de bron, met als standaardwaarden respectievelijk de helft van de breedte en de helft van de hoogte van de afbeelding. De keuze van het centrum is van belang: een pooltransformatie rond het verkeerde punt eindigt met inhoud die zodanig door elkaar is gehusseld dat de rotatie-/translatie-identiteit wordt vernietigd.

Drie panelen op een rij. Het meest linkse is een cartesische bronafbeelding die een wijzerplaat toont -- twee concentrische cirkels met twaalf streepjes rond de buitenrand op veelvouden van 30 graden, en één enkele wijzer die in één richting wijst. Het middelste paneel toont de linpolar-herprojectie van die bron: een rechthoekige uitvoerafbeelding waarin de twaalf streepjes verschijnen als gelijkmatig verdeelde verticale strepen langs de bovenste rij, de twee concentrische cirkels verschijnen als twee horizontale lijnen op verschillende verticale posities, en de klokwijzer verschijnt als één enkele verticale lijn op de positie die overeenkomt met zijn hoek in de bron. Het meest rechtse paneel toont de logpolar-herprojectie: dezelfde hoekverdeling langs de horizontale as, maar met de ruimte tussen de binnenste en buitenste cirkel gecomprimeerd omdat de afstands-as logaritmisch is.

Een wijzerplaat herprojecteerd door linpolar() en logpolar(). Concentrische cirkels in de bron worden horizontale lijnen in de uitvoer; hoekstreepjes worden gelijkmatig verdeelde verticale lijnen langs de hoek-as. De log-polaire variant comprimeert de radiale afstand.

5.24.2. Wanneer welke te gebruiken

De keuze tussen linpolar() en logpolar() is de keuze van welke invariantie de toepassing nodig heeft. Voor rotatie-invariantie alleen – detecteren dat dezelfde scène in twee frames verschijnt, het tweede geroteerd over een onbekende hoek – is linpolar() voldoende: de rotatie wordt een horizontale verschuiving in de polaire afbeelding, en een matcher die alleen translatie afhandelt zoals find_displacement() herstelt de hoek als de grootte van de verschuiving. Wanneer schaal-invariantie er ook toe doet – het tweede frame is geroteerd en ingezoomd – reduceert logpolar() beide onbekenden tot translaties: horizontaal voor rotatie, verticaal voor schaal.

Dat is het standaardrecept voor een tracker die robuust is tegen rotatie- en schaalveranderingen: herprojecteer het referentieframe en elk live frame naar log-polair rond hetzelfde centrum, voer find_displacement() uit op het paar, en lees de velden rotation en scale af van het resultaat.

5.24.3. Cirkelvormige kenmerken uitvouwen

Een afzonderlijk gebruik van de pooltransformaties is het uitvouwen van kenmerken die in de afbeelding van nature cirkelvormig zijn. Een wijzerplaat, een meterwijzerplaat, een inspectiedoel dat per ontwerp cirkelvormig is – ze worden allemaal lineair in de polaire projectie, wat de vorm is waar de meeste algoritmen gemakkelijker mee kunnen werken.

De figuur hierboven toont het rechtstreeks: de twaalf streepjes op een wijzerplaat, gelijkmatig verdeeld rond de omtrek in het cartesische beeld, worden twaalf gelijkmatig verdeelde verticale lijnen in de polaire afbeelding. Een rechthoek rond een willekeurig streepje in de polaire afbeelding identificeert de positie van dat streepje ongeacht in welke richting de wijzerplaat was gedraaid toen die werd vastgelegd. Een templatematcher die over de polaire afbeelding wordt uitgevoerd, vindt elk streepje in één keer.

5.24.4. De inverse afbeelding

reverse=True voert de inverse uit van de voorwaartse polaire projectie: gegeven een polaire afbeelding, produceert het de cartesische afbeelding waarvan dit de polaire projectie is. De toepassing roept de voorwaartse vorm aan om een algoritme uit te voeren in poolcoördinaten, en roept vervolgens de omgekeerde vorm aan om het resultaat terug te projecteren naar cartesisch voor welke stroomafwaartse fase het ook moet zien.

Het meest voorkomende gebruik is het aanpassen van een polaire afbeelding en deze terugprojecteren: een filter dat op de polaire afbeelding wordt toegepast – een horizontale gladstrijking die, in polaire termen, vervaagt over hoeken maar de radiale structuur behoudt – produceert een cartesisch resultaat dat over hoeken is vervaagd, wat een cartesisch filter niet rechtstreeks kan doen.