用numpy计算曲率时出错

时间:2015-02-03 23:19:48

标签: python numpy

我正在尝试使用formula here计算每个点的2D曲线的曲率。我遇到的问题是,当我得到一个恒定的值时,这个值不正确。这是我的代码:

from scipy.ndimage import gaussian_filter1d
import numpy as np

def curvature(x, y):
    #first and second derivative
    x1 = gaussian_filter1d(x, sigma=1, order=1, mode='wrap')
    x2 = gaussian_filter1d(x, sigma=1, order=2, mode='wrap')
    y1 = gaussian_filter1d(y, sigma=1, order=1, mode='wrap')
    y2 = gaussian_filter1d(y, sigma=1, order=2, mode='wrap')
    return np.abs(x1*y2 - y1*x2) / np.power(x1**2 + y1**2, 3/2)

# make circle data
alpha = np.linspace(-np.pi/2,np.pi/2, 1000)
R = 5
x = R*np.cos(alpha)
y = R*np.sin(alpha)

>>> 1 / curvature(x, y)
array([  9.60e+02,   5.65e+01,   4.56e-01,   1.41e-02,   6.04e-01,
         6.04e-01,   6.04e-01,   6.04e-01,   6.04e-01,   6.04e-01,
         6.04e-01,   6.04e-01,   6.04e-01,   6.04e-01,   6.04e-01,
         ...

我希望得到接近5的东西。有人可以帮助我发现错误或建议更强大的方法来做到这一点吗?实际上,我的x,y点间距不均匀。

编辑:我使用gaussian_filter1d而不是np.gradient作为衍生产品,因为显示here这是一种更强大的方法,特别是对于二阶导数。

1 个答案:

答案 0 :(得分:2)

曲率公式取决于xy的一阶和二阶导数。

您的代码假设gaussian_filter1d与x的一阶导数相同。事实并非如此。

查找np.gradient(x,dalpha),其中dalpha是步长。

修改如果你想通过gaussian_filter1d,你应该没问题,但二阶导数的计算并没有达到预期效果。以下是一些工作代码,其中我已经完成了2个一阶导数以获得x2y2

import numpy as np
def curvature(x, y):
    #first and second derivative
    dalpha = np.pi/1000
    x1 = gaussian_filter1d(x, sigma=1, order=1, mode='wrap')
    x2 = gaussian_filter1d(x1, sigma=1, order=1, mode='wrap')
    y1 = gaussian_filter1d(y, sigma=1, order=1, mode='wrap')
    y2 = gaussian_filter1d(y1, sigma=1, order=1, mode='wrap')
    return np.abs(x1*y2 - y1*x2) / np.power(x1**2 + y1**2, 3./2)

# make circle data
alpha = np.linspace(-np.pi/2,np.pi/2, 1000)
R = 5
x = R*np.cos(alpha)
y = R*np.sin(alpha)

print 1/curvature(x,y)

经过大量仔细检查后,我发现y2看起来不像-y,而x2也是如此。我从您的代码中做出的更改是,现在y2x2来自y1x1gaussian_filter1d来自order=1。我不太了解过滤器正在做什么,以便能够说明为什么两个通过过滤器order=1似乎有效但单order=2没有通过。