我试图将B样条拟合到一组有序的离散数据点,这些数据点代表从图像中提取的轮廓的像素。
虽然以下代码适用于某些简单的形状,但不适用于其他形状(请参阅附图中的示例)。为什么会发生这种情况,以及解决这个问题的更好方法是什么?
我对微分几何是一个新手,欣赏任何见解或输入。感谢。
% data contains two columns representing x,y coordinates of pixels
x = data(:, 1);
y = data(:, 2);
plot(x, y, 'bo');
fittedmodel = fit(x, y, 'cubicinterp');
plot(fittedmodel, 'r-');
答案 0 :(得分:5)
您有两组数字x
和y
,两组中的元素数量相同。
你假设:
一个。有一个函数f
,f( x_i ) = y_i
为您的集合中的所有对x_i,y_i
。
湾该集合中的点是有序的:也就是说,如果您遵循f(x)
的曲线,那么x_i
“会出现在”x_{i+1}
之前。
虽然这些假设适用于你所拥有的“正确适合”的例子。对于“不合适”的例子,它们不再有效
正如您自己可以看到的那样,顶部上的输入轮廓不能表示为y = f(x)
,因为有x
的值 2 可能的y
对应值(参见definition of mathematical function)。你得到的拟合与数学函数y = f(x)
最接近,可以给出你给出的对x,y
(红色曲线的每个x
的属性只有一个y
价值)。
在大多数情况下,当您尝试拟合2D曲线时,您会搜索parametric curve:也就是说,您会引入辅助参数t
,以便曲线上的每个点都可以表示为{{ 1}}对于某些[x(t), y(t)]
现在,如果假设b成立(并且通过查看您的示例,我不确定它是什么),您可以做的是
0<=t<=1