5.24. Trasformazioni polari¶
Le coordinate polari identificano ogni pixel tramite un angolo rispetto a una direzione di riferimento e una distanza da un centro scelto, al posto degli scostamenti orizzontale e verticale dall’origine in alto a sinistra. Questa rappresentazione si rivela utile grazie a un’identità: la rotazione attorno al centro scelto diventa una traslazione lungo l’asse degli angoli, il che consente a un algoritmo invariante alla rotazione di esplorare uno spazio dei parametri molto più semplice rispetto alle rotazioni dirette. linpolar() e logpolar() eseguono la ri-proiezione.
5.24.1. I due metodi¶
linpolar() esegue la ri-proiezione da cartesiano a polare con un asse delle distanze lineare. Ogni colonna di output corrisponde a un angolo fisso attorno al centro; ogni riga di output corrisponde a una distanza fissa dal centro.
img.linpolar()
logpolar() esegue la stessa ri-proiezione con un asse delle distanze logaritmico. La gestione degli angoli è identica; ciò che cambia è che le distanze crescono in modo esponenziale lungo le righe dell’output anziché in modo lineare. La differenza è importante a causa della seconda identità geometrica esposta dalle coordinate polari: il ridimensionamento della sorgente attorno al centro scelto diventa una traslazione lungo l’asse delle distanze – ma solo quando tale asse è logaritmico. Con un asse delle distanze lineare, il ridimensionamento allunga l’immagine polare; con un asse delle distanze logaritmico, lo sposta di una quantità fissa.
img.logpolar()
Entrambi i metodi accettano le parole chiave x= e y= che impostano il centro della ri-proiezione polare in coordinate pixel della sorgente, con valori predefiniti pari rispettivamente a metà della larghezza e metà dell’altezza dell’immagine. La scelta del centro è importante: una trasformazione polare attorno al punto sbagliato finisce con il contenuto rimescolato in modi che distruggono l’identità rotazione / traslazione.
Il quadrante di un orologio ri-proiettato da linpolar() e logpolar(). I cerchi concentrici nella sorgente diventano linee orizzontali nell’output; le tacche angolari diventano linee verticali spaziate uniformemente lungo l’asse degli angoli. La variante log-polare comprime la spaziatura radiale.¶
5.24.2. Quando usare l’uno o l’altro¶
La scelta tra linpolar() e logpolar() è la scelta di quale invarianza serve all’applicazione. Per la sola invarianza alla rotazione – rilevare che la stessa scena appare in due frame, il secondo ruotato di un angolo sconosciuto – linpolar() è sufficiente: la rotazione diventa uno spostamento orizzontale nell’immagine polare, e un matcher di sola traslazione come find_displacement() recupera l’angolo come entità dello spostamento. Quando è importante anche l”invarianza alla scala – il secondo frame è ruotato e zoomato – logpolar() riduce entrambe le incognite a traslazioni: orizzontale per la rotazione, verticale per la scala.
Questa è la ricetta standard per un tracker robusto rispetto a cambiamenti di rotazione e scala: ri-proietta il frame di riferimento e ogni frame in tempo reale in log-polare attorno allo stesso centro, esegui find_displacement() sulla coppia e leggi i campi rotation e scale dal risultato.
5.24.3. Sviluppo di caratteristiche circolari¶
Un uso distinto delle trasformazioni polari è lo sviluppo (unwrapping) di caratteristiche che sono naturalmente circolari nell’immagine. Il quadrante di un orologio, la lancetta di un indicatore, un bersaglio di ispezione circolare per progettazione – tutti diventano lineari nella proiezione polare, che è la forma con cui la maggior parte degli algoritmi lavora più facilmente.
La figura sopra lo mostra direttamente: le dodici tacche su un quadrante di orologio, spaziate uniformemente lungo la circonferenza in cartesiano, diventano dodici linee verticali spaziate uniformemente nell’immagine polare. Un rettangolo attorno a una qualsiasi tacca nell’immagine polare ne identifica la posizione indipendentemente da come fosse ruotato il quadrante dell’orologio al momento dell’acquisizione. Un matcher di template eseguito sull’immagine polare trova ogni tacca in un solo passaggio.
5.24.4. La mappatura inversa¶
reverse=True esegue l’inverso della proiezione polare diretta: data un’immagine polare, produce l’immagine cartesiana di cui essa è la proiezione polare. L’applicazione chiama la forma diretta per eseguire un algoritmo in coordinate polari, quindi chiama la forma inversa per proiettare il risultato di nuovo in cartesiano per qualsiasi fase successiva che debba vederlo.
L’uso più comune è la modifica di un’immagine polare e la riproiezione all’indietro: un filtro applicato all’immagine polare – una sfocatura orizzontale che, in termini polari, sfoca tra gli angoli ma preserva la struttura radiale – produce un risultato cartesiano che è stato sfocato angolarmente, cosa che un filtro cartesiano non può fare direttamente.