【问题标题】:Converting Cartesian image to polar, appearance differences将笛卡尔图像转换为极坐标,外观差异
【发布时间】:2015-01-20 17:35:51
【问题描述】:

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

  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)

【问题讨论】:

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


    【解决方案1】:

    有一些差异/错误:

    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 类似。然后,我们在整个计算过程中使用这些替换 xy
    2. 我们将有我们的r 满足0 <= r <= sqrt( (width/2)^2 +(height/2)^2 ),我们的t 最终满足0 < t <= 2 pi 所以,我创建了适当的比例因子来放置rt 沿着x 和@987654334分别@轴。
    3. 普通atan 只能根据梯度进行区分,并且在垂直线附近计算不稳定...相反,atan2(参见http://en.wikipedia.org/wiki/Atan2)解决了这两个问题,并接受(y,x) 对来给出角度。 atan2 返回一个角度 -pi < t <= pi,因此我们可以找到余数模 2 * math.pi 以使其处于 0 < t <= 2pi 范围内,以便进行缩放。
    4. 我只在最后四舍五入,即设置新像素时。

    有任何问题,尽管问!

    【讨论】:

    • 没问题,乐于助人!
    • 很高兴它成功了。顺便说一句,我刚刚意识到我在循环中创建 r 的行被错误地除以 2。我现在已经修复了!
    • :D 我确实注意到了。我注意到的另一件事是似乎缺少像素。这是因为四舍五入还是他们应用了第二个过程来填充这些?
    • 是的,那是因为地图不是一对一的……新图像的某些区域来自原始图像的小得多的区域(因此尤其如此在新图像的顶部,半径很小)。不幸的是,您必须在后通行证中填写这些内容。一个更简单的解决方案可以说是计算逆映射......即循环 t 和 r,并计算 x = round(r cos(t)) + width/2 , y = round(r sin(t)) + height /2,如果这些 x 和 y 位于旧图像中,我们将值复制到新图像中对应的 r* rscale, t* tscale 位置...如果这样有意义?
    • 是的,这绝对是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多