2014-11-22 166 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

相關問題