5.24. Transformacje biegunowe

Współrzędne biegunowe nazywają każdy piksel za pomocą kąta względem kierunku odniesienia oraz odległości od wybranego środka, zamiast przesunięć poziomych i pionowych względem początku układu w lewym górnym rogu. Taka reprezentacja zyskuje na znaczeniu dzięki jednej tożsamości: obrót wokół wybranego środka staje się przesunięciem wzdłuż osi kąta, co pozwala algorytmowi niewrażliwemu na obrót przeszukiwać znacznie prostszą przestrzeń parametrów niż w przypadku bezpośrednich obrotów. Reprojekcję wykonują linpolar() i logpolar().

5.24.1. Dwie metody

linpolar() wykonuje reprojekcję z układu kartezjańskiego do biegunowego z liniową osią odległości. Każda kolumna wyjściowa odpowiada ustalonemu kątowi wokół środka; każdy wiersz wyjściowy odpowiada ustalonej odległości od środka.

img.linpolar()

logpolar() wykonuje tę samą reprojekcję z logarytmiczną osią odległości. Obsługa kąta jest identyczna; różnica polega na tym, że odległości rosną wykładniczo wzdłuż wierszy wyniku, a nie liniowo. Ta różnica ma znaczenie z powodu drugiej tożsamości geometrycznej, którą ujawniają współrzędne biegunowe: skalowanie źródła wokół wybranego środka staje się przesunięciem wzdłuż osi odległości – ale tylko wtedy, gdy ta oś jest logarytmiczna. Przy liniowej osi odległości skalowanie rozciąga obraz biegunowy; przy logarytmicznej osi odległości skalowanie przesuwa go o stałą wartość.

img.logpolar()

Obie metody przyjmują słowa kluczowe x= i y=, które ustawiają środek reprojekcji biegunowej w pikselowych współrzędnych źródła, domyślnie odpowiednio połowa szerokości i połowa wysokości obrazu. Wybór środka ma znaczenie: transformacja biegunowa wokół niewłaściwego punktu kończy się przemieszaniem treści w sposób niszczący tożsamość obrót / przesunięcie.

Trzy panele w rzędzie. Skrajnie lewy jest kartezjańskim obrazem źródłowym przedstawiającym tarczę zegara -- dwa współśrodkowe okręgi z dwunastoma znacznikami wokół zewnętrznego brzegu w wielokrotnościach 30 stopni oraz pojedynczą wskazówką skierowaną w jednym kierunku. Środkowy panel pokazuje reprojekcję linpolar tego źródła: prostokątny obraz wyjściowy, w którym dwanaście znaczników pojawia się jako równomiernie rozmieszczone pionowe kreski wzdłuż górnego wiersza, dwa współśrodkowe okręgi pojawiają się jako dwie poziome linie na różnych pozycjach pionowych, a wskazówka zegara pojawia się jako pojedyncza pionowa linia na pozycji odpowiadającej jej kątowi w źródle. Skrajnie prawy panel pokazuje reprojekcję logpolar: ten sam rozkład kątowy wzdłuż osi poziomej, ale z odstępem między wewnętrznym a zewnętrznym okręgiem skompresowanym, ponieważ oś odległości jest logarytmiczna.

Tarcza zegara po reprojekcji przez linpolar() i logpolar(). Współśrodkowe okręgi w źródle stają się poziomymi liniami w wyniku; kątowe znaczniki stają się równomiernie rozmieszczonymi liniami pionowymi wzdłuż osi kąta. Wariant log-biegunowy kompresuje odstępy promieniowe.

5.24.2. Kiedy sięgnąć po którą

Wybór między linpolar() a logpolar() to wybór, której niezmienniczości potrzebuje aplikacja. Dla samej niezmienniczości względem obrotu – wykrycia, że ta sama scena pojawia się w dwóch ramkach, przy czym druga jest obrócona o nieznany kąt – wystarczy linpolar(): obrót staje się poziomym przesunięciem w obrazie biegunowym, a dopasowywacz operujący tylko na przesunięciach, taki jak find_displacement(), odzyskuje kąt jako wielkość przesunięcia. Gdy liczy się również niezmienniczość względem skali – druga ramka jest obrócona i powiększona – logpolar() sprowadza obie niewiadome do przesunięć: poziomego dla obrotu i pionowego dla skali.

To standardowy przepis na tracker odporny na zmiany obrotu i skali: zreprojektuj ramkę odniesienia oraz każdą ramkę na żywo do układu log-biegunowego wokół tego samego środka, uruchom find_displacement() na tej parze i odczytaj pola rotation oraz scale z wyniku.

5.24.3. Rozwijanie cech kołowych

Osobnym zastosowaniem transformacji biegunowych jest rozwijanie cech, które są naturalnie kołowe na obrazie. Tarcza zegara, wskaźnik miernika, cel kontrolny kołowy z założenia – wszystkie one stają się liniowe w projekcji biegunowej, co jest postacią, z którą większości algorytmów łatwiej pracować.

Powyższy rysunek pokazuje to wprost: dwanaście znaczników na tarczy zegara, równomiernie rozmieszczonych wokół obwodu w układzie kartezjańskim, staje się dwunastoma równomiernie rozmieszczonymi liniami pionowymi w obrazie biegunowym. Prostokąt wokół dowolnego pojedynczego znacznika w obrazie biegunowym identyfikuje pozycję tego znacznika niezależnie od tego, w którą stronę tarcza zegara była obrócona w momencie przechwycenia. Dopasowywacz szablonów uruchomiony na obrazie biegunowym znajduje każdy znacznik w jednym przebiegu.

5.24.4. Odwzorowanie odwrotne

reverse=True wykonuje odwrotność prostej projekcji biegunowej: na podstawie obrazu biegunowego tworzy obraz kartezjański, którego projekcją biegunową on jest. Aplikacja wywołuje postać prostą, aby uruchomić algorytm we współrzędnych biegunowych, a następnie wywołuje postać odwrotną, aby zrzutować wynik z powrotem do układu kartezjańskiego dla dowolnego kolejnego etapu, który musi go zobaczyć.

Najczęstszym zastosowaniem jest modyfikowanie obrazu biegunowego i rzutowanie go z powrotem: filtr zastosowany do obrazu biegunowego – poziome wygładzanie, które w kategoriach biegunowych rozmywa kąty, ale zachowuje strukturę promieniową – daje wynik kartezjański, który został rozmyty kątowo, czego filtr kartezjański nie potrafi zrobić bezpośrednio.