2012-03-29 14 views
5

Quiero transformar en arreglos/imágenes 2D de Python a polar, procese luego y, posteriormente, vuelva a transformarlos en cartesianos. El siguiente es el resultado de ImajeJ Polar Transformer plug-in (utilizado en los círculos concéntricos del código de ejemplo):rápido cartesiano a Polar a cartesiano en Python

enter image description here

El número y disminuye su brillo de las imágenes es bastante grande, así que estaba comprobando si OPENCV tiene un rápido y forma simple de hacer esto.

He leído sobre cv. CartToPolar y PolarToCart pero no pude usarlo. Entiendo mejor el LogPolar donde la entrada y la salida son matrices, y donde puede establecer el centro, la interpolación y la inversión (es decir, CV_WARP_INVERSE_MAP). ¿Hay alguna manera de usar CartToPolar/PolarToCart de manera similar?

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

Esto es para una tomografía computarizada (TC) de flujo de trabajo, donde los anillos de los artefactos se pueden filtrar más fácil si aparecen como líneas.

Respuesta

2

el código fuente de CV menciona un LinearPolar. no parece estar documentado, pero parece ser similar al LogPolar. ¿Has probado eso?

+0

Muchas gracias mucho! De hecho, 'LinearPolar' hace lo que dice. Lamentablemente, al usar 'import cv' no estaba disponible, pero probé' from opencv import cv' y luego 'cv.cvLinearPolar' y funciona. Los próximos días intentaré su rendimiento en grandes conjuntos de datos. ¡Gracias! – Papado

+0

genial. Me pregunto por qué no es visible. Trataré de presentar un informe de error. –

+0

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

2

He aquí un ejemplo del registro polar transformada implementado usando SciPy:

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

Teniendo en cuenta que esto es sólo una transformación de coordenadas, debería ser más fácil de adaptar a su problema que la versión OpenCV.

+0

Estimado Stefan, muchas gracias por sus comentarios. Comprobaré y compararé su implementación los próximos días. Por cierto, terminé buscando Supremo y parece muy interesante. ¿Has publicado algún artículo al respecto? – Papado

+0

@Papado Nunca vi su comentario, pero sí, hay un documento sobre arXiv y una disertación. Por cierto, la transformación polar de logs ahora puede implementarse sobre scikit-image en aproximadamente 5 líneas de código, usando '' skimage.transform.warp''. –

3

Las últimas versiones de opencv admiten una función cv2.linearPolar. Esto puede ser otra solución que no implique el uso de 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

Hola Alessandro: intenté resolver este problema de esta manera también, y escribí un código similar, aunque utilicé un bucle en lugar de meshgrid (nunca he visto eso antes); ¿sabes lo bien que funciona? El mío estaba tomando el orden de 1s para una imagen VGA, demasiado tiempo. – cjm2671

+0

OK, he probado su código y es MUY rápido en comparación con mi solución iterativa, además aprendí algo nuevo, ¡muchas gracias! – cjm2671

Cuestiones relacionadas