AviSynthに標準で実装されている TemporalSoften という時間軸ノイズ除去フィルタのお話。
「TemporalSoftenなんてもうAviSnth2.0時代から使っていないよ」もしくは「AviSynthの勉強は古いサイトで行った」ってな方は読んでみて下さい。
すっげー今さらなお話ですが、AviSynth 2.5以降のTemporalSoften高速化モードが付いていたり、シーンチェンジ検出機能がついていたり、知らないウチに少しだけ機能アップしてますねぇ。高速だし、そこそこ使えます。
あとAviSynth 2.5.6からはYV12、YUY2 に加え RGB32 入力でも動作するとの事です。
TemporalSoftenパラメータ
TemporalSoften (clip, int radius,int luma_threshold, int chroma_threshold, int "scenechange", int "mode")
和訳:
TemporalSoften(前後何フレームに影響を与えるかの範囲,輝度の閾値,色差の閾値,シーンチェンジ検出の閾値,モード(2利用を推奨))
シーンチェンジとモードを利用するにはCPUがISSEに対応している必要がある。
RGB素材を読み込んだ場合、輝度・色差をどのように処理するかは当方未調査。
例: TemporalSoften(1,4,8,20,2)
(適切なデフォルト値: TemporalSoften(4,4,8,15,2))
- 各閾値共に、大きくするほどノイズ除去の効果が大きくなる。
(ファイルサイズは小さくなるが残像が大きくなり映像が破綻してくる。) - フレームの影響範囲:整数nを入力すると前後nフレームに影響が出る。
1を入力した場合、前後1フレーム・合計3フレームブレンドする。 - 輝度・色差の閾値:最大値は255。3~4位ならば、人間の目で判別出来ない程度の輝度差・色差の部分のみでノイズ除去が作動する。6~8を超えると、少しだけ気になる箇所が出てくる。
- シーンチェンジ: シーンチェンジをまたがるブレンドを回避。推奨は5~50との事。試して見た感じ、15~25辺りが良かった。
- モード:デフォルトは1。モード2はCPUがSSEに対応している必要があるが、モード1より高速で高品質。
こいつ、SetMTMode(1)で動くぞ・・・
AviSynthをマルチスレッド化するSetMTModeの最速モード(1)に利用しても、TemporalSoftenは今の所安定して作動している。時間軸ノイズフィルタとしては珍しい。
最適なパラメータ
各自で「これだ」って数値を見つける必要があるけれど、個人的には以下
# 実写用
# 輝度の閾値を5以上にすると残像が気になる場合が多いので、輝度は4以下で。色差は8位まで気にならない場合が多い。
TemporalSoften(1,4,8,20,2)
# ↑フィルムのザラザラ感まで残したい場合これくらい。
TemporalSoften(3,4,8,20,2)
# ↑範囲を3に上げるとフィルムのザラザラ感がほぼ無くなる。
# アニメ用
TemporalSoften(3,8,4,20,2)
# ↑実写と比較して輝度差の残像は発生しにくいが、色差の残像が発生し易いので、輝度差8、色差4程度にしてみた。
もの凄く目を凝らすとやっぱり残像は見えるので「静止画として切り取っても美しい映像」が欲しい場合は、もう少し数値を低めに設定する。
処理速度
うっすらとフィルタを掛ける場合、殆ど律速にならない。フィルタ無し | TemporalSoften (1,4,8,20,2) | TemporalSoften (3,4,8,20,2) | FFT3DGPU (参考) | |
768x432 | 74.0fps | 71.5fps | 69.3fps | 73.0fps |
960x540 | 55.4fps | 53.7fps | 52.0fps | 55.4fps |
リサイズにBicubicResize(x,y,0,0.75)利用
Core i7 920(3.4Ghz)
ファイルサイズ
うっすらとフィルタ掛ける場合、思ったよりも縮まない。
いや、こんなモノかな・・・?
フィルタ無し | TemporalSoften (1,4,8,20,2) | TemporalSoften (3,4,8,20,2) | FFT3DGPU (参考) | |
768x432 | 14.3MB | 13.8MB | 13.4MB | 11.6MB |
960x540 | 21.3MB | 20.3MB | 19.6MB | 16.9MB |
ちなみにFFT3DGPUは
・パラメータの細かい調整出来ない
・細部を潰し過ぎる
・映像がやや緑がかる
などが最近気になっているので、キレイに残したい場合は多少サイズが増えてもTemporalSoften をうっすら掛ける方が良いかなあ・・・って感じ。
同時にSpatialSoften も試して見た
SpatialSoften は TemporalSoftenの2D版と言った感じ。同じ原理で作動するけれど、[int radius(範囲)]パラメータが前後のフレームではなく「近隣のピクセル」に作用するもの。
う~む・・・・こちらは未だにYUY2のみ。YV12非対応。
- ConvertToYUY2 と併用しながら使ってみると、変換速度が15~20%落ちる。
- 実写で「森林(僅かな輝度差・色差で繊細に表現された)を映したシーン」などにフィルタ掛けてみると、(1,2,2)など非常に小さな数値を指定しても細部の表現が全部潰れる。
変換速度が落ちないのならばこれもアリだけどイマイチですな。
あとがき
10年くらい前、私は「1枚のCD-Rに2時間番組を出来るだけキレイに収納しよう」なんて事をやっていて、そんな用途で当時のTemporalSoftenを利用すると残像が酷くて使い物にならなかったです。
しかしテレビ放送派がデジタル化し、HDDや光学メディアが大容量化した現在「出来るだけソース映像の雰囲気を残し、かつ高速に処理したい。でもチョットだけファイルを小さくしたいのでうっすらフィルタを適用したい」てな場合には、TemporalSoftenもなかなか有効ですね。