1

次のマトリックスがあります。

1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1
1 1 2 2 2 1 1 3
1 1 2 2 2 2 1 3
1 1 1 1 2 1 1 3
1 1 1 1 1 1 1 1

値 2 の領域をサイズ 1 で拡張します。つまり、拡張後の出力は次のようになります。

1 1 2 2 2 1 1 1 
1 2 2 2 2 2 1 1
2 2 2 2 2 2 2 3
2 2 2 2 2 2 2 2
1 2 2 2 2 2 2 3
1 1 2 2 2 1 1 1

imerode はバイナリ イメージの場合は拡大縮小できると思いますが、この場合は適用されません。この問題を解決できるmatlabの方法はありますか?

4

1 に答える 1

4

ワンライナー ソリューション

使用する:

mat(imdilate(mat==2,strel('disk',2)))=2;

結果

mat =

 1     1     2     2     2     1     1     1
 1     2     2     2     2     2     1     1
 2     2     2     2     2     2     2     3
 2     2     2     2     2     2     2     2
 1     2     2     2     2     2     2     3
 1     1     2     2     2     2     1     1

ステップバイステップの説明

この問題の解決策は、行列が 2 に等しい領域での拡張操作に基づいています。これは次のように実行できます。

%initializes the input matrix
mat = [1,1,1,1,1,1,1,1 ; 1,1,1,1,1,1,1,1; 1,1,2,2,2,1,1,3 ; 1,1,2,2,2,2,1,3; 1,1,1,1,2,1,1,3 ; 1,1,1,1,1,1,1,1];

%initilizes a mask which represents the reion which we want to exapand
roiMask = mat==2;

%perform expansion to this mask by imdilate function
dilatedRoi = imdilate(mat==2,strel('disk',2));

%assigns the new value into the original matrix
mat(dilatedRoi) = 2;

拡張操作は構造化要素オブジェクトによって特徴付けられることに注意してください。これは基本的に、拡張を実行する方法を定義するバイナリ マトリックスです。この例では、以下を生成する MATLAB の strel 関数を使用しました。

strel('disk',2)

ans = 
 0     0     1     0     0
 0     1     1     1     0
 1     1     1     1     1
 0     1     1     1     0
 0     0     1     0     0

必要な拡張動作を完全に制御するために、strel を変更することができます。

于 2016-06-10T07:30:46.143 に答える