グレースケール拡張に非対称構造要素を使用する Matlab 拡張関数 imdilate() の誤解

この基本概念に対する答えはすでに他にもたくさんありますが、ここでは主に、不規則な構造要素に直面した場合のグレースケール拡張に imdilate() を使用した結果について説明します。ここに陥りやすい落とし穴があります

まず展開する行列 I を定義します

>> I=[1 2 3;4 5 6;7 8 9]

I =

     1     2     3
     4     5     6
     7     8     9

展開にones(3,3)を使用すると、結果は明らかで、3×3近傍の要素の最大値が取得されます。

>> se = ones(3)

se =

     1     1     1
     1     1     1
     1     1     1

>> DilatedExpandMaskx = imdilate(I,se)

DilatedExpandMaskx =

     5     6     6
     8     9     9
     8     9     9

これは構造要素が対称である場合に当てはまりますが、構造要素が対称でない場合はどうなるでしょうか。

非対称ベクトル要素を構造として取得して、結果を確認できます。

>> se = [1 1 0];
>> DilatedExpandMaskx = imdilate(I,se)

DilatedExpandMaskx =

     2     3     3
     5     6     6
     8     9     9

構造要素の中心を1、左側を1、右側を0として、元の位置の要素と左側の要素を比較し、最大値を取るようにすればよいようです。元の配列に従って配置すると、結果は変わらないはずですが(I要素は要素自体より小さい)、結果は元の位置の要素と右側の要素を比較しているように見えることがわかります位置、最大値が採用されます。なぜ逆のことをするのですか?

構造要素を不規則行列とみなした場合

>> se = ones(3);
>> se(1,1) = 0;
>> se

se =

     0     1     1
     1     1     1
     1     1     1

>> DilatedExpandMaskx = imdilate(I,se)

DilatedExpandMaskx =

     4     5     6
     7     8     9
     8     9     9

左上隅の要素は 0 とみなされ、3×3 近傍の最大値を計算するときに右下隅の要素は含まれないことがわかります。構造要素は中心対称上に配置して計算されているようです。

この現象の理由は式に遡る必要があり、MATLAB のヘルプドキュメントを見るとグレースケール拡張部分で導入されていることがわかります。

A(xx', yy') とはどういう意味ですか? これは、上記の se の左上隅にある要素 x' = y' = -1 について、実際には、I の右下隅にある要素である I(x+1, y+1) を横断することを意味します。 se(-1, -1) = 0、演算に参加しない場合は、Iの右下の要素が演算に参加しないことを意味します。そうみたいです。「犯人」は式中の「-」記号にあり、構造要素を中心に対して対称にし、それを元の行列に入れて展開演算しているようです。

同時に、文書内の別の文にも注目してください。

「+」を使用してグレー スケール拡張を定義する場合、構造要素の中心対称性は必要ありませんが、拡張操作に直接関与することを意味します。式の定義はソフトウェアごとに異なります。もちろん、MATLAB では以前の状況でなければなりません。

おすすめ

転載: blog.csdn.net/Eason_Y/article/details/129350258