我在MATLAB中有一系列XY点对.这些对描述图像中形状周围的点; 它们不是函数,意味着每个x值可能存在两个或更多y点.
我可以使用类似的东西单独绘制这些点
plot(B(:,1),B(:,2),'b+');
Run Code Online (Sandbox Code Playgroud)
我也可以使用情节连接点:
plot(B(:,1),B(:,2),'r');
Run Code Online (Sandbox Code Playgroud)
我正在尝试检索的是我自己的点值,我可以使用它来连接点,以便我可以使用它们进行进一步分析.我不想要一个完全连接的图形,我需要一些基于数据的东西,而不仅仅是plot()产生的图形.我喜欢让plot()生成这些点(因为它似乎在幕后做),但我尝试使用plot()返回的linseries,它或者不能正常工作,因为我理解它或只是没有给我我想要的东西.
我认为这是一个插值问题,但这些点不包含函数; 他们描述了一个形状.基本上,我需要的只是plot()似乎计算的点; 连接一系列点的直线.一条曲线将是一个奖励,可以节省我下游的悲伤.
我怎样才能在MATLAB中做到这一点?
谢谢!
编辑:是的,图片会有帮助:)
蓝点是实际的点值(x,y),使用上面的第一个plot()调用绘制.红色轮廓是使用上面的第二种方法调用plot()的结果.我正在尝试获取红色轮廓的点数据; 换句话说,连接蓝点的点.

Adrien肯定有正确的想法:定义参数坐标,然后分别对x和y坐标执行线性插值.
我想添加的另一件事是定义参数坐标的另一种方法,这样您就可以在一次通过中围绕整个形状创建均匀间隔的插值点.您要做的第一件事,如果您还没有,请确保最后一个坐标点通过复制第一个点并将其添加到结尾来重新连接到第一个坐标点:
B = [B; B(1,:)];
Run Code Online (Sandbox Code Playgroud)
接下来,通过计算后续点之间的总距离,然后计算累积总和,您可以获得一个参数坐标,该坐标可以使点靠近在一起的小步骤和相距较远的点的较大步骤:
distance = sqrt(sum(diff(B,1,1).^2,2)); %# Distance between subsequent points
s = [0; cumsum(distance)]; %# Parametric coordinate
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用INTERP1Q函数插入一组新的点,这些点沿着连接点的直线在边缘周围均匀分布:
sNew = linspace(0,s(end),100).'; %'# 100 evenly spaced points from 0 to s(end)
xNew = interp1q(s,B(:,1),sNew); %# Interpolate new x values
yNew = interp1q(s,B(:,2),sNew); %# Interpolate new y values
Run Code Online (Sandbox Code Playgroud)
这些新的点集不一定包括原始点,因此如果您想确保原始点也出现在新集中,您可以执行以下操作:
[sAll,sortIndex] = sort([s; sNew]); %# Sort all the parametric coordinates
xAll = [B(:,1); xNew]; %# Collect the x coordinates
xAll = xAll(sortIndex); %# Sort the x coordinates
yAll = [B(:,2); yNew]; %# Collect the y coordinate
yAll = yAll(sortIndex); %# Sort the y coordinates
Run Code Online (Sandbox Code Playgroud)
例:
这是一个显示上述代码如何执行的示例(我使用了11对x和y坐标,其中一个为了完整的例子而重复):
B = [0.1371 0.1301; ... %# Sample data
0.0541 0.5687; ...
0.0541 0.5687; ... %# Repeated point
0.0588 0.5863; ...
0.3652 0.8670; ...
0.3906 0.8640; ...
0.4090 0.8640; ...
0.8283 0.7939; ...
0.7661 0.3874; ...
0.4804 0.1418; ...
0.4551 0.1418];
%# Run the above code...
plot(B(:,1),B(:,2),'b-*'); %# Plot the original points
hold on; %# Add to the plot
plot(xNew,yNew,'ro'); %# Plot xNew and yNew
Run Code Online (Sandbox Code Playgroud)
