ウィキペディアの次の画像を使用して、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')
。フィルター行列と畳み込みカーネルの認識がどのように異なるかをさらに説明するために、FILTER2とCONV2f
を次のように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 = 19
。f
を畳み込みカーネルと見なす場合、 の上に配置する前にその次元を反転する必要があることに注意してくださいA
。