2012-06-17 3 views
6

Mam mały problem, gdy biorę kontur obrazu, otrzymuję tę liczbę:Jak mogę połączyć krzywe Discontinous w matplotlab, scipy lub etc

jak można zobacz, czy mogę wyodrębnić kontur, ale gdy tylko wyodrębnię ścieżkę, pozostawi te dziwne sieczki, które przekroczą obraz, ponieważ na krzywej znajdują się 2 nieciągłe obszary. Zastanawiam się, czy istnieje sposób, aby odłączyć nieciągłe linie czy jest to moja ścieżka kod wydobycia jest źle

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] 

Dziękuję za poświęcony czas

dla user545424 Tutaj chyba. Funkcja konturu Matplotlib działa poprawnie, ponieważ na obrazie pojawiają się dwa nieciągłe punkty, które spowodowały to małe zdarzenie.

Uczę się, że te sieczna są przyczyną przez scypi, ale to podnosi inny problem, w jaki biblioteki interakcji z punktów konturu

No cóż, uważam, że jest możliwe, aby maskować problem ze znalezieniem ścieżki i interpoluj to. Ale lubię unikać odwracania ścieżki, ponieważ podróżowanie problemem salemanów nie jest miłe dla mojego komputera.

Czy masz jakieś sugestie?

enter image description here

+0

można opublikować zdjęcie? – user545424

+1

Z edycji nie jest jasne, czy problem nadal występuje, czy nie. A tak przy okazji, czy to jest siatkówka? – heltonbiker

+0

Wiem, ale odwrócenie ścieżki pokonuje cel obiektu ścieżki. No cóż, mogę tak napisać, jak rozwiązano, tak myślę. Konwertując na polarny, użytkownik argsort(), aby uzyskać indeks i interpolację obrazu jest prostszy. – user1462442

Odpowiedz

3

Chyba mam odpowiedzi na moje własne pytanie. Te dziwne sidła są spowodowane przez scipy, w którym konektuje się końce listy. Domyślne zachowanie, uważam, że scipy połączy 2 kolejne punkty niezależnie od lokalizacji. Wierzchołki działają poprawnie, ponieważ ściśle przyjął kontur tego obrazu i otoczył krzywą. Powód, dla którego sieczka jest połączona ze środkiem górnego półokręgu. To jest miejsce, w którym kończy się ostatnia ścieżka.

Domyślam się, że konwersja na polarną i refining ścieżki jest prosta, ale nie do końca optymalna, ale no cóż.

Zastanawiam się, czy ktoś ma lepsze rozwiązanie

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