2016-05-03 5 views
3

私は2次元マトリックスを持っています。行列内には、要素がゼロでない、特にエッジの周りのすべてがゼロである領域があります。ループのない行列の境界を決定する

私は、画像をcolorplotとしてプロットし、非ゼロ値の境界線がゼロ値になっていることを示す曲線をマトリックスに追加したいと考えています。ループなしでこれを行うためのすてきな方法はありますか?

答えて

6

これはconvhullのための仕事のようになります。私はダミーの例を取るよ、このコードを説明するために

A=zeros(10); 
B=binornd(1,0.5,8,8); 
A(2:end-1,2:end-1)=B 

A = 

0  0  0  0  0  0  0  0  0  0 
0  0  0  1  0  0  0  0  0  0 
0  0  1  1  1  1  1  1  0  0 
0  0  1  1  0  0  0  0  1  0 
0  0  0  1  0  0  0  1  0  0 
0  1  0  0  0  0  0  1  0  0 
0  0  0  1  1  1  1  1  1  0 
0  0  1  0  1  1  1  1  0  0 
0  1  0  1  1  1  1  0  1  0 
0  0  0  0  0  0  0  0  0  0 

1 /すべての非ゼロのエントリの場所を探す:

[row,col]=find(A); 

2 /これらの場所の凸包を取る

k=convhull(row,col); 

3 /プロット凸包(私はaswell非ゼロ点をプロットが、あなたの問題で、それはあなたのイメージポイントになります)

plot(row(k),col(k),'r-',row,col,'b*') 

結果:

enter image description here

+0

問題を解決する良い方法! –

+0

いい仕事@Billbokeey – 16per9

+0

@BillBokeey:あなたの答えのおかげで、ありがとう!私は正しく転置された行列を最初に入力することにいくつかの問題がありましたが、あなたのソリューションが完璧に機能していることを克服した後で! – Wolpertinger

2

もう1つのオプションは、画像処理ツールボックスとbwperim機能。これは、あなたのエリアが完全に閉じている(つまり、境界に穴がない)ことを知っている場合に機能します。

これは白黒画像を使用した例で、2つのオプションがあります。 。あなたは結果に違いを見ることができます。

A = imread('circles.png'); 

Afill=imfill(A,'holes'); % optional 
Abound1=bwperim(Afill); 
Abound2=bwperim(A); 
imshow([A,Abound, Abound2]) 

enter image description here

あなたはと他の上に1をプロットすることができます:あなたは、グレースケール画像(または単一の行列を持っている場合は

[x,y]= find(Abound2); 
hold on 
image(A*255) %// If A is logical, else use just A (not *255) 
colormap('gray') 
plot(y,x,'r.') 
hold off 
axis tight 

enter image description here

それぞれの位置(2次元行列)に値を入力すると、最初に次のいずれかで2値化できます。

  1. あなたが知っている場合は、あなた自身のレベルを選択するか、大津DOをさせることで、A=im2bw(yourA,level)によって背景から、あなたのオブジェクトを分離し、背景は正確にゼロではないにしたい場合は、あなたのオブジェクトの外側、すべてが正確にゼロ A=yourA>0;
  2. ですあなたのためにlevel=graythresh(yourA)
関連する問題