Mam obraz na siatce biegunowej. Obraz ten powinien zostać przekształcony w siatkę kartezjańską, ale jedyny znany mi algorytm jest bardzo powolny. Teraz używam siatki kartezjańskiej, dla każdego punktu znajduję wartości r i theta, a następnie szukam dwóch wektorów, aby znaleźć najmniejszy błąd zdefiniowany przez:Szybki algorytm dla konwersji biegunowej -> kartezjańskiej
min {(th_vec - theta)^2 + (zakres - r)^2}
Daje to zagnieżdżoną pętlę for wewnątrz zewnętrznej zagnieżdżonej pętli for, więc mam złożoność O (N^4). Obraz 512x512 zajmuje całą minutę. Oczywiście takiej złożoności nie można użyć, więc zastanawiam się, czy ktoś wie o szybszych algorytmach, aby to zrobić?
Mam obraz i dwa wektory. Oś X obrazu jest kątem, a oś Y obrazu jest długością od środka. Kąt jest zawsze w zakresie 0-2pi, a zakres zmienia się od 0 do r_max.
Z góry dziękuję.
EDYCJA: Zakres zmienia się od 0 do r_max, nie-r_max do r_max, tak jak poprzednio. Widzę, że były pewne nieporozumienia. Użyłem zwykłej, odwrotnej konwersji z;
r=sqrt(x^2 + y^2);
theta=atan2(y,x);
Problemem jest to, że muszę najpierw przekonwertować wartości X i Y do X „i Y” wartości, ponieważ siatka jest z -r_max do r_max w uzyskanym obrazie, ale w pikselach w danych. Tak więc mam obraz 512x512, ale r_max może być podobny do 3.512. Muszę więc przekonwertować każdą wartość piksela na wartość siatki, a następnie znaleźć wartości r i theta. Po znalezieniu wartości r i theta muszę przejść przez dwa wektory, zakres i th_vec, aby znaleźć piksel w oryginalnym obrazie, który pasuje:
min {(zakres - r)^2 + (th_vec - theta)^2}
Daje mi to złożoność O (n^4), ponieważ wektory th_vec i range są tego samego rozmiaru co obraz. Więc jeśli mam kwadratową matrycę z elementami 512x512, muszę biegać przez 68 719 476 736 elementów, co jest bardzo powolne. Zastanawiam się, czy istnieje szybszy algorytm? Nie mogę zmienić danych wejściowych, więc o ile wiem, jest to jedyny sposób, aby to zrobić, jeśli nie zaczniesz od triangulacji i innych rzeczy, ale jest to drogie w czasach pamięci.
Po co to wszystko? Ponadto, dlaczego nie masz żadnego kąta od 0 do pi lub zakresu od 0 do r_max? 2 * pi daje pełne koło, więc dlaczego potrzebujesz ujemnej odległości? –
Czy twoja siatka biegunowa jest równomiernie podzielona pod względem współrzędnych biegunowych? –
Jeśli znajdziesz r_0 i th_0 jako pewną wartość zmiennoprzecinkową z twojego x, y, to wystarczy spojrzeć na cztery pary (r, th) w twoim obrazie biegunowym, tj. Czterech najbliższych sąsiadów (r_0, th_0), więc cztery kombinacje pięter (r_0), sufitu (r_0) i piętra (th_0), sufitu (th_0) gdzie floor() i ceil() wytwarzają coś zaokrąglonego do twojej siatki biegunowej. –