2

我有以下图像:

在此处输入图像描述

有没有办法使用 连接点(在它们之间画一条线)MATLAB?我尝试plot将图像传递给它,但没有用。

谢谢。

更新

我期望连接点的方式大致如下图示例中的红线所示:

在此处输入图像描述

4

2 回答 2

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

在此处输入图像描述

相反,如果您想要类似于 a 的东西,那么您可以在运行该步骤plot后尝试此操作:find

[ix ii]=sort(ix);
iy = iy(ii);

imshow(img)
hold on
plot(iy,ix,'k')
set(gca,'Ydir','reverse')

在此处输入图像描述

于 2013-08-30T16:00:06.810 回答
1

要通过多个点绘制轨迹,您可以定义一个邻接矩阵并使用gplot来显示。

这是一个展示这个想法的片段,虽然你会注意到这个相当简单的代码输出有点混乱。这取决于您想要的线条有多干净以及是否允许交叉 - 可能有更好的方法来创建邻接矩阵。

这假设您已将点的位置提取到大小为 nx 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');

m = 100 的 gplot

于 2013-09-02T10:14:48.890 回答