【发布时间】:2010-11-20 08:26:32
【问题描述】:
我有一个极坐标网格上的图像。该图像应转换为笛卡尔网格,但我所知道的唯一算法对此非常慢。现在我使用笛卡尔网格,对于每个点我找到 r 和 theta 值,然后我查看两个向量以找到由以下定义的最小误差:
min{(th_vec - theta)^2 + (range - 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{(range - r)^2 + (th_vec - theta)^2}
这给了我 O(n^4) 的复杂度,因为 th_vec 和范围向量与图像的大小相同。因此,如果我有一个 512x512 元素的方阵,我必须运行 68 719 476 736 个元素,这很慢。所以我想知道是否有更快的算法?我无法更改输入数据,据我所知,如果您不从三角剖分之类的东西开始,这是唯一的方法,但这在内存方面很昂贵。
【问题讨论】:
-
这是干什么用的?另外,为什么你没有从 0 到 pi 的角度或从 0 到 r_max 的范围? 2*pi 给出了一个完整的圆,那么为什么需要负距离?
-
您的极坐标网格是否相对于极坐标均匀划分?
-
如果您从 x,y 中找到 r_0 和 th_0 作为浮点值,那么您只需查看极坐标图像中的四对 (r,th),即 ( r_0,th_0),所以 floor(r_0),ceil(r_0) 和 floor(th_0),ceil(th_0) 的四种组合,其中 floor() 和 ceil() 会产生四舍五入到极坐标网格的东西。