4

MATLAB 2D フィルター関数filter2(B,X)と畳み込み関数を使用conv(X,B,'')しているときに、filter2関数は基本的に 2D 畳み込みですが、フィルター係数行列が 180 度回転していることがわかります。filter2との出力に関してはconv2、以下の関係が成り立つことがわかります。

 output matrix of filter2 = each element negated of output of conv2

編集:私は間違っていました。上記の関係は一般には当てはまりませんが、いくつかのケースで見られました。一般に、畳み込みに使用される 2 つのまったく異なるカーネルが両方で取得されるため、2 つの出力行列は無関係です。

2D 畳み込みがどのように実行されるかを理解しています。私が理解したいのは、画像処理用語におけるこれの意味です。ここで何が起こっているかを視覚化するにはどうすればよいですか? フィルター係数行列を 180 度回転させるとはどういう意味ですか?

4

1 に答える 1

6

ウィキペディアの次の画像を使用して、convolutionの非常に簡単な説明から始めます。

代替テキスト

図に示すように、2 つの 1-D 関数を畳み込むには、そのうちの 1 つ (畳み込みカーネル) を反映し、2 つの関数を互いにスライドさせ、それらの積の積分を計算する必要があります。

2 次元行列を畳み込む場合、畳み込みカーネルは両方の次元に反映され、他の行列と重複する一意の組み合わせごとに積の合計が計算されます。このカーネルの次元の反映は、畳み込みの固有のステップです。

ただし、フィルタリングを実行する場合、フィルタリング マトリックスは、フィルタリングされるマトリックス上にそのまま(つまり、反射なしで)直接配置された "ステンシル" であるかのように考えるのが好きです。言い換えれば、畳み込みとして同等の操作を実行したいのですが、フィルタリング行列の次元を反映する必要はありません。したがって、畳み込み中に実行されるリフレクションをキャンセルするために、畳み込みが実行される前にフィルター行列の次元の追加のリフレクションを追加できます。

ここで、任意の 2 次元行列について、MATLAB で関数FLIPDIMおよびROT90Aを使用して、両方の次元を反転させることが行列を 180 度回転させることと同等であることを証明できます。

A = rand(5);  %# A 5-by-5 matrix of random values
isequal(flipdim(flipdim(A,1),2),rot90(A,2))  %# Will return 1 (i.e. true)

filter2(f,A)これがと同等である理由ですconv2(A,rot90(f,2),'same')。フィルター行列と畳み込みカーネルの認識がどのように異なるかをさらに説明するために、FILTER2CONV2fを次のようにA定義された行列の同じセットおよび に適用するとどうなるかを見ることができます。

>> f = [1 0 0; 0 1 0; 1 0 0]  %# A 3-by-3 filter/kernel
f =
     1     0     0
     0     1     0
     1     0     0
>> A = magic(5)  %# A 5-by-5 matrix
A =
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

ここで、B = filter2(f,A);出力要素の計算を実行するB(2,2)と、フィルターの中心要素を並べて、A(2,2)重なり合う要素を乗算することで視覚化できます。

    17*1  24*0   1*0   8    15
    23*0   5*1   7*0  14    16
     4*1   6*0  13*0  20    22
    10    12    19    21     3
    11    18    25     2     9

フィルター行列の外側の要素は無視されるため、積の合計が になることがわかります17*1 + 4*1 + 5*1 = 26。ここでは単に「ステンシル」fのように上に配置しているだけであることに注意してくださいA。これは、フィルタ マトリックスがマトリックス上で動作すると認識される方法です。

を実行するB = conv2(A,f,'same');と、出力要素の計算はB(2,2)代わりに次のようになります。

    17*0  24*0   1*1   8    15
    23*0   5*1   7*0  14    16
     4*0   6*0  13*1  20    22
    10    12    19    21     3
    11    18    25     2     9

積の合計は代わりに になります5*1 + 1*1 + 13*1 = 19fを畳み込みカーネルと見なす場合、 の上に配置する前にその次元を反転する必要があることに注意してくださいA

于 2010-12-22T18:23:27.200 に答える