2012-03-29 38 views
5

私はPythonの2次元配列/画像を極座標に変換し、その後にプロセスに変換し、その後それらをデカルトに戻したいと考えています。画像の数と暗くなるが非常に大きいので、私はOpenCVのが速いとを有しているかどうかをチェックし速いデカルトから極座標へのデカルト

enter image description here

:以下は、(サンプルコードの同心円上で使用される)ImajeJ Polar Transformerプラグインからの結果でありますこれを行う簡単な方法。

私は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 import cv'から 'cv.cvLinearPolar'を試してみました。次の日は、大規模なデータセットでパフォーマンスを試してみましょう。ありがとうございました! – Papado

+0

cool。なぜそれが見えないのだろうか?私はバグレポートを提出しようとします。 –

+0

http://code.opencv.org/issues/1729 –

2

は、ここでの例ですログポーラscipyのダウンロードを使用して実装変換:

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

はこれが唯一の座標変換であることを考えると、それはOpenCVのバージョンよりもあなたの問題に適応しやすくする必要があります。

+0

ステファン様、フィードバックいただきありがとうございます。私は次の日にあなたの実装をチェックし、ベンチマークします。 Btw、私はSupremeの閲覧を終了し、非常に興味深いようです。あなたはそれについての記事を発表しましたか? – Papado

+0

@Papadoあなたのコメントは見たことがありませんでしたが、はい、arXivと論文に関する論文があります。ところで、ログ極性変換は、 '' skimage.transform.warp''を使って約5行のコードでscikit-imageの上に実装できるようになりました。 –

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

こんにちはAlessandro-私はこのようにしてこの問題を解決しようとしました。同様のコードを書きましたが、meshgridの代わりにループを使用しました。これがどれくらいうまくいくか知っていますか?私のVGA画像は1秒のオーダーを取っていました - 長すぎます。 – cjm2671

+0

OK、私はあなたのコードをテストしました。それは私の反復的なソリューションと比べて非常に速く、さらに何か新しいことを学んだ - ありがとう! – cjm2671

関連する問題