3

我正在尝试将 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-');

例子

4

1 回答 1

5

什么地方出了错?

您有两组数字x,并且两组中y的元素数量相同。
你假设
:有一个函数ff( x_i ) = y_i 对于你的集合中的所有对x_i,y_i
湾。集合中的点是有序的:也就是说,如果你遵循f(x)then x_i"comes before"的曲线x_{i+1}

虽然这些假设适用于您拥有的“正确拟合”示例。它们不再适用于“不正确的拟合”示例。
正如您自己所看到的,顶部的输入轮廓不能表示为,y = f(x)因为有些值x两个可能的对应值y(参见数学函数的定义)。你得到的拟合是最接近数学函数的东西y = f(x),可以给出x,y你给出的对(红色曲线具有每个x只有一个y值的属性)。

你能做什么?

在大多数情况下,当您尝试拟合 2D 曲线时,您会搜索参数曲线:也就是说,您会引入一个辅助参数t,以便曲线上的每个点都可以表示[x(t), y(t)]为 some 0<=t<=1
现在,如果假设 b 成立(并且通过查看您的示例,我不确定它是否成立),您可以做的是

 t = linspace( 0, 1, numel(x) ); % define the parameter t
 fitX = fit( t, x, 'cubicinterp'); % fit x as a function of parameter t
 fitY = fit( t, y, 'cubicinterp'); % fit y as a function of parameter t
 plot( fitX, fitY, 'r-' ); % plot the parametric curve
于 2013-05-06T13:57:14.303 回答