Tengo una imagen en una cuadrícula polar. Esta imagen debe transformarse en una cuadrícula cartesiana, pero el único algoritmo que conozco es realmente lento para esto. Ahora utilizo la grilla cartesiana, para cada punto encuentro los valores r y theta, y luego miro en dos vectores para encontrar el error más pequeño definido por:Algoritmo rápido para polar -> conversión cartesiana
min {(th_vec - theta)^2 + (rango - r)^2}
Esto proporciona un bucle forzado anidado dentro del bucle for externo anidado, por lo que tengo una complejidad de O (N^4). Una imagen de 512x512 usa un minuto completo para completarse. Por supuesto, una complejidad como esa no se puede usar, entonces me pregunto si alguien sabe de algún algoritmo más rápido para hacer esto.
Tengo la imagen y los dos vectores. El eje X de la imagen es el ángulo, mientras que el eje Y de la imagen es la longitud desde el centro. El ángulo siempre es de 0-2pi, y el rango va de 0 a r_max.
Gracias de antemano.
EDITAR: El rango va de 0 a r_max, no -r_max a r_max como estaba antes. Veo que ha habido algunos malentendidos. He usado la conversión normal, inversa, con;
r=sqrt(x^2 + y^2);
theta=atan2(y,x);
El problema es que tengo para convertir primero los valores de x y valores de y a x 'y y', ya que la rejilla es de -r_max a R_max en la imagen resultante, pero en píxeles en los datos. Así que tengo una imagen de 512x512, pero r_max puede ser algo así como 3.512. Así que tengo que convertir cada valor de píxel en el valor de la grilla, luego hallar los valores r y theta. Cuando he encontrado los valores r y theta, tengo que ejecutar dos vectores, rango y th_vec, para encontrar el píxel en la imagen original que coincide con:
min {(rango - r)^2 + (th_vec - theta)^2}
Esto me da una complejidad de O (n^4), ya que th_vec y los vectores de rango son del mismo tamaño que la imagen. Entonces, si tengo una matriz cuadrada de 512x512 elementos, tengo que ejecutar a través de 68 719 476 736 elementos, que es muy lento. Entonces, me pregunto si hay un algoritmo más rápido. No puedo cambiar los datos de entrada, así que, hasta donde yo sé, esta es la única forma de hacerlo si no comienzas con la triangulación y esas cosas, pero es caro en tiempos de memoria.
¿Para qué es esto? Además, ¿por qué no tienes ningún ángulo de 0 a pi o rango de 0 a r_max? 2 * pi da un círculo completo, entonces ¿por qué necesitarías una distancia negativa? –
¿Su cuadrícula polar está uniformemente dividida con respecto a las coordenadas polares? –
Si encuentra r_0 y th_0 como un valor de coma flotante de su x, y entonces solo tiene que mirar cuatro pares (r, th) en su imagen polar, es decir, los cuatro vecinos más cercanos de (r_0, th_0), por lo que cuatro combinaciones de piso (r_0), ceil (r_0) y piso (th_0), ceil (th_0) donde floor() y ceil() producen algo que se redondea a su rejilla polar. –