私は2次元マトリックスを持っています。行列内には、要素がゼロでない、特にエッジの周りのすべてがゼロである領域があります。ループのない行列の境界を決定する
私は、画像をcolorplotとしてプロットし、非ゼロ値の境界線がゼロ値になっていることを示す曲線をマトリックスに追加したいと考えています。ループなしでこれを行うためのすてきな方法はありますか?
私は2次元マトリックスを持っています。行列内には、要素がゼロでない、特にエッジの周りのすべてがゼロである領域があります。ループのない行列の境界を決定する
私は、画像をcolorplotとしてプロットし、非ゼロ値の境界線がゼロ値になっていることを示す曲線をマトリックスに追加したいと考えています。ループなしでこれを行うためのすてきな方法はありますか?
これは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*')
結果:
もう1つのオプションは、画像処理ツールボックスとbwperim
機能。これは、あなたのエリアが完全に閉じている(つまり、境界に穴がない)ことを知っている場合に機能します。
これは白黒画像を使用した例で、2つのオプションがあります。 。あなたは結果に違いを見ることができます。
A = imread('circles.png');
Afill=imfill(A,'holes'); % optional
Abound1=bwperim(Afill);
Abound2=bwperim(A);
imshow([A,Abound, Abound2])
あなたはと他の上に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
それぞれの位置(2次元行列)に値を入力すると、最初に次のいずれかで2値化できます。
A=im2bw(yourA,level)
によって背景から、あなたのオブジェクトを分離し、背景は正確にゼロではないにしたい場合は、あなたのオブジェクトの外側、すべてが正確にゼロ A=yourA>0;
level=graythresh(yourA)
問題を解決する良い方法! –
いい仕事@Billbokeey – 16per9
@BillBokeey:あなたの答えのおかげで、ありがとう!私は正しく転置された行列を最初に入力することにいくつかの問題がありましたが、あなたのソリューションが完璧に機能していることを克服した後で! – Wolpertinger