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

ここに画像の説明を入力

代わりに に似たものが必要な場合は、ステップ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 (Statistics ツールボックスが必要) で検出され、次に開始点を選択して、まだ使用されていない最近傍を決定することによって、隣接行列が埋められます。これにより、すべてのポイントが最大 2 つの他のポイントに接続されることになります。ただし、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 に答える