2012-06-17 10 views
6

tengo un pequeño problema, cuando tomo el contorno de una imagen, me sale esta figura:¿Cómo conecto curvas discontinuas en matplotlab, scipy, o etc

Como se puede veo que puedo extraer el contorno, pero tan pronto como extraigo la ruta, dejará estos extraños secantes que cruzarán la imagen porque hay dos áreas discontinuas en la curva. Me pregunto si hay una forma de desconectar las líneas discontinuas o es mi camino extraer el código es incorrecto

import matplotlib.pyplot as plt 
import numpy as np 

def contourPath(img, width, height): 
    x   = np.arange(0,width) 
    y   = np.arange(height,0,-1) 
    X, Y  = np.meshgrid(x,y) 
    plot  = plt.contour(X,Y,img, [0]) 
    pathList = plot.collections[0].get_paths() 
    x, y  = [], [] 
    for i in range(0, len(pathList)): 
     iterPath = pathList[i].iter_segments() 
     for point in iterPath: 
      pt = np.rint(point[0]) 
      x.append(pt[0]) 
      y.append(pt[1]) 
    X   = np.hstack(x) 
    Y   = np.hstack(y) 
    return np.dstack((X,Y))[0] 

Gracias por su tiempo

para user545424 Aquí supongo. La función de contorno Matplotlib funciona correctamente ya que hay dos puntos discontinuos en la imagen que causaron este pequeño evento.

me entero de que esas líneas secantes son causadas por scypi, pero plantea otra cuestión de cómo las bibliotecas interactúan con los puntos del contorno

Bueno, creo que es posible enmascarar el problema mediante la búsqueda de la ruta y interpolarlo. Pero, me gusta evitar volver a definir el camino, ya que el problema de los vendedores ambulantes no es agradable en mi computadora.

¿Tiene alguna sugerencia?

enter image description here

+0

Se puede publicar la imagen? – user545424

+1

De su edición, no está claro si todavía tiene el problema o no. Y, dicho sea de paso, ¿es esto una retina? – heltonbiker

+0

Lo sé, pero volver a definir el camino derrota el propósito de un objeto de ruta. Oh, bueno, podría haberlo publicado como solucionado, supongo. Convirtiendo a polar, el usuario argsort() para obtener el índice e interpolar la imagen es más simple. – user1462442

Respuesta

3

supongo que estoy respondiendo a mi propia pregunta. Esos secantes extraños son causales al conectar los extremos de la lista. El comportamiento predeterminado, creo que es el scipy, conectará 2 puntos secuenciales independientemente de la ubicación. Los vértices funcionan correctamente, porque tomó estrictamente el contorno de esta imagen y ha rodeado la curva. La razón por la cual la secante está conectada al medio del semicírculo superior. Esa es la ubicación donde termina el último camino.

Supongo que convertir a polar y volver a definir el camino es simple pero no exactamente óptimo, pero bueno.

Me pregunto si alguien tiene una mejor solución

def cart2polar(x,y, origin=None, size=np.array([200,200])): 
     ny, nx= size[0], size[1] 
     print size.shape 
     if origin is None: 
      origin_x, origin_y = nx//2, ny//2 
     else: 
      origin_x, origin_y = origin[0], origin[1] 
     x -= origin_x 
     y -= origin_y 
     r = np.sqrt(x**2 + y**2) 
     theta = np.arctan2(y, x) 
     return r, theta 

    def main(): 
     index = np.argsort(theta) 
     r, theta = r[index[:]], theta[index[:]] 
     f = interpolate.interp1d(theta,r) 
     theta = np.linspace(round(theta.min()+.00005,),theta.max(), 200) 
     r = f(theta) 
     x,y = polar2cart(r, theta) 

    def polar2cart(r, theta, origin=None, size=np.array([200,200])): 
     ny, nx= size[0], size[1] 
     if origin is None: 
      origin_x, origin_y = nx//2, ny//2 
     else: 
      origin_x, origin_y = origin[0], origin[1] 
     x += origin_x 
     y += origin_y 

     return x, y