J'ai une image sur une grille polaire. Cette image devrait être transformée en une grille cartésienne, mais le seul algorithme que je connais est vraiment lent pour cela. Maintenant, j'utilise la grille cartésienne, pour chaque point je trouve les valeurs r et thêta, puis je regarde dans deux vecteurs pour trouver la plus petite erreur définie par:Algorithme rapide pour la conversion polaire -> cartésienne
min {(th_vec - theta)^2 + (plage - r)^2}
Cela donne une boucle for imbriquée à l'intérieur de la boucle for externe imbriquée, donc j'ai une complexité de O (N^4). Une image 512x512 utilise une minute entière à compléter. Bien sûr, une telle complexité ne peut pas être utilisée, alors je me demande si quelqu'un connaît des algorithmes plus rapides pour le faire?
J'ai l'image et les deux vecteurs. L'axe X de l'image est l'angle, tandis que l'axe Y de l'image est la longueur du centre. L'angle est toujours de 0-2pi, et la plage va de 0 à r_max.
Merci d'avance.
EDIT: La plage va de 0 à r_max, pas -r_max à r_max tel qu'il était auparavant. Je vois qu'il y a eu des malentendus. J'ai utilisé la conversion normale, inverse, avec;
r=sqrt(x^2 + y^2);
theta=atan2(y,x);
Le problème est que j'ai d'abord convertir les valeurs x et y à x « et y » les valeurs, puisque la grille est de -r_max à r_max dans l'image résultante, mais en pixels dans les données. J'ai donc une image 512x512, mais r_max peut être quelque chose comme 3.512. Je dois donc convertir chaque valeur de pixel dans la valeur de la grille, puis trouver les valeurs r et thêta. Quand j'ai trouvé les valeurs r et thêta, je dois parcourir deux vecteurs, range et th_vec, pour trouver le pixel dans l'image originale qui correspond:
min {(range - r)^2 + (th_vec - theta Cela me donne une complexité de O (n^4), puisque les vecteurs th_vec et range ont la même taille que l'image. Donc, si j'ai une matrice carrée de 512x512 éléments, je dois parcourir 68 719 476 736 éléments, ce qui est très lent. Donc je me demande s'il y a un algorithme plus rapide? Je ne peux pas changer les données d'entrée, donc pour autant que je sache, c'est la seule façon de le faire si vous ne commencez pas avec la triangulation et d'autres choses, mais c'est trop cher en temps de mémoire.
A quoi sert-il? Aussi, pourquoi n'avez-vous pas d'angle de 0 à pi ou de 0 à r_max? 2 * pi donne un cercle complet, alors pourquoi auriez-vous besoin d'une distance négative? –
Votre grille polaire est-elle partitionnée uniformément par rapport aux coordonnées polaires? –
Si vous trouvez r_0 et th_0 comme valeur flottante de votre x, y vous n'avez qu'à regarder quatre paires (r, th) dans votre image polaire, c'est-à-dire les quatre plus proches voisins de (r_0, th_0), donc le quatre combinaisons de plancher (r_0), de plafond (r_0) et de plancher (th_0), de plafond (th_0) où plancher() et plafond() produisent quelque chose qui est arrondi à votre grille polaire. –