我在MATLAB中有一系列XY点对。这些对描述图像中形状周围的点;它们不是函数,意味着每个x值可能存在两个或更多y点。
我可以使用
之类的东西单独绘制这些点plot(B(:,1),B(:,2),'b+');
我也可以使用情节连接点:
plot(B(:,1),B(:,2),'r');
我正在尝试检索的是我自己的点值,我可以使用它来连接点,以便我可以使用它们进行进一步分析。我不想要一个完全连接的图形,我需要一些基于数据的东西,而不仅仅是plot()产生的图形。我喜欢让plot()生成这些点(因为它似乎在幕后做),但我尝试使用plot()返回的linseries,它或者不能正常工作,因为我理解它或只是没有给我我想要的东西。
我认为这是一个插值问题,但这些点不包含函数;他们描述了一个形状。基本上,我需要的只是plot()似乎计算的点;连接一系列点的直线。一条曲线将是一个奖励,可以节省我下游的悲伤。
我怎样才能在MATLAB中做到这一点?
谢谢!
编辑:是的,图片会有所帮助:)
蓝点是实际的点值(x,y),使用上面的第一个plot()调用绘制。红色轮廓是使用上面的第二种方法调用plot()的结果。我正在尝试获取红色轮廓的点数据;换句话说,连接蓝点的点。
答案 0 :(得分:6)
Adrien definitely has the right idea:定义参数坐标,然后分别对x和y坐标执行线性插值。
我想添加的另一个方法是定义参数坐标的另一种方法,这样您就可以在一次通过中围绕整个形状创建均匀间隔的插值点。您要做的第一件事,如果您还没有,请确保最后一个坐标点通过复制第一个点并将其添加到结尾来重新连接到第一个坐标点:
B = [B; B(1,:)];
接下来,通过计算后续点之间的总距离,然后计算累积和,您可以获得一个参数坐标,该坐标可以使点靠近在一起的小步骤和相距较远的点的较大步骤:
distance = sqrt(sum(diff(B,1,1).^2,2)); %# Distance between subsequent points
s = [0; cumsum(distance)]; %# Parametric coordinate
现在,您可以使用函数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
这些新的点数不一定包括原始点,因此如果您想确保原始点也出现在新集中,您可以执行以下操作:
[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
示例:强>
这是一个显示上述代码如何执行的示例(我使用了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
答案 1 :(得分:2)
我首先沿不同的段(即数据点之间)定义一些参数坐标
s = 1:size(B,1);
然后,只需使用interp1
在s
空格中进行插值。例如如果要在数据点5和6之间的行上生成10个值:
s_interp = linspace(5,6,10); % parametric coordinate interpolation values
x_coord = interp1(s,B(:,1),s_interp,'linear');
y_coord = interp1(s,B(:,2),s_interp,'linear');
这应该可以解决问题。
一个。
答案 2 :(得分:0)
实际上有一个MATLAB函数“improfile”,它可以帮助你解决问题。让我们说这些是你想要找到这些坐标之间位置的4个坐标。
xi=[15 30 20 10];
yi=[5 25 30 50];
figure;
plot(xi,yi,'r^-','MarkerSize',12)
grid on
只需生成一个随机图像并运行该功能
n=50; % total number of points between initial coordinates
I=ones(max([xi(:);yi(:)]));
[cx,cy,c] = improfile(I,xi,yi,n);
hold on, plot(cx,cy,'bs-','MarkerSize',4)
希望有所帮助