うえぽんSW局

古いタイプの日記ブログです。気まぐれに更新してます。

2008年04月

ガウスぼかし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倍以上になってますが、これは謎です。
このエントリーをはてなブックマークに追加

 ※このブログ記事は古いので、何か間違ったことを書いているかもしれません。ご注意ください。


 AviUtlのフィルタ「間引ける1/2縮小」というのを作ったのでそれに関する薀蓄です。
 フィルタはいつものページにアップしてあります。

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

 このフィルタはセガサターンのエミュレータ「SSF」の動画を編集するために作りました。セガサターンの画面モードは320x224~704x480と幅広くあります。704x224なんてパターンもあったりします。しかしSSFでは画面モードが320x224の時でも二倍の640x448で表示していたりします(遊ぶだけならその方が良いのですが)。しかし、動画にする場合は本来の320x224の方が容量の節約になります。
 そこでこのフィルタを作ってみました。この程度のことは既存のフィルタでも同じことができるかもしれません。

●SSFの画面は縦方向に補間されている?
 下の画像はSSFの同じ場面をキャプしたものです。左はPrintScreenでキャプ、右はSSFのスナップショットでキャプしたものです。

SSFより


 よく見ると左側の方が少しぼやけています。どうやら縦方向にだけ補間されているようです。おそらくWindowsのAPIか何かで縦に引き伸ばしているのだと思います。ディスプレイドライバーが親切に補間しているようです。Bilinear FilteringをOFFにしても変化はなく同じ状態です。
 これをそのまま縮小してしまうとさらにぼやけた映像になります。だからと言ってラインを間引いて縮小しても右側と同じになりません。
 もしくっきりした映像が欲しいなら、スキャンラインをONにしてキャプし、当フィルタで加工すると良いと思います。

●インタレース解除にも使える?
 バーチャファイター2のフレームは下のようにブレブレしてます。テレビのNTSC方式が奇数ラインと偶数ラインを交互に表示しているのを利用して、解像度を上げつつ処理を半分にするためだったと思います。

VF2スナップ1


 この動画をキャプするには、間引いて1/2に縮小すればいいようです。下の画像が単純に間引いたものです。

VF2スナップ2


 しかしテロップのWのあたりなどがギザギザしています。これはテロップが704x448なのに単純に間引いてしまったからです。そこで横方向だけはブレンドして縮小することにします。

VF2スナップ3


 これでだいぶマシになりました。よく見るとギザギザしている部分もありますが、動画にしてしまえばあまり気にならないかと思います。

●ベンチマーク
 「間引ける1/2縮小」には簡単なベンチマーク機能がついてます。マルチスレッドの効果があるのか調べるために付けてみました。
 私が使っている環境はAthlon X2 4200+(AM2)、2.2GHzを約2.4GHzにオーバークロック、メモリはDDR2で約800MHz動作です。これで1280x720の画像を縮小した際の結果は以下の通りです。
-マルチスレッドシングルスレッド上昇率
間引き1.23 sec1.44 sec14.6%
横ブレンド1.24 sec1.65 sec24.8%
縦ブレンド1.96 sec2.24 sec12.5%
4ドットブレンド1.96 sec2.40 sec18.3%
 興味深いのは、縦ブレンドと横ブレンドは同じ計算量なのに横ブレンドの方が処理時間が短いことです。おそらく横ドット同士の方が連続したメモリなのでCPUの内部キャッシュにヒットしやすいためだと思います。メモリ転送量も減っているはずです。
 マルチスレッドで12%~25%ぐらい速度アップしてます。Athlon X2のL2キャッシュは非共有なのでマルチスレッドにすると都合L2キャッシュが2倍になるため、それによる速度アップがほとんどではと考えています。つまり計算速度が倍になったことによる速度アップはそれほど無いと推測しています。L2キャッシュが大きいCPUだとマルチスレッドによる速度アップ率は少ないのではないでしょうか。
 あとマルチスレッドにしても処理時間が同じになってしまうのは、もしかしたらメモリ転送量の壁があるのかもしれません。

●マイナス時の四捨五入
 四捨五入は0.5して小数点以下切捨てという処理が一般的です。しかし-2.5のようにマイナス時が厄介です。これは-2.0にしても-3.0でも良いようですが、YUVの場合、-2.0の方に丸めてしまうと全体的に色が偏ってしまいます。あまり気にならないレベルですが、そういう計算をしているフィルタがいくつも重なっていくと誤差が蓄積していき気になるレベルになるかもしれません。
 当フィルタではマイナスの値をとらない輝度情報は四捨五入、色情報はマイナスもあるので単純に切り捨てるようにしています。
このエントリーをはてなブックマークに追加

 拙作AviUtlプラグインフィルタ「セピア色とか白黒とか」の解説です。
 画像をセピア調にする方法が書かれたサイトがあまり見つからなかったので、もしかしたら何かの参考になるかもしれません。
 フィルタはここに置いてあります。

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

 これが設定ダイアログです。

