我有以下图片:
有没有办法使用MATLAB
连接点(在它们之间划一条线)?我通过传递图像来尝试plot
,但没有用。
感谢。
更新
我期望连接点的方式大致如下图中的红线所示:
答案 0 :(得分:9)
您可以通过多种方式执行此操作,例如:
img=im2double(imread('SWal5.png'));
m = bwmorph(~img,'shrink',Inf);
[ix iy] = find(m);
tri = delaunay(iy,ix);
image(img)
hold on
triplot(tri,iy,ix,'g')
set(gca,'Ydir','reverse')
axis square off
如果您想要类似于plot
的内容,那么您可以在运行find
步骤后尝试此操作:
[ix ii]=sort(ix);
iy = iy(ii);
imshow(img)
hold on
plot(iy,ix,'k')
set(gca,'Ydir','reverse')
答案 1 :(得分:1)
要通过多个点绘制轨迹,您可以定义邻接矩阵并使用gplot进行显示。
这是一个显示这个想法的片段,虽然你会注意到这个相当简单的代码输出有点乱。这取决于你想要的线条是否干净以及是否允许交叉 - 可能有更好的方法来创建邻接矩阵。
这假设您已将点的位置提取到矩阵“数据”中,其大小为n x 2(在这种情况下,我只是从图像中取出200个点进行测试)。
基本上,找到最近的点knnsearch(需要统计工具箱),然后通过选择一个起点并确定尚未使用的最近邻居来填充邻接矩阵。这导致每个点最多连接两个其他点,只要使用knnsearch找到的点数就足以让你自己回到一个角落,在那里已经使用了所有最近的点(在这种情况下为100)。
datal = length(data);
marked = ones(datal,1);
m = 100; % starting point - can be varied
marked(m)=0; % starting point marked as 'used'
adj = zeros(datal);
IDX = knnsearch(data, data,'K',100);
for n = 1:datal;
x = find(marked(IDX(m,:))==1,1,'first'); % nearest unused neighbour
adj(m,IDX(m,x))=1; % two points marked as connected in adj
marked(IDX(m,x))=0; % point marked as used
m = IDX(m,x);
end
gplot(adj, data); hold on; plot(data(:,1),data(:,2),'rx');