2012-03-29 16 views
5

Python 2d dizilerinde/resimlerinde polarize dönüştürmek, sonra işlemek ve sonra bunları kartezyen haline dönüştürmek istiyorum. Görüntülerinhızlı Kartezyen Kutupsal için Kartezyen Python

enter image description here

numarası ve kararır oldukça büyük yüzden OpenCV hızlı olup olmadığını ve kontrol ediyordu: Aşağıdaki (örnek kod konsantrik daireler üzerinde kullanılır) ImajeJ Polar Transformer eklentisinden sonucudur Bunu yapmanın basit yolu.

Cv hakkında okurum. CartToPolar ve PolarToCart ancak onu kullanamadım. Girdi ve çıktının dizildiği ve merkez, enterpolasyon ve inversiyon ayarlayabileceğiniz (yani CV_WARP_INVERSE_MAP) LogPolar'u daha iyi anlarım. CartToPolar/PolarToCart'ı benzer bir şekilde kullanmanın bir yolu var mı?

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() 

Bu tomografi içindir (BT) iş akışı onlar çizgiler olarak görünür eğer halkalar eserler daha kolay filtre edilebilir nerede. CV kaynak kodunun, bir LinearPolar sayılı belgeden bahsedildiği belirtilmektedir.

cevap

2

. Belgelenmiş görünmüyor, ancak LogPolar'a benziyor. bunu denedin mi

+0

çok çok teşekkür ederiz! Doğrusu, 'LinearPolar' dediği şeyi yapar. Ne yazık ki 'import cv' kullanarak kullanılamıyordu, ama ben opencv import cv'den sonra' cv.cvLinearPolar' denedim ve çalıştım. Sonraki günlerde büyük veri setlerinde performansını deneyeceğim. Teşekkür ederim! – Papado

+0

havalı. neden görünür değil acaba? Bir hata raporu doldurmayı deneyeceğim. –

+0

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

2

İşte bir örnek günlük kutuplu scipy kullanılarak uygulanan dönüşümü:

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

bu sadece bir koordinat dönüşüm olduğunu göz önüne alındığında, OpenCV sürümden daha sorununuza adapte kolay olacaktır.

+0

Sayın Stefan, geri bildiriminiz için çok teşekkür ederim. Önümüzdeki günlerde uygulamanızı kontrol edip kıyaslayacağım. Btw, Supreme'ye göz gezdirdim ve çok ilginç görünüyor. Bununla ilgili bir yazı yayınladınız mı? – Papado

+0

@Papado Yorumunuzu hiç görmedim, ancak evet - arXiv ve tez hakkında bir makale var. Bu arada, log polar dönüşümü şimdi "skimage.transform.warp" kullanılarak yaklaşık 5 satırlık kodda scikit görüntüsünün üzerine uygulanabilir. –

3

En son opencv sürümleri cv2.linearPolar işlevini destekler. Bu OpenCV kullanımını içermeyen başka bir çözüm olabilir:

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

Merhaba Alessandro- Bu sorunu bu şekilde çözmeye çalıştım ve benzer kod yazdım, buna rağmen meshgrid yerine bir döngü kullandım (daha önce hiç görmedim); Bunun ne kadar iyi performans gösterdiğini biliyor musun? Benimki bir VGA görüntüsü için 1 sene sürüyordu - çok uzun. – cjm2671

+0

Tamam, kodunuzu test ettim ve yinelemeli çözümüm ile karşılaştırıldığında ÇOK hızlı ve yeni bir şey öğrendim - çok teşekkür ederim! – cjm2671

İlgili konular