sorting points to form a continuous line

后端 未结 4 694
予麋鹿
予麋鹿 2020-12-13 02:37

I have a list of (x,y)-coordinates that represent a line skeleton. The list is obtained directly from a binary image:

import numpy as np    
list=np.where(im         


        
4条回答
  •  南方客
    南方客 (楼主)
    2020-12-13 03:17

    I had the exact same problem. If you have two arrays of scattered x and y values that are not too curvy, then you can transform the points into PCA space, sort them in PCA space, and then transform them back. (I've also added in some bonus smoothing functionality).

    import numpy as np
    from scipy.signal import savgol_filter
    from sklearn.decomposition import PCA
    
    def XYclean(x,y): 
    
        xy = np.concatenate((x.reshape(-1,1), y.reshape(-1,1)), axis=1)     
    
        # make PCA object
        pca = PCA(2)
        # fit on data
        pca.fit(xy)
        
        #transform into pca space   
        xypca = pca.transform(xy) 
        newx = xypca[:,0]
        newy = xypca[:,1]
    
        #sort
        indexSort = np.argsort(x)
        newx = newx[indexSort]
        newy = newy[indexSort]
    
        #add some more points (optional)
        f = interpolate.interp1d(newx, newy, kind='linear')        
        newX=np.linspace(np.min(newx), np.max(newx), 100)
        newY = f(newX)            
    
        #smooth with a filter (optional)
        window = 43
        newY = savgol_filter(newY, window, 2)
    
        #return back to old coordinates
        xyclean = pca.inverse_transform(np.concatenate((newX.reshape(-1,1), newY.reshape(-1,1)), axis=1) )
        xc=xyclean[:,0]
        yc = xyclean[:,1]
    
        return xc, yc
    

提交回复
热议问题