理工系であればフーリエ変換、DFT, FFTなどを学ぶ。そのFFTで畳み込み演算が出てくる。畳み込みってなんだ? なんで畳や? カーペット演算ではだめかい(笑)
てなわけで畳み込み演算ってなんじゃらほい? いや、FFTでの例は知っている。数式も知っている。時間反転してどーたらという。その反転がミソなのよ、キムチじゃないのよ。
ところで画像処理では2次元でフィルター処理する。Kernel掛ける。3✕3, 5✕5とかの正方行列みたいなの見かける。そこに畳み込み演算と書いてある。するってーと、そのKernelは反転済みのものなのか。そうでないならライブラリで計算する時に数式通りに反転処理しているのか?
畳み込みと似た操作にバターンマッチングがある。これもKernelと入力画像の対応する画素通しの積を計算し和を取る。処理は同じだ。だが、畳み込みではない。カーペットでもない。
てなわけでエッジ抽出等のFilterのKernelは反転済みのものを表示しているのか。つーか、対称であるKernelなら考えなくてもいいけどな(笑)
ということを考えたのはPythonに畳み込み演算関数 convolve( ) があるの見たからである。
これの結果は [ 2 5 11 17 23 17 15] である。ワタクシはどのような計算をしたらこうなるのかが理解出来なかったのである。要素数5と要素数3のconvolve()の結果は要素数7になっている。これを単純に 5 + 3 – 1 = 7としてよいのか。
ほんで資料・解説を読んで分かったのである。どや。上のコードでは書いてないが実は
y = sp.convolve(x,h, mode = “full”) のように mode指定が可能であり、full, valid, same と3種類あるらしい。mode指定しないと full になって上の結果になる。mode換えると出力の要素数が変わる。ま~なんてことでしょ。知らんけど。
つーわけで。今の疑問は画像処理のエッジ抽出等のKernelは反転済みを説明では出しているのか、素なのか、どっちだ? というものである。
OpenCVとかの資料探してみっか。面倒なのでチャッターズに聞こうか(笑)