DXVA の DeinterlaceTech について少し考察してみました。
DirectX 9.0の短い 説明から 動作を想像して、AviUtlプラグインにしてみました。 あくまで想像の産物なので、実際とは異なる場合があります。
では早速、サンプルを挙げて比較してみたいと思います。
以降の実験では、
インタレ解除しないスレ
の642さんに提供していただいたサンプル映像(DivX5,TFF)
を利用させていただきました。この場を借りて感謝いたします。
(問題があれば対応いたしますのでご連絡ください)
オリジナルの画像(の一部)です。静止部分、動きのある部分などが比較できると思います
理想的には、こんな画像が得られるはずです。
まずは、フレーム間処理を伴わないもの、つまり、 片方のフィールドのみ or 1フレームのみのデータを 利用する補間について比較してみます。
片方のフィールドのみを利用します。
足りない方のフィールドは、単純に、上か下の
隣接するピクセルをコピーして補間します。
この処理は、cos(θ), 0 ≤ θ ≤ π/2
な特性の垂直ローパスフィルタをかけることに相当しますが、
サンプル位置が0.5pixel上下にずれてしまうので、結果として
映像が上下にゆれてしまいます。
また、エイリアシング成分を減衰しきれないので、
ガタガタが目立ちます。
片方のフィールドのみを利用します。
足りない方のフィールドは、上下のピクセルを
平均することで補間します。
この処理は、(1+cos(θ))/2, 0 ≤ θ ≤ π
な特性のLPFに相当します。
単純な平均でなく、(-1,9,9,-1)/16という感じの4ラインを利用した
フィルタを使えば、もう少しシャープな結果を得ることができます。
平均化した場合
(-1,9,9,-1)/16 フィルタの場合
現在のフィールド+一つ前のフィールド、の2フィールドを利用します。
の3つの値を大きさ順に並べて、真ん中にくるピクセルを 補間値として採用します。
フィールド間で動き検出をやっているのに近いので、 動きの無い部分での画質が向上する気がします。一方、動いている部分では、 LineReplicateに近いことになるので、ガタガタします。
(たぶん)片方のフィールドのみを利用します。
BOBVerticalStretchでは、斜めの線がガタガタしてしまいます。
これを避けるのは原理的には無理なのですが、周辺のエッジの分布情報
を利用することで、斜めの線を補間することができます。
具体的は、エッジに直交するのではなく、平行になるようなピクセル間 で補間を行います。細かい手法についてはいろいろありそうですが、 下の例では、適当に実装したものを利用しています。
インターレースソースのプログレ化を行うためには、 複数のフレームからの動き情報が本質的に不可欠です。
動き情報を得るには、単純には、時間方向で差分をとればよいのですが、
これだけでは検出漏れ・誤爆を避けられません。
実用上は、動きベクトルを検出したり、コンテクストを利用したり、
といったプロセスが必要です。が、インターレースという手法そのものの
限界もあるので、難しいらしいです。
最終的には、オブジェクトを判別した上で、それぞれの動きベクトルを
検出できればよいのでしょうが・・・。
なお、動き検出は、フレーム間だけでなく、フィールド間(トップとボトム) でも一応可能なので、「フレーム間処理を利用した・・」といった分類は意味が 無かったりします。
動きの量に応じて、「Weave」と「フレーム間処理を伴わない補間」
をフィールド単位で切り替える、らしいです。
静止画部分では weave 、動画部分では bob と切り替えるのでしょうが、
ハードウェアの制約の上で存在するモードなのでしょう。
(チップセットのデータシートを読んでると、intelの内蔵グラフィックス
ではできそうな気がするが・・)
サンプルはありません
動きの量に応じて、「Weave」と「フレーム間処理を伴わない補間」
をピクセル単位で切り替える、あるいは結果をブレンドします。
前に書いたように、動き検出自体には様々な方法がありますが、
どんな方法を使っているかは GPU によって異なると思います。
次のサンプルでは、前のフレームとの差分をとった上で、 対象ピクセルの周辺の動きも加えて、動きの量を検出しています。
動きのある部分には、EdgeFiltering の結果を利用しています。
よく分かりません。
動きベクトルを検出した上で、時間的に内挿して補間するということでしょうか?
高度なフレームレート変換と機能的に被るような感じなので、次次世代ぐらいの
GPUには乗ってくるかもしれないです。
サンプルはありません
これらの実験のために作成したAviUtlプラグインを置いておきます。
deint_test_050627(05/6/27) v1.1