インターレース解除:60i→30p/60p(TDeint+TMM2+nnedi3)

最後にTDeint+TMM2+nnedi3を使ったパターンを確認します。60iテロップを60pにするときに使っている人が多いのかな?

以前は「TMM」を使うのが一般的だったのですが、Chikuzenさんが書き直した「TMM2」を公開してくれているので、ありがたくそちらを使わせていただきましょう

更新履歴

2016/8/10 公開

2017/1/30 TDeintの64bit版の公開場所を1つ追加

2020/9/06 各種DL先変更

TDeint+TMM2+nnedi3

導入

TDeint

https://github.com/pinterf/TIVTC/releases

32bit版はPlugins+フォルダに、64bit版はPlugins64+フォルダに入れればいいでしょう

TMM2

https://github.com/Asd-g/TMM2/releases

TMM2.dllをAviSynthのplugins+フォルダに、x64フォルダの中にあるTMM2.dllはplugins64+にそれぞれ入れてください

nnedi3

必須のプラグインではありませんが、セットで使われることが多いです

https://github.com/jpsdr/NNEDI3/releases

解凍すると最適なCPU、OS別に分かれています。W7は7(Vista?)以降、XPとついてるものはXP向けです。AVX2となっているものはAVX2に対応しているCPU向け(Haswell以降のCPU)、AVXとなっているものはSandy Bridge以降用だと思います

x64フォルダの中のものはplugins64+フォルダに、x86フォルダの中のものはplugins+フォルダに入れてください

基本的な使い方

TFFの60iを60pに変換

TFFの60iを60pに、nnedi3、TMM2を使わずに変換

TMM2は割と重いので、なくてもかまわない場合は抜いてしまってもいいかもしれません

TFFの30p/60i混合のものを30pの部分は何もせず、60iの部分だけ30pに変換

プログレッシブのフレームには手を付けないようにすることで、画質の劣化を防ぎます

TFFの60iをできるだけフィールドマッチングを使って30pに変換

2-3プルダウンの元々24pのソースを、とりあえず30pにするときなど。あとで重複フレームを削除して24pにする前準備

TFFの30p/60i混合のものを、30pの部分の画質はできるだけ下げないように60pに変換?

オプション

とりあえずTDeintについて。TMM2の方は説明できるほど理解できていません。TDeintも私自身はほぼ全く使わないのでよくわかっていませんが…

TDeint

オプションが多く、わからないものが多いです…。なんとなくわかるところだけ、大雑把にコメントしていきます

mode (int / default:0 [-2,-1,0,1,2])

0はフレームレート変更なし、1でフレームレートが倍になります

TDeintのmodeが0(60i→30p)のときは、TMM2のmodeも0、nnedi3のfieldは-1, 0, 1のどれかにします

TDeintのmodeが1(60i→60p)のときは、TMM2のmodeも1、nnedi3のfieldは-2, 2, 3のどれかにします

mode -2,-1は高さが倍になります。何目的かよくわかりません。

mode 2はAviUtlでいう二重化に相当するものだと思います

order (int / default:-1 [-1,0,1])

フィールドの順序の設定。TFFなら1、BFFなら0。-1でAviSynthに設定されている通りになります。例えば、AssumeTFF()の後なら1と同じ動作、AssumeBFF()の後なら0と同じ動作をするようになります

field (int / default:-1 [-1,0,1])

保持するフィールドの指定。modeで1を選んだ場合はこのパラメータに意味はなくなります。1でトップフィールド保持、0でボトムフィールド保持、-1でorderの値と同じになります

edeint (clip / default:none)

空間予測を取る…らしいが何が言いたいのかニワカな私にはわかりません。簡単に言うと、設定すると微妙に映像が変化します。指定する場合はnnedi3かeedi3を適応したクリップを指定するのが一般的なようです

edeintに指定するクリップは同じ高さ、幅、色空間でなければなりません。また、mode=1の場合はフレームレートが倍になっていないといけません。上記の例を参考に指定してください

full (bool / default:true)

mode=0のときのみ影響があります。falseにすると、処理の前にコーミングチェックをし、コーミング判定されたフレームにのみインターレース解除の処理が走るようになります。30p/60i混合ソースを30pにしたいときは、falseにすることで30pの部分に対して処理をしなくなるため、画質、処理速度の向上が見込めます。60iしかないとわかっているソースに対しては、コーミング判定の分逆に処理速度が遅くなるため、trueで良いでしょう

tryweave (bool / default:false)

trueにすると、処理の前に前後のフィールドを比較して類似性の高いフィールドを選択し、1つのフレームにします(Weave)。その後、コーミングチェックをしてプログレッシブと判定されたら、そのままそのフレームを使います。コーミング判定された場合はインターレース解除の処理を行います

前後のフィールドの比較の処理の分、fullオプションをfalseにするよりも動作が重くなります。また、プログレッシブになるようにフィールド選択をするわけではなく、あくまで似たフィールドを選択するようなので、30pのソースに対してやってしまうと、コーミングフレームを作ってしまってインターレース解除の処理を無駄に行ってしまう場合もあります。なので、30p/60i混合のソースを30pにしたいときはtryweaveは使わずに、fullオプションをfalseにする方が良いでしょう

30p/60i混合のソースを60pにしたいときはtryweaveを使うと、30pの部分が重複フレームとなって、画質を劣化させずにすむことがあるようです

cthresh (int / default:6)

