これは、かつて「AviSynthのぺーじ」として公開されていたものの "残骸" です。ここに記されている内容には、間違いが含まれている可能性があります。より正確で新しい情報を知りたい場合は、AviSynth 付属のドキュメントや AviSynth 公式サイトを参考にすることをおすすめします。私(にーやん)が管理人をつとめる AviSynth Wiki も利用してください。また、このページは、予告なしに削除される可能性もあります。

フィールド単位でフィルタをかける方法

 AviSynth内蔵のフィールド分離フィルタ(SeparateFields)やフィールド結合フィルタ(Weave)などを利用すれば、インターレースに対応していないフィルタをフィールド単位で使用することが可能になります。

 これには大きく分けて二種類の方法があります。

フィールド分離 -> フィルタ -> フィールド結合

 1つ目は、ビデオクリップをフィールド分離してフィルタをかけた後、フィールドを結合する方法です(フィールド分離 -> フィルタ -> フィールド結合)。

 これを図で表すと次のようになります。

インターレース・フィルタリング1

 図におけるビデオクリップはトップファーストであるものとします。数字は元のビデオクリップのフレーム番号を、Tはトップフィールド、Bはボトムフィールドであることを表しています。


(1)フィールド分離(SeparateFields

 フレームベースのビデオクリップをフィールドベースに分離するには、SeparateFieldsフィルタを使います。

 SeparateFieldsによってフィールド分離されたビデオクリップは、フレームレートが2倍になり、縦解像度が半分になります。

 トップファーストのビデオクリップでは、トップフィールド -> ボトムフィールド -> トップフィールド -> ボトムフィールド・・・の順に配置されます。

 例えば元のビデオクリップのフレーム番号が0,1,2・・・である場合、0T,0B,1T,1B,2T,2B・・・というように並べられます。


(2)使用したいフィルタ

 使用したいフィルタを記述します。


(3)フィールド結合(Weave

 Weaveフィルタは、2フィールド1組としてフィールドを結合し、インターレースのビデオクリップを生成します。

 SeparateFieldsとは反対の働きをするフィルタです。

 これらのフィルタを組み合わせることにより、フィールド単位でのフィルタリングが可能になります。

[使用例]
SeparateFields()
KenKunNR(256, 2, 20) #使用したいフィルタ
Weave()

フィールド分離 -> フィールド別にフィルタ -> インターリーブ -> フィールド結合

 フィールド単位でフィルタをかけるもう一つの方法は、ビデオクリップをフィールド分離し、それぞれのフィールド別にフィルタをかけて、フィールド結合する方法です(フィールド分離 -> フィールド別にフィルタ -> インターリーブ -> フィールド結合)。

 上で紹介した方法と似ているように思われるかもしれませんが、トップフィールドとボトムフィールド(偶数フィールドと奇数フィールド)を、それぞれ別々に処理するという点が大きく異なります。

 フィールドごとにフィルタをかけるため、同一のフィルタを2回呼び出すことになります。

 これを図で表すと、下の図のようになります。

インターレース・フィルタリング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で選択されるのもボトムフィールドになります(いずれもトップファーストの場合)。

 ただし、SelectEvenSelectOddを使用する際には、注意が必要になります。
SeparateFields()
SelectEven()
SelectOdd()
 たとえば、このように記述した場合、SelectOddで選択されるのはボトムフィールド(0B,1B,2B・・・)ではなく、SelectEvenをかけた後のビデオクリップの奇数フレーム(1T,3T,5T・・・)になってしまいます。

 これはSelectOddがフィールド分離後のビデオクリップではなく、直前のビデオクリップ、つまりSelectEvenしたビデオクリップに対して係っているからです。

 そこで、各フィールドを別々に扱うために、SelectEvenしたクリップとSelectOddしたクリップを、それぞれ変数に代入します。

 SelectEvenしたクリップをTop、SelectOddしたクリップをBottomという変数にあてはめるとすると、次のように記述することになります。
SeparateFields()
Top = SelectEven()
Bottom = SelectOdd()
 変数は一時的にビデオクリップを入れておく「容れ物」のようなものと考えてください。

 変数には任意の名前をつけることが可能です。名前に使用できる文字は、半角英数字(アンダースコア含む)です。ただし、数字から始まる名前は使えません。

 なお変数については「スクリプト入門」でも解説していますので、よろしければ参考にしてみてください。

 もし変数がよくわからないようであれば、あとで紹介する[使用例]の「使用したいフィルタ」の部分を書き換えるだけでも構わないでしょう。


(3)使用したいフィルタ

 使用したいフィルタをフィールドごとに記述します(下記[使用例]参照)。


(4)インターリーブ(Interleave

 Interleaveフィルタは、複数のビデオクリップから1フレームずつ交互にフレームを差し挟む形で1つのビデオクリップを生成します(Interleaveは「差し挟む」「交互に扱う」という意味の英語)。

 TopとBottomをInterleaveしたい場合は、次のように記述します。
Interleave(Top, Bottom)
 Topのフレーム番号を0T,1T,2T・・・、Bottomのフレーム番号を0B,1B,2B・・・とすると、この場合、0T,0B,1T,1B,2T,2B・・・というフレーム順で、1つのビデオクリップが作られます。


(5)フィールド結合(Weave

 Weaveフィルタでフィールドを結合します。

[使用例]
SeparateFields()
Top = SelectEven()
Bottom = SelectOdd()
Top = Top.KenKunNRT(256, 2, 8) #使用したいフィルタ
Bottom = Bottom.KenKunNRT(256, 2, 8) #使用したいフィルタ
Interleave(Top, Bottom)
Weave()
 なお、このままの方法では、Dustプラグイン収録のフィルタ(FaeryDustなど)のように1スクリプト内で1回しか呼び出せないフィルタを使用することはできません。

 Dust系のフィルタをフィールド別にかける方法については次のページで解説しますので、そちらを参考にしてください。

時間軸フィルタ使用時の注意

 フィールド単位でフィルタをかける方法を二種類紹介しましたが、時間軸を利用したフィルタを使用する場合、フィルタによる効果もそれぞれ異なります。

 下の画像は、KenKunNRTフィルタ(warpsharpプラグイン)をフレーム単位とフィールド単位で使用した際のサンプル画像です(KenKunNRTのパラメータは強さ256、範囲2、しきい値40)。

 フィールド単位(1)は「フィールド分離 -> フィルタ -> フィールド結合」の方法で、フィールド単位(2)は「フィールド分離 -> フィールド別にフィルタ -> インターリーブ -> フィールド結合」の方法で、それぞれフィルタをかけた時の画像になります。
オリジナル フレーム単位 フィールド単位(1) フィールド単位(2)
 見てもらってわかるように、フィールド単位(1)フィールド単位(2)では、明らかに結果が異なっています。

 フィールド単位(1)の場合、0T,0B,1T,1B,2T,2B・・・というフレーム順のビデオクリップにフィルタをかけるため、時間軸フィルタでは異なるフィールドの画像が参照されることになります。このため、サンプル画像は灰色のフィールドと白色のフィールドがブレンドされたようになっているのです。

 一方、フィールド単位(2)では、それぞれのフィールドが別々に処理されるため、異なるフィールドがブレンドされることはありません。

<< 前へ戻る | 次へ進む >>
最終更新日 2004年4月17日