myFunctions: iDust関数
# 説明
iFilterT関数のDust(DustV5プラグイン)特化型版です。Dustプラグインに収録されているフィルタ(FaeryDustなど)は、1スクリプトに1回しか呼び出せないという制限があります。そのため、iFilterT関数は、そのままでは使用することができません。iFilterT関数は、フィールドごとに1回ずつ、計2回フィルタをかけるからです。
iFilter関数の場合は、Dustフィルタを使用することができます。
# 使用上の注意
iDust関数ではDustプラグインを2つ使用します。DustV5.dllのコピーを、あなたのプラグインフォルダ以外の場所に用意するか、別の名前にリネームしてください。そして、myFunctions.avsの5行目のdustv5_2_dirを、コピー/リネームしたdllのパスに設定しなおしてください。
##### 初期設定 (最初に設定してください)#####
#//--- Bob(60fps化)フィルタの指定(iResize、BobDust使用時に必要) ---//
global bbb_filter = "AutoBob()" #kernelbob/dgbobは"kernelbob(order)"と指定可
#//--- DustV5.dllのコピー/リネームしたdllのパス(iDust使用時に必要) ---//
global dustv5_2_dir = "D:\AviSynth\DustV5_2.dll"
# ダウンロード
「インターレース素材系関数集」から、myFunctions.avsをダウンロードしてください。# 書式
iDust(clip clip, string "dust_filter", int "limit", string "output")
- 引数
- clip: ビデオクリップ。
- dust_filter: "FaeryDust"/"SpaceDust"/"PixieDust"/"GoldDust"のいずれか。
- limit: Dustのlimit。省略したときは、dust_filterのデフォルト値。
- output: Dustのlimit。省略したときは、clipの色空間。
# 使用例
Import("myFunctions.avs")
iFilter("FaeryDust", 2)
# その他の注意
- あらかじめフィールドオーダーを正しく指定しておくこと(AssumeTFF/AssumeBFFなどを使って)。
- DustはYV12に対応していません。この関数では、YV12のクリップを内部でYUY2に変換します。そして、フィルタ適用後にYV12に戻します。
- 追記: niiyan's blog :: iDust関数がHC Encoder v0.18で使えない件も参照。
iFilterとiFilterTの違い
iFilterTのTは、Temporal(時間軸)のTです。
以前、Doom9フォーラムで、2D(Spatial/空間軸)フィルタにはiFilterの手法を、時間軸フィルタにはiFilterT関数の手法を使うという話が出たことがあったので、こういう名前にしました。
しかし、iFilterが2Dフィルタ用、iFilterTが時間軸フィルタ用、というわけではありません。2Dフィルタに関しては、iFilter/iFilterT、いずれにおいても使用することが可能です。ただし、時間軸フィルタを使用したいときには、どちらの関数(手法)を使うべきか、注意を払う必要があります。
iFilter関数は、トップ/ボトム(偶数/奇数)の両フィールドを交互に並べたクリップを生成して、それに対してフィルタをかけます。このとき、たとえば前後合わせて3フレーム(フィールド)を参照するタイプの時間軸フィルタを使用すると・・・
一方、iFilterT関数では、フィールド別に処理を行うため・・・
たとえば、テレシネ(3:2プルダウン)されたソース(トップファースト)の場合で考えてみます。
このビデオに対して時間軸フィルタをかける(つまりiFilterの方法を使用する)と・・・
以前、Doom9フォーラムで、2D(Spatial/空間軸)フィルタにはiFilterの手法を、時間軸フィルタにはiFilterT関数の手法を使うという話が出たことがあったので、こういう名前にしました。
しかし、iFilterが2Dフィルタ用、iFilterTが時間軸フィルタ用、というわけではありません。2Dフィルタに関しては、iFilter/iFilterT、いずれにおいても使用することが可能です。ただし、時間軸フィルタを使用したいときには、どちらの関数(手法)を使うべきか、注意を払う必要があります。
iFilter関数は、トップ/ボトム(偶数/奇数)の両フィールドを交互に並べたクリップを生成して、それに対してフィルタをかけます。このとき、たとえば前後合わせて3フレーム(フィールド)を参照するタイプの時間軸フィルタを使用すると・・・
[トップ] [ボトム] [トップ](または、[ボトム] [トップ] [ボトム])このように、異なるフィールドの画像を参照します。これにより、異なるフィールドの成分がブレンドされる可能性があります。
一方、iFilterT関数では、フィールド別に処理を行うため・・・
[トップ] [トップ] [トップ](または、[ボトム] [ボトム] [ボトム])このように、同じフィールドの画像を参照します。異なるフィールドの成分がブレンドされることはありません。
たとえば、テレシネ(3:2プルダウン)されたソース(トップファースト)の場合で考えてみます。
[0] [1] [2] [3]・・・(数字はフレーム番号)これをテレシネされる前の画像とします。
[0T] [1T] [1T] [2T] [3T]・・・(トップフィールド)テレシネされた後は、こんな感じになります(例)。Tはオリジナル画像のトップが、Bはオリジナル画像のボトム、fはテレシネ後のフレームを表します。つまり、[0T]と[0B]が[0f](0フレーム)を構成しているということです。
[0B] [1B] [2B] [3B] [3B]・・・(ボトムフィールド)
------------------------
[0f] [1f] [2f] [3f] [4f]・・・(フレーム)
[0T] [0B] [1T] [1B] [1T] [2B] [2T] [3B] [3T] [3B]・・・AviSynthでフィールド分離(SeparateFields)すると、このような画像の並び順になります(数字は、オリジナルの画像の番号です)。
このビデオに対して時間軸フィルタをかける(つまりiFilterの方法を使用する)と・・・
[1T] [2B] [2T]このような並び順で、元々別の画像の、異なるフィールドを参照することになり、マズい結果になるかもしれません。
# お願い
専門的な知識があるわけではないので、かなりいい加減な説明かもしれません。そのまま鵜呑みにしないようにしてください。あくまでも参考程度に・・・。もし間違っていたら、さりげなく教えてもらえると助かります。myFunctions: iFilterT関数
# 説明
以下のスクリプトを関数化したものです。SeparateFields
even = SelectEven()
odd = SelectOdd
even = フィルタ(even)
odd = フィルタ(odd)
Interleave(even, odd)
Weave

