Algorithme rapide de polar -> cartésien de conversion

J'ai une image sur une grille à coordonnées polaires. Cette image doit être transformé en une grille cartésienne, mais le seul algorithme que je connaisse est vraiment lent pour cela. Maintenant, j'utilise la grille cartésienne, pour chaque point-je trouver les r et les valeurs de thêta, et puis je regarde dans deux vecteurs de trouver la plus petite erreur définie par:

min{(th_vec - theta)^2 + (range - r)^2}

Cela donne un sous-boucle à l'intérieur de l'extérieur for imbriquées en boucle, j'ai donc une complexité de O(N^4). Une image 512x512 utilise toute une minute. Bien sûr, un genre de complexité qui ne peut pas être utilisé, alors je me demandais si quelqu'un sait de toute algorithmes plus rapides pour ce faire?

J'ai l'image, et les deux vecteurs. L'axe des X de l'image est l'angle, tandis que l'axe des Y de l'image est la longueur à partir du centre. L'angle est toujours de 0 à 2pi, et la gamme va de 0 à r_max.

Vous en remercie d'avance.

EDIT: La gamme va de 0 à r_max, pas -r_max à r_max tel qu'il était avant. Je vois qu'il y a eu quelques missunderstandings. J'ai utilisé la normale, inverse, la conversion;


r=sqrt(x^2 + y^2);
theta=atan2(y,x);

Le problème c'est que je dois d'abord convertir les valeurs x et y de x' et y' les valeurs, car 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. Donc, je dois convertir chaque valeur de pixel dans la valeur de la grille, puis de trouver les r et les valeurs de thêta. Quand j'ai trouvé le r et theta les valeurs que j'ai à courir à travers deux vecteurs, la gamme et th_vec, pour trouver le pixel dans l'image d'origine qui correspond à:

min{(gamme - r)^2 + (th_vec - theta)^2}

Cela me donne une complexité de O(n^4), depuis le th_vec et la gamme des vecteurs sont de la même taille que l'image. Donc, si j'ai une matrice carrée de 512x512 éléments, je dois courir à travers 68 719 476 736 éléments, ce qui est une façon lente. Alors je me demandais si il existe un algorithme plus rapide? Je ne peux pas changer les données d'entrée, pour autant que je sais, c'est la seule façon de le faire si vous ne commencez pas par triangulation et d'autres choses, mais cela est coûteux en temps de la mémoire.

Qu'est-ce? Aussi, pourquoi ne pas vous avez soit l'angle de 0 à pi ou une plage de 0 à r_max? 2*pi donne un cercle complet, alors pourquoi auriez-vous besoin d'négatif de la distance?
Est votre grille à coordonnées polaires partitionné de manière uniforme à l'égard des coordonnées polaires?
Si vous trouvez r_0 et th_0 comme certaine valeur à virgule flottante à partir de votre x,y puis vous n'avez qu'à regarder les quatre paires (r,e) dans votre polaire de l'image, c'est à dire les quatre plus proches voisins (r_0,th_0), de sorte que les quatre combinaisons de plancher(r_0),ceil(r_0) et le plancher(th_0),ceil(th_0) où floor() et ceil() produire quelque chose qui est arrondie à votre grille à coordonnées polaires.

OriginalL'auteur martiert | 2009-08-17