ガウスぼかし1


 AviUtlのプラグインにぼかしフィルタがあまり存在しないようなので、ガウスぼかしフィルタを作ってみました。いつものところにソース付きでアップしてあります。

 AviUtl プラグイン フィルタ by うえぽん

 テレビのニュース番組などで連行される容疑者の手錠がぼかされていることがありますが、それに似たようなこともできます。こんな感じです。

ガウスぼかし2


●参考にしたサイト
 下のサイトを参考にしました。

 ・MemoNyanDum : ガウスぼかし GaussianBlur
 ・t-pot『ガウスフィルタ』
 ・Gaussian blur - Wikipedia

 基本的なことは上のページを見れば大体分かります。
 上2つのページの補足としては、横と縦の2パスで処理するのはプログラムの理屈を分かりやすくするためのように思えますが、Wikipediaによると、実は高速化にもなっているそうです。O(m*n*M*N)がO((m+n)*M*N)になります。

●縦を横にして簡略化
 このガウスぼかしフィルタは重たいです。しかし何も工夫していない分けではありません。キン肉マンという漫画で「6をひっくり返すと9になる」だとか「8を横にすると∞」だといった理論がありましたが、そんな感じで簡略化してあります。
 具体的には“横方向へぼかす”→“縦方向へぼかす”と別々の関数で処理しているのを、“横方向へぼかす関数”の出力を縦横逆にすることによって、2パス目の処理も同じ“横方向へぼかす関数”で処理させています。

2pass処理最適化説明


 メモリーのアクセス速度を気にする人は少ないようですが、横方向への処理はピクセルデータがメモリー上に連続するのでCPUの内部キャッシュにヒットしやすくなります。縦方向を横方向へすることによりキャッシュのヒット率が向上し、結果的に処理速度がアップします。実際、これによって処理時間が20%ぐらい短くなりました。
 あと、2つの関数を1つになることでプログラムの修正が容易になります。こうい画像処理はアセンブラレベルで最適化(SSEやSSE2へ対応)されることが多いですが、2つが1つになれば2倍楽になりますし、やることも減るのでミスも減るかもしれません。

●ベンチマーク
 私の環境(Athlon64x2 4200+を2.4GHzにOC)でベンチマークしてみました。σを8にして1280x720の動画をぼかした際の結果です。

-マルチスレッドシングルスレッド
浮動小数点0.172 sec0.344 sec
固定小数点0.235~0.250 sec0.515 sec


 浮動小数点が固定小数点の1.5倍の速さというのに驚きです。Athlon64は浮動小数点処理が速いらしいのでその可能性があります。もしかしたら他のCPUでは固定少数点の方が速いかもしれません。
 あと、マルチスレッド処理によって処理時間が綺麗に2倍になってます。固定小数点だと2倍以上になってますが、これは謎です。