画で表すと、こんな感じです。
- (1): フィールドベースのクリップを生成。
- (2): (1)のクリップをフィールド別に選択して、変数evenとoddに入れる。
- (3): even/odd、それぞれにフィルタをかける。
- (4): even -> odd -> even -> odd・・・の順に組み合わせたクリップを生成。
- (5): (4)のクリップを組み合わせてインターレースなクリップを作る。
# ダウンロード
「インターレース素材系関数集」から、myFunctions.avsをダウンロードしてください。# 書式
iFilterT(clip clip, string "filter")
- 引数
- clip: ビデオクリップ
- filter: フィルタ
# 使用例
iFilterT("KenKunNR(256, 2, 20)")
# 注意
- あらかじめフィールドオーダーを正しく指定しておくこと(AssumeTFF/AssumeBFFなどを使って)。
- 引数に引用符が含まれるときは、filterを三重の引用符で囲むこと。
# 例
iFilterT("""Convolution3D(preset="movieHQ")""")
- 「iFilterとiFilterTの違い」を参照。
myFunctionsをver.0.2に更新。
ユーザー定義関数スクリプト集のmyFunctionsを更新しました。主な変更点は、以下の通りです。
iFilterBのreturn文がreturn clipになっていたために、オリジナルのクリップそのままを返していました。何て初歩的なミス・・・ orz
公開する直前に少しいじったのが仇となりました。もし使ってくれた人がいたら、すいませんでした。
ダウンロード、および詳しい解説(?)は、こちらのエントリから。
- iFilterBのreturn文が間違っていたのを修正。
- iFilterBの引数resize_filterをfilterに変更。
- iF関数の追加。
iFilterBのreturn文がreturn clipになっていたために、オリジナルのクリップそのままを返していました。何て初歩的なミス・・・ orz
公開する直前に少しいじったのが仇となりました。もし使ってくれた人がいたら、すいませんでした。
ダウンロード、および詳しい解説(?)は、こちらのエントリから。
myFunctions: iFilter関数
# 説明
以下のスクリプトを関数化したものです。SeparateFields()
フィルタ
Weave()

画で表すと、こんな感じです。
(1)でフィールドベースのクリップを生成。トップファーストのクリップは、トップ→ボトム→トップ→・・・という並び順になります。フレームレートは2倍、縦解像度は半分になります。
(2)で、(1)のクリップにフィルタをかけます。
(3)で、(2)のクリップを2フィールド単位で組み合わせて、フレームベースのクリップを生成します。元のフレームレートと大きさのインターレースなクリップです。
# ダウンロード
「インターレース素材系関数集」から、myFunctions.avsをダウンロードしてください。# 書式
iFilter(clip clip, string "filter")
- 引数
- clip: ビデオクリップ
- filter: フィルタ
# 使用例
iFilter("KenKunNR(256, 2, 20)")
# 注意
- あらかじめフィールドオーダーを正しく指定しておくこと(AssumeTFF/AssumeBFFなどを使って)。
- 引数に引用符が含まれるときは、filterを三重の引用符で囲むこと。
# 例
iFilter("""Convolution3D(preset="movieHQ")""")
- 「iFilterとiFilterTの違い」を参照。



