平滑化(2) 平均値フィルタ(1)
2010/01/12 20:07 - AS3.0
平滑化の具体的なコードを書く前に、線形空間フィルタとは何か、についてちょこっと。
「OpenGL+GLSLによる画像処理プログラミング」P78 には以下のようなことが書いてあります。
その演算について、何か難しい計算式が書いてありますがそれはさておき、この計算を「たたみ込み演算」もしくは「コンボリューション(Convolution)」と呼ぶとのこと。
そしてこの演算は、注目点プラス周囲の画素数個の要素を持ったマトリクスに置き換えることができるとのこと。
注目点プラス周囲の画素数個の要素が必要、ってことは最小限のマトリクスは、注目点自身とその左右、および上下に3個ずつの計9個の要素から成り立ちます。
注目点の左斜上 P0 | 注目点の上 P1 | 注目点の右斜上 P2 |
注目点の左 P3 | 注目点 P4 | 注目点の右 P5 |
注目点の左斜下 P6 | 注目点の下 P7 | 注目点の右斜下 P8 |
注目点の画素値を求める式は以下のようになります。
(「C言語で学ぶ実践画像処理」P66)より
ConvolutionFilter ってこういうことだったんですねー。まともにライブヘルプ読んでなかったから、何をするクラスかよく分かんなかったんですが、今回画像処理の学習をして知ることができました。
で、平均値フィルタで使う最小限のマトリクスはどういう記述になるのかというと、以下のようになるんだそうです。
上の式でも9で割っているんで、だいたい分かると思いますが、各要素が 1/9 になっている理由は、各要素の総和が1になるようにしないと、処理後の画像の明るさが変わってしまうからとのこと。
最小限のマトリクスは3×3の9個ってことは、その次に小さいマトリクスは 5×5 になるってことですね。
これらのマトリクスを ConvolutionFilter の第3引数に代入し、BitmapData の applyFilter に突っ込んだ結果が右のものです。上から原画像、3×3 適用、5×5 適用になっています。マトリクスが大きくなるほどボケも強くなります。
ところでここで疑問なんですが、ConvolutionFilter の機構がこのようなものだとすると、ConvolutionFilter の第1引数と第2引数は同じ値で、さらに奇数しか取り得ない、ってことなんですかね?
乞う諸賢のご助言。