检查2d点是否在曲线上

时间:2017-07-23 06:36:20

标签: python numpy machine-learning least-squares data-fitting

我的形象: Image to be processed

我正在尝试检测图像中的曲线 - 如图所示,有堆叠的硬币。我想数平行曲线。大多数线都是不连续的。

假设我用numpy.polyfit使用5分并得到描述该线的函数。

搜索线条的最佳方法是什么,并说这些点在第一行,这些点在第2行等。

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

import numpy as np
data = np.array([[0,0], [1,-1], [2, -2], [3,-1], [4,0]])
data_x = [k[0] for k in data ]
data_y = [k[1] for k in data ]
p = np.poly1d(np.polyfit(data_x, data_y, 2))

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

经过多天阅读和浏览互联网,我发现使用lmfit非常优雅的解决方案。 https://lmfit.github.io/lmfit-py/我感谢这个模块的创作者和完成的工作。

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

class ViewModel {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_dashboard:
                Log.d("test","test1");
                return true;
            case R.id.navigation_notifications:
                Log.d("test","test2");
                return true;
        }
        return false;
    }
}

app:onNavigationItemSelected="@{viewModel::onNavigationItemSelected}"

用这些参数创建一个python函数

>>> p

现在我们可以创建一个具有该功能的lmfit模型

poly1d([ 0.42857143, -1.71428571,  0.05714286])

您可以看到它标识了自变量和参数。它将尝试更改参数,以便该函数最适合数据。

def fu(x,a=0.4285,b=-1.71,c=0.057):
    return x*x*a + x * b + c

Dotted line is the 'initial' prediction, the red line is the best fit prediction

完整的python脚本:

>>> gmodel = Model(fu)
>>> gmodel.param_names
['a', 'c', 'b']
>>> gmodel.independent_vars
['x']