平滑化(4止) ガウシアンフィルタ
2010/01/14 20:37 - AS3.0
前々回(と前回)、お話しした平均値フィルタは、マトリクス要素が全て同じ値で、その結果、フィルタをかけることで画像がボケるという欠点がありました。
その欠点をある程度改善するため、中央ほど大きな重みづけをおこなう「重みつき平均化」というものがあると、「OpenGL+GLSLによる画像処理プログラミング」P79 に書いてあります。
中央ほど重みづけを大きくするってことは、注目点に近いマトリクスほど値が大きくなるってことですね。
その重みつき平均化のマトリクスの例として、「C言語で学ぶ実践画像処理」P67 に以下のようなマトリクスが示されています。
このような重みづけを「ガウス分布」で求めたフィルタが「ガウシアンフィルタ」と呼ばれるものだそうです。 ガウス分布って何よ? ってことはウィキペティアの該当項目(正規分布)でも見てくだされ。オレもよく分からん。
「実践画像処理入門」P46 を参考に2次元ガウス分布で計算したマトリクスを ConvolutionFilter に突っ込んだのが以下のコードです(なお、上に示した二つのマトリクスのうち、下のものが2次元ガウス分布による値のようです)。
14行目、二重ループの中で変数 val を求めている部分が公式をコード化した部分です。 ガウス分布計算用変数として記述したもののうち、ユーザが変動させることができるのが、変数 sigma(2行目)です。 この値を大きくするとボケも大きくなります。
その sigma をスライダーで変更できるようにしたのが下のサンプルですが、なぜか期待どおりの動きをしません。
前々回、マトリクス要素の総和が1にならないと画像の明るさが変わるという話をし、前回 ConvolutionFilter の第4引数 divisor の話をしましたが、今回その divisor の計算方法は間違ってないと思うんですが、sigma の値が 3.0 を超えたあたりから画像がずいぶん暗くなります。
もっとも確認した結果、sigma が 1 でも 5 でも、ガウス分布による計算で求めたマトリクス各要素の総和は 1 の近似値なので、divisor は関係ないんですかねぇ。 でも divisor を常に 1 にしても暗くなるんですよねぇ。 桁落ちや丸めが積み重なって、どうにかなっちゃってるんですかねぇ。
乞う諸賢のご助言。
以上で平滑化は終了、次回から違うテーマに移ります。