2012-03-29 8 views
5

voglio trasformare in Python 2d array/immagini a polare, processo poi, e successivamente trasformarli di nuovo a cartesiano. Quello che segue è il risultato da ImajeJ Polar Transformer plug-in (utilizzato sui cerchi concentrici del codice di esempio):veloce cartesiana a polare a cartesiani in Python

enter image description here

Il numero e si affievolisce delle immagini è abbastanza grande in modo da stavo controllando se OpenCV ha un veloce e modo semplice per farlo.

ho letto su cv. CartToPolar e PolarToCart ma non sono riuscito a usarlo. Comprendo meglio il LogPolar dove l'ingresso e l'uscita sono array, e dove è possibile impostare il centro, interpolazione e inversione (cioè CV_WARP_INVERSE_MAP). C'è un modo per usare CartToPolar/PolarToCart in modo simile?

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

Questo è per una tomografia (CT) dove workflow anelli manufatti possono essere filtrati più facile se appaiono come linee.

risposta

2

il codice sorgente CV menziona un LinearPolar. non sembra essere documentato, ma sembra essere simile a LogPolar. hai provato?

+0

Grazie molto molto! Infatti 'LinearPolar' fa quello che dice. Sfortunatamente usando 'import cv' non era disponibile, ma ho provato' da opencv import cv' e poi 'cv.cvLinearPolar' e funziona. I prossimi giorni proverò le sue prestazioni in serie di dati di grandi dimensioni. Grazie! – Papado

+0

cool. mi chiedo perché non è visibile? proverò a compilare una segnalazione di bug. –

+0

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

2

Ecco un esempio del log-polare transform implementato utilizzando SciPy:

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

Dato che questa è solo una trasformazione di coordinate, dovrebbe essere più facile per adattarsi al vostro problema rispetto alla versione OpenCV.

+0

Caro Stefan, la ringrazio molto per il tuo feedback. Controllerò e benchmark la tua implementazione nei prossimi giorni. A proposito, ho finito per cercare Supreme e sembra molto interessante. Hai pubblicato qualche articolo a riguardo? – Papado

+0

@Papado Non ho mai visto il tuo commento, ma sì - c'è un articolo su arXiv e una tesi. A proposito, la trasformata polare del log può ora essere implementata in cima all'immagine scikit in circa 5 righe di codice, usando '' skimage.transform.warp''. –

3

più recenti versioni di OpenCV supporta una funzione cv2.linearPolar. Questa può essere un'altra soluzione che non comporta l'uso di 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

Ciao Alessandro- Ho provato a risolvere questo problema anche in questo modo, e ho scritto codice simile, anche se ho usato un ciclo invece di meshgrid (non l'ho mai visto prima); sai quanto bene si comporta? Il mio stava assumendo l'ordine di 1 secondo per un'immagine VGA - troppo lungo. – cjm2671

+0

OK, ho testato il codice ed è MOLTO veloce rispetto alla mia soluzione iterativa, in più ho imparato qualcosa di nuovo, grazie mille! – cjm2671

Problemi correlati