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.

Three panels in a row. The leftmost is a Cartesian source image showing a clock face -- two concentric circles with twelve tick marks around the outer rim at multiples of 30 degrees, and a single hand pointing in one direction. The middle panel shows the linpolar re-projection of that source: a rectangular output image where the twelve tick marks appear as evenly spaced vertical strokes along the top row, the two concentric circles appear as two horizontal lines at different vertical positions, and the clock hand appears as a single vertical line at the position corresponding to its angle in the source. The rightmost panel shows the logpolar re-projection: the same angular distribution along the horizontal axis, but with the gap between the inner and outer circles compressed because the distance axis is logarithmic.

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.