B样条拟合到2D离散数据点(轮廓图像的像素)

3 matlab image-processing curve-fitting bspline

我试图将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-');
Run Code Online (Sandbox Code Playgroud)

例

Sha*_*hai 5

什么地方出了错?

您有两组数字x,两组中y的元素数量相同.
你假设:
a.有一个函数f,f( x_i ) = y_i对于x_i,y_i你的集合中的所有对.
湾 该集合点是有序的:那就是,如果你遵循的曲线f(x)x_i"之前来" x_{i+1}.

虽然这些假设适用于你所拥有的"正确拟合"的例子.它们不再适用于"不合适"的例子.
正如你可以看到自己,在上面输入轮廓不能被表示为y = f(x)因为有值x对其中有2个可能对应的值y(见数学函数的定义).你得到的拟合是最接近数学函数的东西y = f(x),可以给出x,y你给出的对(红色曲线的属性x只有一个y值).

你能做什么?

在大多数情况下,当您尝试拟合2D曲线时,您将搜索参数曲线:即,您引入辅助参数t,使得曲线上的每个点都可以表示[x(t), y(t)]为某些曲线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
Run Code Online (Sandbox Code Playgroud)