我的形象:
我正在尝试检测图像中的曲线 - 如图所示,有堆叠的硬币。我想数平行曲线。大多数线都是不连续的。
假设我用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中。我如何在这里应用最小二乘?
提前致谢!
答案 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
完整的python脚本:
>>> gmodel = Model(fu)
>>> gmodel.param_names
['a', 'c', 'b']
>>> gmodel.independent_vars
['x']