Python 检查二维点是否位于曲线上

Python 检查二维点是否位于曲线上,python,numpy,machine-learning,least-squares,data-fitting,Python,Numpy,Machine Learning,Least Squares,Data Fitting,我的形象: 我试图检测图像中的曲线——图中有堆叠的硬币。我想数一数平行的曲线。大多数线条是不连续的 假设我在numpy.polyfit中使用了5个点,得到了描述直线的函数 最好的方法是什么来搜索这些线,并说这些点在第一行,这些点在第二行等等 我在考虑尝试最小二乘法,并将线向上向下移动。我认为这条曲线是一条抛物线(ax^2+bx+c)-移动它意味着移动顶点x=-b/2a=>y=a*(-b/2a)^2+b*(-b/2a)+c 请有人帮我举一个例子,如何将图像中的点拟合到我刚找到的p。这里如何应用最

我的形象:

我试图检测图像中的曲线——图中有堆叠的硬币。我想数一数平行的曲线。大多数线条是不连续的

假设我在numpy.polyfit中使用了5个点,得到了描述直线的函数

最好的方法是什么来搜索这些线,并说这些点在第一行,这些点在第二行等等

我在考虑尝试最小二乘法,并将线向上向下移动。我认为这条曲线是一条抛物线(ax^2+bx+c)-移动它意味着移动顶点x=-b/2a=>y=a*(-b/2a)^2+b*(-b/2a)+c

请有人帮我举一个例子,如何将图像中的点拟合到我刚找到的p。这里如何应用最小二乘法


提前谢谢

在互联网上阅读和挖掘了很多天之后,我发现了一个使用lmfit的非常优雅的解决方案。我感谢本模块的创作者以及grea所做的工作

现在是将数据拟合到曲线的解决方案。 当我们有一个多项式p

>>> p
poly1d([0.42857143,-1.71428571,0.05714286])

使用这些参数创建python函数

def fu(x,a=0.4285,b=-1.71,c=0.057):
    return x*x*a + x * b + c
现在,我们可以使用该函数创建lmfit模型

>>> gmodel = Model(fu)
>>> gmodel.param_names
['a', 'c', 'b']
>>> gmodel.independent_vars
['x']
您可以看到,它标识了自变量和参数。它将尝试更改参数,以使函数最适合数据

>>> result = gmodel.fit(y_test, x=x_test)
>>> print(result.fit_report())
[[Model]]
    Model(fu)
[[Fit Statistics]]
    # function evals   = 11
    # data points      = 8
    # variables        = 3
    chi-square         = 2.159
    reduced chi-square = 0.432
    Akaike info crit   = -4.479
    Bayesian info crit = -4.241
[[Variables]]
    a:   0.12619047 +/- 0.050695 (40.17%) (init= 0.4285)
    c:  -0.55833335 +/- 0.553020 (99.05%) (init= 0.057)
    b:  -0.52857141 +/- 0.369067 (69.82%) (init=-1.71)
[[Correlations]] (unreported correlations are <  0.100)
    C(a, b)                      = -0.962 
    C(c, b)                      = -0.793 
    C(a, c)                      =  0.642 

在互联网上阅读和挖掘了很多天之后,我发现了一个使用lmfit的非常优雅的解决方案。我感谢本模块的创作者以及grea所做的工作

现在是将数据拟合到曲线的解决方案。 当我们有一个多项式p

>>> p
poly1d([0.42857143,-1.71428571,0.05714286])

使用这些参数创建python函数

def fu(x,a=0.4285,b=-1.71,c=0.057):
    return x*x*a + x * b + c
现在,我们可以使用该函数创建lmfit模型

>>> gmodel = Model(fu)
>>> gmodel.param_names
['a', 'c', 'b']
>>> gmodel.independent_vars
['x']
您可以看到,它标识了自变量和参数。它将尝试更改参数,以使函数最适合数据

>>> result = gmodel.fit(y_test, x=x_test)
>>> print(result.fit_report())
[[Model]]
    Model(fu)
[[Fit Statistics]]
    # function evals   = 11
    # data points      = 8
    # variables        = 3
    chi-square         = 2.159
    reduced chi-square = 0.432
    Akaike info crit   = -4.479
    Bayesian info crit = -4.241
[[Variables]]
    a:   0.12619047 +/- 0.050695 (40.17%) (init= 0.4285)
    c:  -0.55833335 +/- 0.553020 (99.05%) (init= 0.057)
    b:  -0.52857141 +/- 0.369067 (69.82%) (init=-1.71)
[[Correlations]] (unreported correlations are <  0.100)
    C(a, b)                      = -0.962 
    C(c, b)                      = -0.793 
    C(a, c)                      =  0.642 

您是否考虑过使用RANSAC?您是否需要专门检测那些“硬币”或任何曲线?在第一种情况下,这些是椭圆段(不是抛物线段),不是吗?@SargeBorsch你是对的,这些是椭圆段,但我认为我们可以使用最左边的像素、最右边的像素和顶点将其近似为抛物线。你不同意吗?@Shai我没有试过RANSAC,我对它了解不多。我会深入研究它,看看它是否可行。@Shai我发现它是最符合我需要的RANSAC实现。我会修改它并尝试更新。你考虑过使用RANSAC吗?你需要特别检测那些“硬币”或任何曲线吗?在第一种情况下,这些是椭圆段(不是抛物线段),不是吗?@SargeBorsch你是对的,这些是椭圆段,但我认为我们可以使用最左边的像素、最右边的像素和顶点将其近似为抛物线。你不同意吗?@Shai我没有试过RANSAC,我对它了解不多。我会深入研究它,看看它是否可行。@Shai我发现它是最符合我需要的RANSAC实现。我将修改它并尝试它,然后发布更新。