5.24. Transformări polare

Coordonatele polare denumesc fiecare pixel printr-un unghi față de o direcție de referință și o distanță față de un centru ales, în locul deplasărilor orizontale și verticale față de originea din colțul din stânga-sus. Reprezentarea își justifică utilitatea printr-o singură identitate: rotația în jurul centrului ales devine translație de-a lungul axei unghiului, ceea ce permite unui algoritm invariant la rotație să exploreze un spațiu de parametri mult mai simplu decât rotațiile directe. linpolar() și logpolar() efectuează re-proiecția.

5.24.1. Cele două metode

linpolar() efectuează re-proiecția carteziană în polară cu o axă a distanței liniară. Fiecare coloană de ieșire corespunde unui unghi fix în jurul centrului; fiecare rând de ieșire corespunde unei distanțe fixe față de centru.

img.linpolar()

logpolar() efectuează aceeași re-proiecție cu o axă a distanței logaritmică. Tratarea unghiului este identică; ceea ce diferă este că distanțele cresc exponențial pe rândurile ieșirii, nu liniar. Diferența contează datorită celei de-a doua identități geometrice pe care o expun coordonatele polare: scalarea sursei în jurul centrului ales devine translație de-a lungul axei distanței – dar numai atunci când acea axă este logaritmică. Cu o axă a distanței liniară, scalarea întinde imaginea polară; cu o axă a distanței logaritmică, scalarea o deplasează cu o valoare fixă.

img.logpolar()

Ambele metode acceptă cuvintele-cheie x= și y= care stabilesc centrul re-proiecției polare în coordonate de pixel ale sursei, având ca valori implicite jumătate din lățimea imaginii și, respectiv, jumătate din înălțimea imaginii. Alegerea centrului contează: o transformare polară în jurul unui punct greșit ajunge să aibă conținutul amestecat în moduri care distrug identitatea rotație / translație.

Trei panouri într-un rând. Cel mai din stânga este o imagine sursă carteziană care arată un cadran de ceas -- două cercuri concentrice cu douăsprezece marcaje în jurul marginii exterioare la multipli de 30 de grade, și un singur ac care indică într-o direcție. Panoul din mijloc arată re-proiecția linpolar a acelei surse: o imagine de ieșire dreptunghiulară în care cele douăsprezece marcaje apar ca linii verticale egal distanțate de-a lungul rândului de sus, cele două cercuri concentrice apar ca două linii orizontale la poziții verticale diferite, iar acul ceasului apare ca o singură linie verticală în poziția corespunzătoare unghiului său în sursă. Panoul din dreapta arată re-proiecția logpolar: aceeași distribuție unghiulară de-a lungul axei orizontale, dar cu spațiul dintre cercul interior și cel exterior comprimat, deoarece axa distanței este logaritmică.

Un cadran de ceas re-proiectat prin linpolar() și logpolar(). Cercurile concentrice din sursă devin linii orizontale în ieșire; marcajele unghiulare devin linii verticale egal distanțate de-a lungul axei unghiului. Varianta log-polar comprimă distanțarea radială.

5.24.2. Când să recurgeți la fiecare

Alegerea între linpolar() și logpolar() este alegerea invarianței de care are nevoie aplicația. Pentru invarianță la rotație singură – detectarea faptului că aceeași scenă apare în două cadre, al doilea rotit cu un unghi necunoscut – linpolar() este suficientă: rotația devine o deplasare orizontală în imaginea polară, iar un comparator bazat doar pe translație, precum find_displacement(), recuperează unghiul ca mărime a deplasării. Când contează și invarianța la scară – al doilea cadru este rotit și mărit – logpolar() reduce ambele necunoscute la translații: orizontală pentru rotație, verticală pentru scară.

Aceasta este rețeta standard pentru un sistem de urmărire robust la schimbările de rotație și de scară: re-proiectați cadrul de referință și fiecare cadru live în log-polar în jurul aceluiași centru, rulați find_displacement() pe pereche și citiți câmpurile rotation și scale din rezultat.

5.24.3. Desfășurarea caracteristicilor circulare

O utilizare distinctă a transformărilor polare este desfășurarea caracteristicilor care sunt în mod natural circulare în imagine. Un cadran de ceas, o scală a unui aparat de măsură, o țintă de inspecție circulară prin proiectare – toate devin liniare în proiecția polară, care este forma cu care majoritatea algoritmilor lucrează mai ușor.

Figura de mai sus arată acest lucru direct: cele douăsprezece marcaje de pe un cadran de ceas, egal distanțate pe circumferință în coordonate carteziene, devin douăsprezece linii verticale egal distanțate în imaginea polară. Un dreptunghi în jurul oricărui marcaj din imaginea polară identifică poziția acelui marcaj indiferent de modul în care a fost rotit cadranul ceasului la captură. Un comparator de șabloane rulat pe imaginea polară găsește fiecare marcaj într-o singură trecere.

5.24.4. Maparea inversă

reverse=True rulează inversa proiecției polare directe: dată fiind o imagine polară, produce imaginea carteziană a cărei proiecție polară este aceasta. Aplicația apelează forma directă pentru a rula un algoritm în coordonate polare, apoi apelează forma inversă pentru a proiecta rezultatul înapoi în coordonate carteziene pentru orice etapă ulterioară care trebuie să îl vadă.

Cea mai frecventă utilizare este modificarea unei imagini polare și proiectarea înapoi: un filtru aplicat imaginii polare – o netezire orizontală care, în termeni polari, estompează între unghiuri, dar păstrează structura radială – produce un rezultat cartezian care a fost estompat unghiular, ceea ce un filtru cartezian nu poate face direct.