fullをfalse、またはtryweaveをtrueにしたときに使われるパラメータで、コーミング判定の閾値。あげるとコーミングと判定されにくくなります。コーミングフレームが少ないとわかってるソースなら10~12くらいまであげてもいいよってドキュメントに書いてあります

blockx / blocky (int / default:16)

fullをfalse、またはtryweaveをtrueにしたときに使われるパラメータです。コーミングフレーム検出に使うウインドウの横と縦の長さです

MI (int / default:64)

fullをfalse、またはtryweaveをtrueにしたときに使われるパラメータで、blockx * blockyの中に存在するコーミングピクセルの数がMIの量を超えたらコーミングフレームとするんだと思います。多分。なので、多分上限はblockx * blockyです

cthreshが低いとコーミングピクセルと判定されやすくなるのでコーミングフレームと判定されやすくなる

blockx / blockyが大きいと範囲内のコーミングピクセルが増えるのでコーミングフレームと判定されやすくなる

MIが低いとコーミングピクセルが少なくてもコーミングフレームと判定されやすくなる

と、まあこんな感じなはずです。例えばアニメみたいな口だけ動いて口にだけ少しコーミングが出るようなソースだと、コーミングピクセルが少なくてコーミングフレームと判定してもらえない、なんてことも起こるでしょうから、ソースによってはこれらの値を調節しないといけないかもしれませんね

fullとtryweaveオプションの動作確認

色々実験してみて、その結果から書いていますがあまり自信がないです。間違ってたらごめんなさい

30p/60i混合  → 30pの例

この図のような a, b, c の3フレームはプログレッシブ / d, e の2フレームは60i の30p/60i混合の5フレームを例に考えてみます。tはトップフィールド、bはボトムフィールドを表しています

1659_2

mode=0でトップフィールドを保持(field=1)したときのイメージ。bもtも付いていないところは、TDeintによって作られた部分です。TMM2やnnedi3を使うと、その部分がより高品質になるイメージですね

縞々なフレームはなくなるけれど、a~c (1~3) の元々のボトムフィールドがなくなって画質劣化、5, 7 が消えて滑らかさが失われます

1659_3

mode=0でfull=falseにしたときのイメージ。a~c (1~3)は何も処理されないので画質の劣化がありません。5, 7 が消えて滑らかさが失われます。mode=0のみのときよりは良い結果です

mode=0でtryweave=trueにしたときのあまりよくない結果のイメージ。基本的には動作が少々重くなるもののfull=falseと同じ結果を返しますが、たまに違った結果になることがあります。2tのフィールドに対して1bと2b、どちらのフィールドがより似てるかを判定したときに、1bが似てると判定されてしまったときのイメージです。2番目のフレームの画質がfull=falseのときより劣化してしまいました

2-3プルダウン → 30pの例

1659_5

24pの映像が60iに格納されている例で考えてみます。a, b, c の3フレームはプログレッシブ / d, e の2フレームは60iで、4フレーム目の情報がd, eに分かれて格納されています

mode=0でトップフィールドを保持(field=1)したときのイメージ。縞々なフレームはなくなるけれど、どのフレームもボトムフィールドの情報が変化する分、画質的にはあまりよろしくありません

mode=0でfull=falseにしたときのイメージ。a~c (1~3)は何も処理されないので画質の劣化がありません。dとeはmode=0のときと同じになります

mode=0でtryweave=trueにしたときのイメージ。eの4tのフィールドは、dの4b、eの5bのフィールドと比較され、似ているフィールドを選択して1つのフレームとします。4bの方が選択されれば、理想の画質の4番目のフレームが作成できます。このケースではfull=falseより良い結果が期待できます

黄緑のフレームが重複しているので、どちらか間引くと24pになりますね

30p/60i混合 → 60pの例

1659_1

最初のこの例を、mode=1で60pにしてみます。mode=1の場合、fullオプションは機能しないので、tryweaveの確認をします

mode=1で60pにしたときのイメージ。30pにするときには消えてしまった5、7が残るので滑らかです。ただ、1~3に関しては画質が劣化してしまいます

mode=1, tryweave=trueで60pにしたときのイメージ。1~3のフレームの画質劣化を避けられるようです?

fullオプション利くようににして、プログレッシブなフレームはそのまま複製してくれればよさそうな気もするのですが、そういうことはできないようです

full=false, tryweave=trueにした場合の動作

fullオプションの次にtryweaveオプションが機能するようです

まずコーミングチェックをして、コーミングフレームと判定されなかった場合はそのフレームの処理は終了します。コーミングと判定された場合は、tryweaveの処理がされます

なので、さきほどの2-3プルダウン → 30pの例では、tryweave=true とだけするよりも、full=falseも併用すると、速度面でも画質面でもよりよい結果になるのではないでしょうか

fullとtryweaveのまとめ

  1. 30p/60i混合を30pにする場合はfull=falseが良さそう
  2. 30p/60i混合を60pにする場合はtryweave=trueを試す価値はあるかも
  3. 2-3プルダウンされたものをとりあえず30pにする場合はtryweave=true, full=falseが良さそう
  4. full=falseもtryweave=trueもコーミングフレームを残してしまう可能性が出る点は注意

Yadifmod2, TDeint, QTGMCの比較

ということで、3つのやり方をチェックしていきましたが、

  • とりあえず速いYadifmod2
  • 30p部分をそのまま残すこともできて品質・速度は中間なTDeint
  • 60i→60pの品質が非常に良いけれど重いQTGMC

大体こういう特徴になるのかなあ?