DeinterlaceTech について

DXVA の DeinterlaceTech について少し考察してみました。

DirectX 9.0の短い 説明から 動作を想像して、AviUtlプラグインにしてみました。 あくまで想像の産物なので、実際とは異なる場合があります。

説明と実験

では早速、サンプルを挙げて比較してみたいと思います。

実験サンプル映像について

以降の実験では、 インタレ解除しないスレ の642さんに提供していただいたサンプル映像(DivX5,TFF) を利用させていただきました。この場を借りて感謝いたします。
(問題があれば対応いたしますのでご連絡ください)

オリジナル

オリジナルの画像(の一部)です。静止部分、動きのある部分などが比較できると思います
オリジナル

参考:理想的なプログレ化が出来た場合のサンプル

理想的には、こんな画像が得られるはずです。
理想的なプログレ化

フレーム間処理を伴わない補間

まずは、フレーム間処理を伴わないもの、つまり、 片方のフィールドのみ or 1フレームのみのデータを 利用する補間について比較してみます。

DeinterlaceTech_BOBLineReplicate

片方のフィールドのみを利用します。
足りない方のフィールドは、単純に、上か下の 隣接するピクセルをコピーして補間します。

この処理は、cos(θ), 0 ≤ θ ≤ π/2 な特性の垂直ローパスフィルタをかけることに相当しますが、 サンプル位置が0.5pixel上下にずれてしまうので、結果として 映像が上下にゆれてしまいます。
また、エイリアシング成分を減衰しきれないので、 ガタガタが目立ちます。

ライン2度描き

DeinterlaceTech_BOBVerticalStretch

片方のフィールドのみを利用します。
足りない方のフィールドは、上下のピクセルを 平均することで補間します。

この処理は、(1+cos(θ))/2, 0 ≤ θ ≤ π な特性のLPFに相当します。
単純な平均でなく、(-1,9,9,-1)/16という感じの4ラインを利用した フィルタを使えば、もう少しシャープな結果を得ることができます。

平均化した場合
BOB-平均

(-1,9,9,-1)/16 フィルタの場合
BOB-4tap

DeinterlaceTech_MedianFiltering

現在のフィールド+一つ前のフィールド、の2フィールドを利用します。

  1. 補間したい位置の一つ前のフィールドでの画素値
  2. 補間したい位置の上のピクセルの画素値
  3. 補間したい位置の下のピクセルの画素値

の3つの値を大きさ順に並べて、真ん中にくるピクセルを 補間値として採用します。

フィールド間で動き検出をやっているのに近いので、 動きの無い部分での画質が向上する気がします。一方、動いている部分では、 LineReplicateに近いことになるので、ガタガタします。

中間値

DeinterlaceTech_EdgeFiltering

(たぶん)片方のフィールドのみを利用します。

BOBVerticalStretchでは、斜めの線がガタガタしてしまいます。
これを避けるのは原理的には無理なのですが、周辺のエッジの分布情報 を利用することで、斜めの線を補間することができます。

具体的は、エッジに直交するのではなく、平行になるようなピクセル間 で補間を行います。細かい手法についてはいろいろありそうですが、 下の例では、適当に実装したものを利用しています。

方向性フィルタ

フレーム間処理を利用した補間

インターレースソースのプログレ化を行うためには、 複数のフレームからの動き情報が本質的に不可欠です。

動き情報を得るには、単純には、時間方向で差分をとればよいのですが、 これだけでは検出漏れ・誤爆を避けられません。 実用上は、動きベクトルを検出したり、コンテクストを利用したり、 といったプロセスが必要です。が、インターレースという手法そのものの 限界もあるので、難しいらしいです。
最終的には、オブジェクトを判別した上で、それぞれの動きベクトルを 検出できればよいのでしょうが・・・。

なお、動き検出は、フレーム間だけでなく、フィールド間(トップとボトム) でも一応可能なので、「フレーム間処理を利用した・・」といった分類は意味が 無かったりします。

DeinterlaceTech_FieldAdaptive

動きの量に応じて、「Weave」と「フレーム間処理を伴わない補間」 をフィールド単位で切り替える、らしいです。
静止画部分では weave 、動画部分では bob と切り替えるのでしょうが、 ハードウェアの制約の上で存在するモードなのでしょう。 (チップセットのデータシートを読んでると、intelの内蔵グラフィックス ではできそうな気がするが・・)

サンプルはありません

DeinterlaceTech_PixelAdaptive

動きの量に応じて、「Weave」と「フレーム間処理を伴わない補間」 をピクセル単位で切り替える、あるいは結果をブレンドします。
前に書いたように、動き検出自体には様々な方法がありますが、 どんな方法を使っているかは GPU によって異なると思います。

次のサンプルでは、前のフレームとの差分をとった上で、 対象ピクセルの周辺の動きも加えて、動きの量を検出しています。

動きのある部分には、EdgeFiltering の結果を利用しています。
PixelAdaptive+EdgeFiltering

DeinterlaceTech_MotionVectorSteered

よく分かりません。
動きベクトルを検出した上で、時間的に内挿して補間するということでしょうか?
高度なフレームレート変換と機能的に被るような感じなので、次次世代ぐらいの GPUには乗ってくるかもしれないです。

サンプルはありません

AviUtlプラグイン

これらの実験のために作成したAviUtlプラグインを置いておきます。

deint_test_050627(05/6/27) v1.1


前のページに戻る