line smoothing algorithm in python?

瘦欲@ 提交于 2019-11-29 05:40:43

问题


I am doing research on line generalization, which will be applied to obtain generalized Road Network map from large scale map to small scale map. I am using two operation and two algorithms. It is done in python programming language using shapefile library, it is for vector data in 2d. Operation: Selection and Elimination. For selection I am using condition like, all the roads, width more than 7 meters selected, it is connected with attribute features of the roads. Same with elimination, like all the roads, width less than 5 meter, eliminated. So far it was no much problem.

After selection and elimination operations applied, we will have shape file, roads which passed the condition. I am using two algorithms, Line simplification and line Smoothing. For simplification of line I am using Douglas-Peucker's line simplification algorithm. it is taking vector data (coordinates) and based on tolerance removing some points. I an doing it using Python programming language. After getting simplified lines it needs some editing like line smoothing. Here, I am using Gaussian algorithm, however it is returning some error, which i don't understand, as i am new in programming environment

import numpy

 ### This is the Gaussian data smoothing function I wrote ###  

def smoothListGaussian(list1,degree):  

     window=degree*2-1  

     weight=numpy.array([1.0]*window)
     print weight

     weightGauss=[]  

     for i in range(window):  

         i=i-degree+1  

         frac=i/float(window)  

         gauss=1/(numpy.exp((4*(frac))**2))  

         weightGauss.append(gauss)  

     print weightGauss
     weight=numpy.array(weightGauss)*weight
     print weight
     print len(list1)-window


     smoothed=[0.0]*(len(list1)-window)
     print smoothed

     for i in range(len(smoothed)):  

         smoothed[i]=sum(numpy.array(list1[i:i+window])*weight)/sum(weight)  

     return smoothed


a=[[78.03881018900006, 30.315651467000066], [78.044901609000078, 30.31512798600005], [78.04927981700007, 30.312510579000048], [78.050041244000056, 30.301755415000059], [78.072646124000073, 30.281720353000082], [78.07902308000007, 30.273344651000059]]

smoothListGaussian(a,3)

Any, ideas, please. Or if there any other algorithms in python which smooths lines in vector data using coordinates of the each point in the line

Any answers appreciated!


回答1:


I guess you used the code from here. You should have paid attention that the code was for a single dimension data points not for multi-dimension data points.

I am not much aware of Gaussian smoothing algorithm but after only briefly going through your code, I believe following is what you are trying to do (I am not sure if it gives you the result you desire). Replace last portion of your code with the following code:

smoothed=[0.0,0.0]*(len(list1)-window)
print smoothed

for i in range(len(smoothed)):
    smoothing=[0.0,0.0]
    for e,w in zip(list1[i:i+window],weight):
        smoothing=smoothing+numpy.multiply(e,w)
    smoothed[i]=smoothing/sum(weight)



回答2:


You can smooth the path by following code:

from scipy.ndimage import gaussian_filter1d
import numpy as np
a=np.array([[78.03881018900006, 30.315651467000066],
 [78.044901609000078, 30.31512798600005], 
 [78.04927981700007, 30.312510579000048],
 [78.050041244000056, 30.301755415000059],
 [78.072646124000073, 30.281720353000082],
 [78.07902308000007, 30.273344651000059]])

x, y = a.T
t = np.linspace(0, 1, len(x))
t2 = np.linspace(0, 1, 100)

x2 = np.interp(t2, t, x)
y2 = np.interp(t2, t, y)
sigma = 10
x3 = gaussian_filter1d(x2, sigma)
y3 = gaussian_filter1d(y2, sigma)

x4 = np.interp(t, t2, x3)
y4 = np.interp(t, t2, y3)

plot(x, y, "o-", lw=2)
plot(x3, y3, "r", lw=2)
plot(x4, y4, "o", lw=2)

Here is the resut: blue dots are the original data, red curve are the smoothed curve which contains many points, if you want the same point count as original data, you can sample from the red curve and get the green points.

You can set sigma to change the smooth level of gaussian_filter1d().



来源:https://stackoverflow.com/questions/15178146/line-smoothing-algorithm-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!