2016年3月18日金曜日

Clense

RemoveGrain、Repairと解説したのでついでにClenseも解説しときます。

思えばClenseは自分にとってRemoveGrainやRepair以上に謎の多いフィルタでした。
ドキュメントやコードは理解できないうえに、名前にしてもclense(清潔にする)って、あいまいすぎます。
avisynth.infoには

RemoveDirtと同じシンプルなテクニックを使った時間軸クリーナー。ただし、人工物(artifacts)の検出を行わない。Repair(もしくは他の人工物(artifacts)除去フィルタ)とセットで使用する。

とありますが、これでなにかが分かる人なんているとも思えません。

果たしてClenseの正体とはなんなのか?
その答えは3つのフレームによる時間軸メディアンフィルタでした。

Clense(clip c, clip "previous", clip "next", bool "gray")

Clenseは3つのクリップを引数にとります。
previousとnextのデフォルト値はcで、処理にあたってはcのn番フレーム、previousのn-1番フレーム、nextのn+1番フレームを一組とし、各フレームの同一座標上のサンプルのメディアンを返します。
grayのデフォルト値はfalseで、これをtrueにするとフィルタ後に出力されるフレームの色差は全く処理されてない状態(RemoveGrainにおけるmodeU=-1、modeV=-1と同じ)になります。

・使用例
Clenseは時間軸ノイズ除去フィルタです。例えば
src = something
src.ApplyRange(100, 100, "subtitle", "noise", 100, 100) #100フレーム目のみnoiseの文字を入れる 
next = last.DuplicateFrame(0)
prev = last.deleteframe(0)
StackHorizontal(prev, last, next)
こんな感じで、あるフレームだけポツンとノイズがでているソースにClense()をかけてやると
src = something
src.ApplyRange(100, 100, "subtitle", "noise", 100, 100)
Clense()
next = last.DuplicateFrame(0)
prev = last.deleteframe(0)
StackHorizontal(prev, last, next)
けっこういい感じでノイズが消えたりします。
そもそもノイズというものは、周囲に比べて極端に値が高いか低いかのどちらかなので、前後のフレームとのメディアンを求めれば消えてしまうのですね。
ただし、ちょっと動きが大きくなると
このように残像が出てしまうので使い勝手はあまりよいとはいえません。

目次:
RemoveGrain解説 導入
RemoveGrainの基本事項
RemoveGrain mode1~mode4
RemoveGrain mode5~mode12
RemoveGrain mode13~mode16
RemoveGrain mode17~mode22
RmoveGrain mode23/mode24 及び総評
Repair
Clense
Clense 応用

0 件のコメント:

コメントを投稿