フィールド単位でフィルタをかける方法
AviSynth内蔵のフィールド分離フィルタ(SeparateFields)やフィールド結合フィルタ(Weave)などを利用すれば、インターレースに対応していないフィルタをフィールド単位で使用することが可能になります。
これには大きく分けて二種類の方法があります。
これには大きく分けて二種類の方法があります。
フィールド分離 -> フィルタ -> フィールド結合
1つ目は、ビデオクリップをフィールド分離してフィルタをかけた後、フィールドを結合する方法です(フィールド分離 -> フィルタ -> フィールド結合)。
これを図で表すと次のようになります。
図におけるビデオクリップはトップファーストであるものとします。数字は元のビデオクリップのフレーム番号を、Tはトップフィールド、Bはボトムフィールドであることを表しています。
(1)フィールド分離(SeparateFields)
フレームベースのビデオクリップをフィールドベースに分離するには、SeparateFieldsフィルタを使います。
SeparateFieldsによってフィールド分離されたビデオクリップは、フレームレートが2倍になり、縦解像度が半分になります。
トップファーストのビデオクリップでは、トップフィールド -> ボトムフィールド -> トップフィールド -> ボトムフィールド・・・の順に配置されます。
例えば元のビデオクリップのフレーム番号が0,1,2・・・である場合、0T,0B,1T,1B,2T,2B・・・というように並べられます。
(2)使用したいフィルタ
使用したいフィルタを記述します。
(3)フィールド結合(Weave)
Weaveフィルタは、2フィールド1組としてフィールドを結合し、インターレースのビデオクリップを生成します。
SeparateFieldsとは反対の働きをするフィルタです。
これらのフィルタを組み合わせることにより、フィールド単位でのフィルタリングが可能になります。
これを図で表すと次のようになります。
図におけるビデオクリップはトップファーストであるものとします。数字は元のビデオクリップのフレーム番号を、Tはトップフィールド、Bはボトムフィールドであることを表しています。
(1)フィールド分離(SeparateFields)
フレームベースのビデオクリップをフィールドベースに分離するには、SeparateFieldsフィルタを使います。
SeparateFieldsによってフィールド分離されたビデオクリップは、フレームレートが2倍になり、縦解像度が半分になります。
トップファーストのビデオクリップでは、トップフィールド -> ボトムフィールド -> トップフィールド -> ボトムフィールド・・・の順に配置されます。
例えば元のビデオクリップのフレーム番号が0,1,2・・・である場合、0T,0B,1T,1B,2T,2B・・・というように並べられます。
(2)使用したいフィルタ
使用したいフィルタを記述します。
(3)フィールド結合(Weave)
Weaveフィルタは、2フィールド1組としてフィールドを結合し、インターレースのビデオクリップを生成します。
SeparateFieldsとは反対の働きをするフィルタです。
これらのフィルタを組み合わせることにより、フィールド単位でのフィルタリングが可能になります。
[使用例]
|
フィールド分離 -> フィールド別にフィルタ -> インターリーブ -> フィールド結合
フィールド単位でフィルタをかけるもう一つの方法は、ビデオクリップをフィールド分離し、それぞれのフィールド別にフィルタをかけて、フィールド結合する方法です(フィールド分離 -> フィールド別にフィルタ -> インターリーブ -> フィールド結合)。
上で紹介した方法と似ているように思われるかもしれませんが、トップフィールドとボトムフィールド(偶数フィールドと奇数フィールド)を、それぞれ別々に処理するという点が大きく異なります。
フィールドごとにフィルタをかけるため、同一のフィルタを2回呼び出すことになります。
これを図で表すと、下の図のようになります。
(1)フィールド分離(SeparateFields)
SeparateFieldsでフィールドを分離します。
(2)フィールド選択(SelectEven/SelectOdd)
SelectEvenは偶数(Even)番号のフレームを、SelectOddは奇数(Odd)番号のフレームを選択するフィルタです。
SeparateFieldsフィルタによってフィールド分離されたビデオクリップの偶数番号のフレーム(0,2,4・・・)は、元のビデオクリップのトップフィールド(OT,1T,2T・・・)にあたります。
このため、SelectEvenによって、トップフィールドのみを選択することが可能になります。
同様に、奇数番号のフレーム(1,3,5・・・)は、元のビデオクリップのボトムフィールド(0B,1B,2B・・・)になり、SelectOddで選択されるのもボトムフィールドになります(いずれもトップファーストの場合)。
ただし、SelectEvenとSelectOddを使用する際には、注意が必要になります。
上で紹介した方法と似ているように思われるかもしれませんが、トップフィールドとボトムフィールド(偶数フィールドと奇数フィールド)を、それぞれ別々に処理するという点が大きく異なります。
フィールドごとにフィルタをかけるため、同一のフィルタを2回呼び出すことになります。
これを図で表すと、下の図のようになります。
(1)フィールド分離(SeparateFields)
SeparateFieldsでフィールドを分離します。
(2)フィールド選択(SelectEven/SelectOdd)
SelectEvenは偶数(Even)番号のフレームを、SelectOddは奇数(Odd)番号のフレームを選択するフィルタです。
SeparateFieldsフィルタによってフィールド分離されたビデオクリップの偶数番号のフレーム(0,2,4・・・)は、元のビデオクリップのトップフィールド(OT,1T,2T・・・)にあたります。
このため、SelectEvenによって、トップフィールドのみを選択することが可能になります。
同様に、奇数番号のフレーム(1,3,5・・・)は、元のビデオクリップのボトムフィールド(0B,1B,2B・・・)になり、SelectOddで選択されるのもボトムフィールドになります(いずれもトップファーストの場合)。
ただし、SelectEvenとSelectOddを使用する際には、注意が必要になります。
|
たとえば、このように記述した場合、SelectOddで選択されるのはボトムフィールド(0B,1B,2B・・・)ではなく、SelectEvenをかけた後のビデオクリップの奇数フレーム(1T,3T,5T・・・)になってしまいます。
これはSelectOddがフィールド分離後のビデオクリップではなく、直前のビデオクリップ、つまりSelectEvenしたビデオクリップに対して係っているからです。
そこで、各フィールドを別々に扱うために、SelectEvenしたクリップとSelectOddしたクリップを、それぞれ変数に代入します。
SelectEvenしたクリップをTop、SelectOddしたクリップをBottomという変数にあてはめるとすると、次のように記述することになります。
これはSelectOddがフィールド分離後のビデオクリップではなく、直前のビデオクリップ、つまりSelectEvenしたビデオクリップに対して係っているからです。
そこで、各フィールドを別々に扱うために、SelectEvenしたクリップとSelectOddしたクリップを、それぞれ変数に代入します。
SelectEvenしたクリップをTop、SelectOddしたクリップをBottomという変数にあてはめるとすると、次のように記述することになります。
|
変数は一時的にビデオクリップを入れておく「容れ物」のようなものと考えてください。
変数には任意の名前をつけることが可能です。名前に使用できる文字は、半角英数字(アンダースコア含む)です。ただし、数字から始まる名前は使えません。
なお変数については「スクリプト入門」でも解説していますので、よろしければ参考にしてみてください。
もし変数がよくわからないようであれば、あとで紹介する[使用例]の「使用したいフィルタ」の部分を書き換えるだけでも構わないでしょう。
(3)使用したいフィルタ
使用したいフィルタをフィールドごとに記述します(下記[使用例]参照)。
(4)インターリーブ(Interleave)
Interleaveフィルタは、複数のビデオクリップから1フレームずつ交互にフレームを差し挟む形で1つのビデオクリップを生成します(Interleaveは「差し挟む」「交互に扱う」という意味の英語)。
TopとBottomをInterleaveしたい場合は、次のように記述します。
変数には任意の名前をつけることが可能です。名前に使用できる文字は、半角英数字(アンダースコア含む)です。ただし、数字から始まる名前は使えません。
なお変数については「スクリプト入門」でも解説していますので、よろしければ参考にしてみてください。
もし変数がよくわからないようであれば、あとで紹介する[使用例]の「使用したいフィルタ」の部分を書き換えるだけでも構わないでしょう。
(3)使用したいフィルタ
使用したいフィルタをフィールドごとに記述します(下記[使用例]参照)。
(4)インターリーブ(Interleave)
Interleaveフィルタは、複数のビデオクリップから1フレームずつ交互にフレームを差し挟む形で1つのビデオクリップを生成します(Interleaveは「差し挟む」「交互に扱う」という意味の英語)。
TopとBottomをInterleaveしたい場合は、次のように記述します。
|
Topのフレーム番号を0T,1T,2T・・・、Bottomのフレーム番号を0B,1B,2B・・・とすると、この場合、0T,0B,1T,1B,2T,2B・・・というフレーム順で、1つのビデオクリップが作られます。
(5)フィールド結合(Weave)
Weaveフィルタでフィールドを結合します。
(5)フィールド結合(Weave)
Weaveフィルタでフィールドを結合します。
[使用例]
|
なお、このままの方法では、Dustプラグイン収録のフィルタ(FaeryDustなど)のように1スクリプト内で1回しか呼び出せないフィルタを使用することはできません。
Dust系のフィルタをフィールド別にかける方法については次のページで解説しますので、そちらを参考にしてください。
Dust系のフィルタをフィールド別にかける方法については次のページで解説しますので、そちらを参考にしてください。
時間軸フィルタ使用時の注意
フィールド単位でフィルタをかける方法を二種類紹介しましたが、時間軸を利用したフィルタを使用する場合、フィルタによる効果もそれぞれ異なります。
下の画像は、KenKunNRTフィルタ(warpsharpプラグイン)をフレーム単位とフィールド単位で使用した際のサンプル画像です(KenKunNRTのパラメータは強さ256、範囲2、しきい値40)。
フィールド単位(1)は「フィールド分離 -> フィルタ -> フィールド結合」の方法で、フィールド単位(2)は「フィールド分離 -> フィールド別にフィルタ -> インターリーブ -> フィールド結合」の方法で、それぞれフィルタをかけた時の画像になります。
下の画像は、KenKunNRTフィルタ(warpsharpプラグイン)をフレーム単位とフィールド単位で使用した際のサンプル画像です(KenKunNRTのパラメータは強さ256、範囲2、しきい値40)。
フィールド単位(1)は「フィールド分離 -> フィルタ -> フィールド結合」の方法で、フィールド単位(2)は「フィールド分離 -> フィールド別にフィルタ -> インターリーブ -> フィールド結合」の方法で、それぞれフィルタをかけた時の画像になります。
|
見てもらってわかるように、フィールド単位(1)とフィールド単位(2)では、明らかに結果が異なっています。
フィールド単位(1)の場合、0T,0B,1T,1B,2T,2B・・・というフレーム順のビデオクリップにフィルタをかけるため、時間軸フィルタでは異なるフィールドの画像が参照されることになります。このため、サンプル画像は灰色のフィールドと白色のフィールドがブレンドされたようになっているのです。
一方、フィールド単位(2)では、それぞれのフィールドが別々に処理されるため、異なるフィールドがブレンドされることはありません。
フィールド単位(1)の場合、0T,0B,1T,1B,2T,2B・・・というフレーム順のビデオクリップにフィルタをかけるため、時間軸フィルタでは異なるフィールドの画像が参照されることになります。このため、サンプル画像は灰色のフィールドと白色のフィールドがブレンドされたようになっているのです。
一方、フィールド単位(2)では、それぞれのフィールドが別々に処理されるため、異なるフィールドがブレンドされることはありません。
最終更新日 2004年4月17日