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

クロップ&リサイズ時の注意

 インターレースを保持したまま、クロップやリサイズによって垂直方向の解像度を変更する場合には、いくつかの注意が必要になります。

 まず、フレーム単位のままクロップする場合、

奇数クロップ
 垂直方向に奇数単位でクロップすると、フィールドオーダーが入れ替わる原因となります。

 これは、フィールドがずれて、元々、ボトムフィールドであったラインがトップフィールドに、トップフィールドであったラインがボトムフィールドになることから起こります。

 偶数でクロップするとフィールドオーダーが変化する恐れはありません。

フレームリサイズ
 しかし、フレーム単位でリサイズすると、異なるフィールドがブレンドされてしまうことになります。

 いずれにせよ、インターレースを保持しながら縦解像度を変更するならば、フレーム単位のまま行うのは好ましくないということが言えるでしょう。

 では、すでに紹介しているフィールド単位でのフィルタリングを利用した場合は、どうでしょうか。

フィールド単位リサイズ
 フィールド単位でフィルタをかける方法を利用した場合、SeparateFieldsフィルタによって縦解像度が半分になった状態のビデオクリップに対してクロップやリサイズを行うことになります。

 このため、結果的にフィルタ適用後のビデオクリップのが粗く汚い画像になってしまう可能性が考えられます。

 そこでインターレースを保持したままフィルタをかけるもう一つの方法を紹介したいと思います。

 それは、Bobを利用したフィルタリングです。

※YV12の場合、縦2ラインごと(インターレースの場合、1フィールドおきの2ライン)で色差情報を共有しているため、元々、奇数単位でのクロップは出来ない仕様になっています。ただし、AviSynth内部のリサイズフィルタを利用してクロップすれば、奇数単位でのクロップも可能です。

プログレッシブ化(60p) -> フィルタ -> インターレース化(60i)

 Bobは、インターレースのビデオクリップをプログレッシブ化する方法(インターレース解除)の一つです。

 「オリジナルのフィールド画像」と「オリジナルから補間されたフィールド画像」から1枚のフレームを生成するため、縦解像度を落とすことなく、毎秒59.97フレームの画像を表示することができます(29.97fpsの場合)。

 ここで紹介するのは、このBobによってプログレッシブ化したビデオクリップにフィルタをかけて、またインターレースに戻すという方法です。

 いったんプログレッシブ化されるため、インターレースを気にすることなくフィルタをかけることができます。

 これを図にすると、次のようになります。

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

(1)Bobフィルタ

 Bobフィルタで60fps化します。

 Bobフィルタには、AviSynth内蔵のBobフィルタのほかに、DGBobiBobなどの外部プラグイン、bbbTomsBobなどのユーザー定義関数があります。


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

 Bobフィルタによってプログレッシブ化されたビデオクリップに対し、あなたが使用したいフィルタをかけます。

 ただし、このあとSeparateFieldsフィルタを使ってフィールド分離しますので、フィルタ適用後のビデオクリップの縦解像度は2の倍数になっている必要があります。


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

 SeparateFieldsでフィールドを分離します。


(4)フレーム選択(SelectEvery

 SelectEveryフィルタで周期的にフレームを選択します。

 SelectEveryフィルタの記述方法は、次の通りです。
SelectEvery(周期, 選択フレーム1[, 選択フレーム2・・・])
 ここでは、4フレーム周期に(0から数えて)1フレーム目と2フレーム目を選択するので、  
SelectEvery(4, 1, 2)
と、記述します。これはトップファーストの場合です。

 ボトムファーストの場合は「SelectEvery(4, 0, 3)」になります(※)。

 ただし、使用するBob(60fps化)フィルタによっては、選択すべきフレームが異なる可能性もあります。


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

 Weaveフィルタでフィールドを結合し、インターレースのビデオクリップを生成します。
[使用例]
Bob() #Bobフィルタ
LanczosResize(512, 384) #使用したいフィルタ
SeparateFields()
SelectEvery(4, 1, 2) #ボトムファーストの場合は「SelectEvery(4, 0, 3)」
Weave()
[注意]
 フィルタ適用後にフィールドオーダーが変化してしまう可能性があります(※)。
 フィールドオーダーを確認して、もし変化しているようであれば、再度、フィールドオーダーを指定し直すなどしてください。
[追記]
SeparateFieldsの前にAssumeBFF(またはAssumeFrameBased)でボトムファーストに設定しておくと、SelectEvery(4, 1, 2)でトップファーストを、SelectEvery(4, 0, 3)でボトムファーストを返すようになります。
#Bobフィルタ
#リサイズフィルタ
AssumeBFF()
SeparateFields()
SelectEvery(4, 1, 2) #ボトムファーストの場合は「SelectEvery(4, 0, 3)」
Weave()
[追記2]
次の方法でも、ソースクリップと同じフィールドオーダーのクリップを返します。
# ソースクリップ # Bobフィルタ
# リサイズフィルタ
AssumeTFF() #ボトムファーストならAssumeBFF()
SeparateFields()
SelectEvery(4, 0, 3)
Weave()
 なお、次のスクリプトでフィールドオーダーの確認を行うことができます。
SubTitle(String(GetParity()))
 画面左上にtrueと表示されればトップファースト、falseと表示されればボトムファーストになります。

※ビデオクリップの実際のフィールドオーダーではなく、AviSynthの設定上のフィールドオーダー(AviSynthがどう捉えているか)です。

サンプル画像

 フィールド単位でリサイズした場合と、Bobを利用(AviSynth内蔵Bobフィルタを使用)してリサイズした場合の比較サンプル画像です。

 画像は、すべて2倍に拡大してあります。

オリジナル
元画像

フィールド単位でリサイズ
フィールド別リサイズ

Bobを利用したリサイズ
Bobリサイズ

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