我有一个极坐标网格上的图像。该图像应转换为笛卡尔网格,但我所知道的唯一算法对此非常慢。现在我使用笛卡尔网格,对于每个点我找到 r 和 theta 值,然后我查看两个向量以找到由以下定义的最小误差:
min{(th_vec - theta)^2 + (范围 - r)^2}
这在外部嵌套的 for 循环内提供了一个嵌套的 for 循环,所以我的复杂度为 O(N^4)。一张 512x512 的图像需要一整分钟才能完成。当然,不能使用这样的复杂性,所以我想知道是否有人知道任何更快的算法可以做到这一点?
我有图像和两个向量。图像的 X 轴是角度,而图像的 Y 轴是距中心的长度。角度始终为 0-2pi,范围为 0 到 r_max。
先感谢您。
编辑:范围从 0 到 r_max,而不是以前的 -r_max 到 r_max。我看到有一些误解。我已经使用了正常,反向,转换;
r=sqrt(x^2 + y^2);
theta=atan2(y,x);
问题是我必须首先将 x 和 y 值转换为 x' 和 y' 值,因为网格在结果图像中是从 -r_max 到 r_max 的,但在数据中以像素为单位。所以我有一个 512x512 的图像,但 r_max 可以是 3.512 之类的东西。所以我必须将每个像素值转换为网格值,然后找到 r 和 theta 值。当我找到 r 和 theta 值时,我必须通过两个向量 range 和 th_vec 运行,以找到原始图像中匹配的像素:
min{(范围 - r)^2 + (th_vec - theta)^2}
这给了我 O(n^4) 的复杂度,因为 th_vec 和范围向量与图像的大小相同。因此,如果我有一个 512x512 元素的方阵,我必须运行 68 719 476 736 个元素,这很慢。所以我想知道是否有更快的算法?我无法更改输入数据,据我所知,如果您不从三角剖分之类的东西开始,这是唯一的方法,但这在内存时代是昂贵的。