2013-08-30 42 views
2

我有如下圖:連接點的圖像

enter image description here

是否有連接點的方式(在二者之間畫一條線)使用MATLAB?我通過傳遞圖像嘗試plot,但沒有奏效。

謝謝。

UPDATE

我期待到連接點的方式是大致通過下面的圖像樣本中的紅色線所示:

enter image description here

+1

你可以考慮檢查[@荷銀的答案在這裏。(http://stackoverflow.com/questions/10818392/matlab-putting-a-circled-number-onto-一個-圖)。順便說一句,我認爲圖像會變得相當混亂連接點hahaha ... – Werner

+0

如果你可以使用一些圖像處理從圖像中的點(X,Y)座標點抓住,那麼你可以很好地將它們連接到Delaunay三角剖分。 – Dan

+1

連接點聽起來有點模棱兩可。你能否澄清一下:你想繪製一個三角網格作爲@Dan建議或按順序繪製點作爲對排序數據的繪圖命令嗎? –

回答

8

有多種方式你可以做到這一點,例如如下:

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 

enter image description here

相反,如果你想要一個plot一個類似於,那麼你就可以在運行find步驟之後試試這個:

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

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

enter image description here

+0

感謝您的回覆。對於代碼的第一部分,我得到以下錯誤:'使用delaunay的錯誤 必須提供至少三個輸入點來定義一個 三角網格.' – Simplicity

+0

@Simplicity可能是圖像數據類型的問題。我用'im2double'語句替換了'double'轉換。 –

+0

圖像數據類型實際上是「雙」。我真的不明白這個錯誤。 – Simplicity

1

要通過多個點的繪製蹤跡,你可以定義一個鄰接矩陣並使用gplot來顯示。

下面是顯示想法的片段,但您會注意到,使用這個相當簡單的代碼,輸出有點混亂。它取決於你想要如何清理一條線,如果允許交叉 - 可能有更好的創建鄰接矩陣的方法。

這假定你已經提取了你的點的位置到一個大小爲n×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'); 

gplot with m = 100