2012-03-29 300 views
5

我想將Python 2d數組/圖像轉換爲極座標,然後進行處理,然後將它們轉換回笛卡兒座標系。以下是從ImajeJ Polar Transformer插件的結果(樣品上代碼的同心圓使用):在Python中快速笛卡爾到極座標到笛卡爾

enter image description here

的圖像的數量和變暗是相當大的,所以我檢查的OpenCV是否具有快速和簡單的方法來做到這一點。

我讀過關於cv。 CartToPolarPolarToCart但我沒有使用它。我更瞭解LogPolar,其中輸入和輸出是數組,並且可以設置中心,插值和反轉(即CV_WARP_INVERSE_MAP)。有沒有辦法以類似的方式使用CartToPolar/PolarToCart?

import numpy as np 
    import cv 

    #sample 2D array that featues concentric circles 
    circlesArr = np.ndarray((512,512),dtype=np.float32) 
    for i in range(10,600,10): cv.Circle(circlesArr,(256,256),i-10,np.random.randint(60,500),thickness=4) 

    #logpolar 
    lp = np.ndarray((512,512),dtype=np.float32) 
    cv.LogPolar(circlesArr,lp,(256,256),100,cv.CV_WARP_FILL_OUTLIERS) 

    #logpolar Inverse 
    lpinv = np.ndarray((512,512),dtype=np.float32) 
    cv.LogPolar(lp,lpinv,(256,256),100, cv.CV_WARP_INVERSE_MAP + cv.CV_WARP_FILL_OUTLIERS) 

    #display images 
    from scipy.misc import toimage 
    toimage(lp, mode="L").show() 
    toimage(lpinv, mode="L").show() 

這是一個斷層掃描(CT)工作流程,其中環狀僞像如果以線條形式出現可以更容易地過濾掉。

回答

2

CV源代碼提到了LinearPolar。它似乎沒有記錄,但似乎與LogPolar類似。你嘗試過嗎?

+0

非常感謝你!事實上'LinearPolar'就是這麼說的。不幸的是,通過使用'import cv',它不可用,但我嘗試了'從opencv導入cv'然後'cv.cvLinearPolar'並且工作。接下來的幾天我會嘗試它在大型數據集中的表現。謝謝! – Papado 2012-03-29 17:11:18

+0

很酷。我想知道爲什麼它不可見?我會嘗試提交一個錯誤報告。 – 2012-03-29 17:18:52

+0

http://code.opencv.org/issues/1729 – 2012-03-29 17:30:23

2

下面是一個例子,數極使用SciPy的變換來實現:

https://github.com/stefanv/supreme/blob/master/supreme/transform/transform.py#L51

考慮到這只是一個座標變換,它應該是更容易適應您的問題比OpenCV的版本。

+0

親愛的Stefan,非常感謝您的回饋。我會在接下來的幾天檢查並測試您的實施。順便說一句,我結束了瀏覽至尊,似乎很有趣。你有沒有發表任何關於它的文章? – Papado 2012-04-17 09:08:43

+0

@Papado我從來沒有看到您的評論,但是 - 是的 - 有關於arXiv和論文的論文。順便說一句,現在可以使用''skimage.transform.warp''在大約5行代碼的scikit-image上實現對數極座標變換。 – 2015-03-12 07:43:46

3

最新版本的opencv支持函數cv2.linearPolar。 這可能是另一個不涉及使用opencv的解決方案:

def polar2cart(r, theta, center): 

    x = r * np.cos(theta) + center[0] 
    y = r * np.sin(theta) + center[1] 
    return x, y 

def img2polar(img, center, final_radius, initial_radius = None, phase_width = 3000): 

    if initial_radius is None: 
     initial_radius = 0 

    theta , R = np.meshgrid(np.linspace(0, 2*np.pi, phase_width), 
          np.arange(initial_radius, final_radius)) 

    Xcart, Ycart = polar2cart(R, theta, center) 

    Xcart = Xcart.astype(int) 
    Ycart = Ycart.astype(int) 

    if img.ndim ==3: 
     polar_img = img[Ycart,Xcart,:] 
     polar_img = np.reshape(polar_img,(final_radius-initial_radius,phase_width,3)) 
    else: 
     polar_img = img[Ycart,Xcart] 
     polar_img = np.reshape(polar_img,(final_radius-initial_radius,phase_width)) 

    return polar_img 
+0

嗨亞歷山德羅 - 我試圖用這種方式解決這個問題,我寫了類似的代碼,雖然我用循環而不是meshgrid(我從來沒有見過)。你知道這個表演有多好嗎?我的VGA圖像時間長達1秒 - 時間過長。 – cjm2671 2014-04-21 16:23:07

+0

好的,我已經測試了你的代碼,與我的迭代解決方案相比,它非常快 - 另外我學到了一些新東西 - 非常感謝你! – cjm2671 2014-04-28 12:06:08