对于2D离散数据点(轮廓图像的像素),进行B样条拟合

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-');

example

1个回答

5

出了什么问题?

你有两组数字 xy,两组数字的元素数量相同。
你假设:
a. 存在一个函数 f,使得对于所有的成对的 x_i,y_i,都有 f(x_i) = y_i
b. 集合中的点是有序的:也就是说,如果你跟随 f(x) 的曲线,那么 x_i 会“在” x_{i+1} 之前。

虽然这些假设对于你拥有的“正确拟合”的示例是成立的。但是它们对于“错误拟合”的示例已经不再有效
正如你自己所看到的,顶部的输入轮廓无法表示为 y = f(x),因为存在 x 的值,对应着 两个 可能的 y 值(请参见数学函数的定义)。你得到的拟合是最接近给定的 x,y 对的数学函数 y = f(x)(红色曲线具有每个 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接