将笛卡尔图像转换为极性,外观差异

时间:2014-11-22 17:54:23

标签: python-2.7 image-processing mapping polar-coordinates

我正在尝试对下面的第一张图片进行极坐标变换,最后是第二张图片。但是我的结果是第三张图片。我觉得这与我选择的“起源”位置有关,但我不确定。

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)

1 个答案:

答案 0 :(得分:4)

存在一些差异/错误:

  1. 他们使用图像的中心作为原点
  2. 他们适当地缩放轴。在您的示例中,您正在绘制角度(在0和在您的情况下,pi之间),而不是使用图像的完整高度。
  3. 你使用了错误的atan功能(atan2在这种情况下运行得更好:))
  4. 并不是非常重要,但你不必要地进行了大量的四舍五入,这会使准确性稍微下降并且可能会减慢速度。
  5. 这是结合我建议的改进的代码。这不是很有效率,但它应该有效:)

      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类似。然后,我们在整个计算过程中使用这些代替xy
    2. 我们会r满足0 <= r <= sqrt( (width/2)^2 +(height/2)^2 ),我们t最终会满足0 < t <= 2 pi因此,我会创建适当的比例因子来放置r和{ {1}}分别沿着tx轴。
    3. 普通y只能基于渐变进行区分,并且在垂直线附近计算不稳定......相反,atan(请参阅http://en.wikipedia.org/wiki/Atan2)解决了这两个问题,并接受{{1成对给出一个角度。 atan2会返回一个角度(y,x),因此我们可以找到以atan2为模的余数,使其在-pi < t <= pi范围内准备好进行缩放。
    4. 当新像素设置完毕时,我只在最后舍入。
    5. 有任何问题,请问!