クロップ&リサイズ時の注意
インターレースを保持したまま、クロップやリサイズによって垂直方向の解像度を変更する場合には、いくつかの注意が必要になります。
まず、フレーム単位のままクロップする場合、
![奇数クロップ](./img/tips/interlace/crop_odd2.png)
垂直方向に奇数単位でクロップすると、フィールドオーダーが入れ替わる原因となります。
これは、フィールドがずれて、元々、ボトムフィールドであったラインがトップフィールドに、トップフィールドであったラインがボトムフィールドになることから起こります。
偶数でクロップするとフィールドオーダーが変化する恐れはありません。
![フレームリサイズ](./img/tips/interlace/frame_resize.png)
しかし、フレーム単位でリサイズすると、異なるフィールドがブレンドされてしまうことになります。
いずれにせよ、インターレースを保持しながら縦解像度を変更するならば、フレーム単位のまま行うのは好ましくないということが言えるでしょう。
では、すでに紹介しているフィールド単位でのフィルタリングを利用した場合は、どうでしょうか。
![フィールド単位リサイズ](./img/tips/interlace/field_resize.png)
フィールド単位でフィルタをかける方法を利用した場合、SeparateFieldsフィルタによって縦解像度が半分になった状態のビデオクリップに対してクロップやリサイズを行うことになります。
このため、結果的にフィルタ適用後のビデオクリップのが粗く汚い画像になってしまう可能性が考えられます。
そこでインターレースを保持したままフィルタをかけるもう一つの方法を紹介したいと思います。
それは、Bobを利用したフィルタリングです。
※YV12の場合、縦2ラインごと(インターレースの場合、1フィールドおきの2ライン)で色差情報を共有しているため、元々、奇数単位でのクロップは出来ない仕様になっています。ただし、AviSynth内部のリサイズフィルタを利用してクロップすれば、奇数単位でのクロップも可能です。
まず、フレーム単位のままクロップする場合、
![奇数クロップ](./img/tips/interlace/crop_odd2.png)
垂直方向に奇数単位でクロップすると、フィールドオーダーが入れ替わる原因となります。
これは、フィールドがずれて、元々、ボトムフィールドであったラインがトップフィールドに、トップフィールドであったラインがボトムフィールドになることから起こります。
偶数でクロップするとフィールドオーダーが変化する恐れはありません。
![フレームリサイズ](./img/tips/interlace/frame_resize.png)
しかし、フレーム単位でリサイズすると、異なるフィールドがブレンドされてしまうことになります。
いずれにせよ、インターレースを保持しながら縦解像度を変更するならば、フレーム単位のまま行うのは好ましくないということが言えるでしょう。
では、すでに紹介しているフィールド単位でのフィルタリングを利用した場合は、どうでしょうか。
![フィールド単位リサイズ](./img/tips/interlace/field_resize.png)
フィールド単位でフィルタをかける方法を利用した場合、SeparateFieldsフィルタによって縦解像度が半分になった状態のビデオクリップに対してクロップやリサイズを行うことになります。
このため、結果的にフィルタ適用後のビデオクリップのが粗く汚い画像になってしまう可能性が考えられます。
そこでインターレースを保持したままフィルタをかけるもう一つの方法を紹介したいと思います。
それは、Bobを利用したフィルタリングです。
※YV12の場合、縦2ラインごと(インターレースの場合、1フィールドおきの2ライン)で色差情報を共有しているため、元々、奇数単位でのクロップは出来ない仕様になっています。ただし、AviSynth内部のリサイズフィルタを利用してクロップすれば、奇数単位でのクロップも可能です。
プログレッシブ化(60p) -> フィルタ -> インターレース化(60i)
Bobは、インターレースのビデオクリップをプログレッシブ化する方法(インターレース解除)の一つです。
「オリジナルのフィールド画像」と「オリジナルから補間されたフィールド画像」から1枚のフレームを生成するため、縦解像度を落とすことなく、毎秒59.97フレームの画像を表示することができます(29.97fpsの場合)。
ここで紹介するのは、このBobによってプログレッシブ化したビデオクリップにフィルタをかけて、またインターレースに戻すという方法です。
いったんプログレッシブ化されるため、インターレースを気にすることなくフィルタをかけることができます。
これを図にすると、次のようになります。
(1)Bobフィルタ
Bobフィルタで60fps化します。
Bobフィルタには、AviSynth内蔵のBobフィルタのほかに、DGBobやiBobなどの外部プラグイン、bbbやTomsBobなどのユーザー定義関数があります。
(2)使用したいフィルタ
Bobフィルタによってプログレッシブ化されたビデオクリップに対し、あなたが使用したいフィルタをかけます。
ただし、このあとSeparateFieldsフィルタを使ってフィールド分離しますので、フィルタ適用後のビデオクリップの縦解像度は2の倍数になっている必要があります。
(3)フィールド分離(SeparateFields)
SeparateFieldsでフィールドを分離します。
(4)フレーム選択(SelectEvery)
SelectEveryフィルタで周期的にフレームを選択します。
SelectEveryフィルタの記述方法は、次の通りです。
「オリジナルのフィールド画像」と「オリジナルから補間されたフィールド画像」から1枚のフレームを生成するため、縦解像度を落とすことなく、毎秒59.97フレームの画像を表示することができます(29.97fpsの場合)。
ここで紹介するのは、このBobによってプログレッシブ化したビデオクリップにフィルタをかけて、またインターレースに戻すという方法です。
いったんプログレッシブ化されるため、インターレースを気にすることなくフィルタをかけることができます。
これを図にすると、次のようになります。
![インターレース・フィルタリング3](./img/tips/interlace/fpresize.png)
(1)Bobフィルタ
Bobフィルタで60fps化します。
Bobフィルタには、AviSynth内蔵のBobフィルタのほかに、DGBobやiBobなどの外部プラグイン、bbbやTomsBobなどのユーザー定義関数があります。
(2)使用したいフィルタ
Bobフィルタによってプログレッシブ化されたビデオクリップに対し、あなたが使用したいフィルタをかけます。
ただし、このあとSeparateFieldsフィルタを使ってフィールド分離しますので、フィルタ適用後のビデオクリップの縦解像度は2の倍数になっている必要があります。
(3)フィールド分離(SeparateFields)
SeparateFieldsでフィールドを分離します。
(4)フレーム選択(SelectEvery)
SelectEveryフィルタで周期的にフレームを選択します。
SelectEveryフィルタの記述方法は、次の通りです。
SelectEvery(周期, 選択フレーム1[, 選択フレーム2・・・]) |
ここでは、4フレーム周期に(0から数えて)1フレーム目と2フレーム目を選択するので、
|
と、記述します。これはトップファーストの場合です。
ボトムファーストの場合は「SelectEvery(4, 0, 3)」になります(※)。
ただし、使用するBob(60fps化)フィルタによっては、選択すべきフレームが異なる可能性もあります。
(5)フィールド結合(Weave)
Weaveフィルタでフィールドを結合し、インターレースのビデオクリップを生成します。
ボトムファーストの場合は「SelectEvery(4, 0, 3)」になります(※)。
ただし、使用するBob(60fps化)フィルタによっては、選択すべきフレームが異なる可能性もあります。
(5)フィールド結合(Weave)
Weaveフィルタでフィールドを結合し、インターレースのビデオクリップを生成します。
[使用例]
|
[注意]
フィルタ適用後にフィールドオーダーが変化してしまう可能性があります(※)。
フィールドオーダーを確認して、もし変化しているようであれば、再度、フィールドオーダーを指定し直すなどしてください。
フィルタ適用後にフィールドオーダーが変化してしまう可能性があります(※)。
フィールドオーダーを確認して、もし変化しているようであれば、再度、フィールドオーダーを指定し直すなどしてください。
SeparateFieldsの前にAssumeBFF(またはAssumeFrameBased)でボトムファーストに設定しておくと、SelectEvery(4, 1, 2)でトップファーストを、SelectEvery(4, 0, 3)でボトムファーストを返すようになります。
|
次の方法でも、ソースクリップと同じフィールドオーダーのクリップを返します。
- SeparateFieldsの前に、ソースクリップのフィールドオーダーがトップファーストならAssumeTFF、ボトムファーストならAssumeBFFを追加。
- SeparateFieldsの後をSelectEvery(4, 0, 3)にする。
|
なお、次のスクリプトでフィールドオーダーの確認を行うことができます。
|
画面左上にtrueと表示されればトップファースト、falseと表示されればボトムファーストになります。
※ビデオクリップの実際のフィールドオーダーではなく、AviSynthの設定上のフィールドオーダー(AviSynthがどう捉えているか)です。
※ビデオクリップの実際のフィールドオーダーではなく、AviSynthの設定上のフィールドオーダー(AviSynthがどう捉えているか)です。
サンプル画像
フィールド単位でリサイズした場合と、Bobを利用(AviSynth内蔵Bobフィルタを使用)してリサイズした場合の比較サンプル画像です。
画像は、すべて2倍に拡大してあります。
オリジナル
![元画像](./img/tips/interlace/sub_sepa.png)
フィールド単位でリサイズ
![フィールド別リサイズ](./img/tips/interlace/sub_fpfilter.png)
Bobを利用したリサイズ
![Bobリサイズ](./img/tips/interlace/sub_fpresize.png)
画像は、すべて2倍に拡大してあります。
オリジナル
![元画像](./img/tips/interlace/sub_sepa.png)
フィールド単位でリサイズ
![フィールド別リサイズ](./img/tips/interlace/sub_fpfilter.png)
Bobを利用したリサイズ
![Bobリサイズ](./img/tips/interlace/sub_fpresize.png)
最終更新日 2004年10月19日