2014-11-22 193 views
1

我正试图对下图中的第一张图像执行极坐标转换,并以第二张图像结束。然而我的结果是第三张图片。我有一种感觉,它与我选择作为我的“起源”的位置有关,但我不确定。将笛卡尔图像转换为极坐标,外观差异

Target Image

Goal

My Transform

radius = sqrt(width**2 + height**2) 
    nheight = int(ceil(radius)/2) 
    nwidth = int(ceil(radius/2)) 
for y in range(0, height): 
    for x in range(0, width): 
    t = int(atan(y/x)) 
    r = int(sqrt(x**2+y**2)/2) 
    color = getColor(getPixel(pic, x, y)) 
    setColor(getPixel(radial,r,t), color) 

回答

3

有一些分歧/错误:

  1. 他们用图像的中心为原点
  2. 它们适当地缩放轴。在你的例子中,你正在绘制你的角度(0和你的情况,pi),而不是利用图像的整个高度。
  3. 您使用了错误的ATAN函数(ATAN2工作在这种情况下:)好了很多)
  4. 不惊人的重要,但你不必要四舍五入颇多,其中抛出了准确一点,可以减缓东西下。

这是结合我建议的改进的代码。这不是大规模高效,但它应该有希望的工作:)

maxradius = sqrt(width**2 + height**2)/2 
    rscale = width/maxradius 
    tscale = height/(2*math.pi) 
    for y in range(0, height): 
    dy = y - height/2 
    for x in range(0, width): 
    dx = x - width/2 
    t = atan2(dy,dx)%(2*math.pi) 
    r = sqrt(dx**2+dy**2) 
    color = getColor(getPixel(pic, x, y)) 
    setColor(getPixel(radial,int(r*rscale),int(t*tscale)), color) 

特别是,它修复了以下几个方面的上述问题:

  1. 我们使用dx = x - width/2作为距离的测量从中心,和dy一样。然后我们在整个计算过程中用这些替代x,y
  2. 我们会有r满足0 <= r <= sqrt((width/2)^2 +(height/2)^2),和我们的t最终满足0 < t <= 2 pi所以,我创建适当的比例因子分别把沿xyrt
  3. 普通atan只能区分基于梯度,并且是接近垂直线计算不稳定...相反,atan2(参见http://en.wikipedia.org/wiki/Atan2)解决了这两个问题,并接受(y,x)对得到的角度。 atan2返回一个角度-pi < t <= pi,所以我们可以找到余数模2 * math.pi使它在0 < t <= 2pi的范围内,以准备进行缩放。
  4. 我只在最后,当新的像素设置圆整。

有任何问题,只是问!

+0

这是超越优秀,谢谢你的帮助! – 2014-11-22 18:59:44

+0

没问题,乐意帮忙! – 2014-11-22 19:07:30

+0

很高兴结果发挥了作用。顺便说一句,我刚刚意识到我在循环中创建'r'的那一行有一个不正确的2除法。我现在修复了它! – 2014-11-22 19:10:28

相关问题