セピア色とか白黒とかダイアログ


 RGBを指定すると動画の色調を指定色と同じにします。「単色効果」とも言うようです。
 RGBの値はWikipediaに親切に書かれているのでそれを利用することができます。

Wikipediaの色情報


 設定ダイアログにはプリセットとしてセピア色だけでなくヴァーミリオンやクリムゾンなどを用意しました。これはメガドライブやセガサターンのゲームが元ネタになっています。下のような感じになります。

セピア色とか白黒とか


 ニコニコ動画にアップしたのがこれ。



 さて、この画像処理の仕組みは簡単です。RGBをYUVに変換し、動画の全ピクセルのUV値を指定色と同じにします。AviUtlにはRGBをYUVに変換する関数が存在するので指定色をそれで変換。さらにAviUtlの内部処理はYUVなので、当プラグインがやるのはUVを書き換えるだけだったりします。

 一応RGB→YUVの変換の仕組みを説明すると、基本は下のような計算です。

 Y = 0.29891 * R + 0.58661 * G + 0.11448 * B
 U = Y - B (青色の差分)
 V = Y - R (赤色の差分)

 あとは仕様用途に応じてUVの値の範囲を規格化するだけです。ネットを調べるとYUVの変換式があれこれあるのは規格がいくつかあるからです。
 YUVからRGBにする場合は逆の変換をするだけです。

 ちなみに、Yの式を他でも見たことがあるかもしれませんが、これは白黒に変換する式と同じです(つまりUVの値を0にしたのが白黒変換になる)。
このエントリーをはてなブックマークに追加

 星新一のショートショートを一度は読むべきだと思ったので、とりあえず『ほしのはじまり - 決定版星新一ショートショート』(新井素子編集)を買ってみた。




 星新一氏の本は数多くあるが、これを選んだ理由は、収録作品数が54作品と多めで、星新一氏のエッセイも18本収録されているから。
 それと、編者が新井素子というのも選んだ理由だ。以前「クラインの壷」の感想>を読んだとき、巻末の解説を書いていた新井素子が気になってました。他の本でもあんな感じの文章を書いているのかなぁ、と。
 ちなみに、wikipediaの星新一の項目によると、第一回奇想天外SF新人賞で星新一氏が新井素子を強力にプッシュしていたそうだらしい。そういう因縁でこの本を編集を任されたわけだろう。

 感想については、最初の『ボッコちゃん』を読んだだけで書くと、もしかしたら将来これと同じことが起こるかもしれないって感じがする意味ではSFだなぁと思った。実際に現実世界で事件が起きる前に先回りしてショートショートにしてやったという感じ。奇怪な事件が起こると決まって「事実は小説より奇なり」なんて言葉を呟かれるが、その言葉に対する皮肉を感じる。
 秋葉原のメイド喫茶にボッコちゃんがいても良いと思う。

 あと、NHKで今ショートショートの番組がやっているが、あれはあれで良いんじゃないかな。落語の世界では同じ作品でも演じる落語家によって別の作品に見えたりするが、「違うものに見える」というのは別に悪いことではないんだよね。色んな人によって映像化されるのはそれはそれで面白いと思う。
 まあ、駄目なものは駄目だが…。

 現段階ではこれ以上感想をかけないので、以下は収録作品のリスト。

#1 スタイリッシュ!
 ★ボッコちゃん
 ★セキストラ
 ★殺し屋ですのよ
 ★四で割って
 ★夜の音
 ★おみそれ社会
 ★ふしぎな放送
 ★おーい でてこーい
 ★天使考

#2 スラップスティック!?
 ★包囲
 ★死体ばんざい
 ★流行の鞄
 ★証人
 ★オオカミそのほか
 ★すばらしい食事
 ★いいわけ幸兵衛
 ★いそっぷ村の繁栄
 ★逃走の道
 ★逃亡の部屋
 ★発火点

#3 たいへんなお仕事
 ★雄大な計画
 ★秘密結社
 ★盗賊会社
 ★第一部第一課長
 ★外郭団体
 ★サービス
 ★アフターサービス
 ★程度の問題
 ★防止対策
 ★ささやき

#4 神さまのニガワライ
 ★少年と両親
 ★抑制心
 ★あの星
 ★なるほど
 ★お待ち下さい
 ★みつけたもの
 ★つきまとう男たち
 ★めぐまれた人生
 ★妖精
 ★夢の都市
 ★禁断の命令
 ★ねむりウサギ
 ★そして、だれも……

#5 平熱の叙情
 ★鍵
 ★友だち
 ★花とひみつ
 ★友情の杯
 ★愛の鍵

#6 よい終末を!
 ★午後の恐竜
 ★薄暗い星で
 ★殉教
 ★宇宙の男たち
 ★時の渦

#7 終わりなき日常を生きる
 ★殿さまの日
このエントリーをはてなブックマークに追加

↑このページのトップヘ