Pulldown vs SelectEvery(10,…)

2-3 or 3-2 プルダウンのときに手動逆テレシネをする場合、DoubleWeaveした後にPulldownかSelectEveryを使って逆テレシネをすることができますが、どちらを使ったほうがいいのでしょうか

Pulldown(x,y)はSelectEvery(5,x,y)と(x,yが5未満なら等しいので、PulldownとSelectEvery(10,a,b,c,d)の比較をしてみましょう

 

更新履歴

2015/08/06 全体的に書き直し

 

DoubleWeaveの基礎確認

DoubleWeaveはトップフィールドとボトムフィールドに分離(SeparateFields)した後、あいたところに後ろのフィールドをコピーする、みたいなことをしています。文章だとわかりにくいので、トップフィールドファーストのPPIIPの場合の例を図にすると

593_11

こんな感じになります。エンコなうさんのところのGIFの方がわかりやすいかな

このとき、0, [2 or 3], 5, [7 or 8] を選択すれば良いので

  • Pulldown(0, 2) = SelectEvery(5, 0, 2) = SelectEvery(10, 0, 2, 5, 7)
  • Pulldown(0, 3) = SelectEvery(5, 0, 3) = SelectEvery(10, 0, 3, 5, 8)
  • SelectEvery(10, 0, 3, 5, 7)
  • SelectEvery(10, 0, 2, 5, 8)

この4つのうちのどれかをすることで24pにすることができます

 

またDoubleWeaveの特徴として、DoubleWeave後の0~9のうち、偶数の部分は元のa~eと全く同じになるので、仮にDoubleWeaveの後にSelectEvery(10, 0, 2, 4, 6, 8)とやったらDoubleWeave前に戻ります。逆に奇数の部分は2つのフレームからフィールドを取って作られたフレームということになります

このPPIIPの例では、茶色のフレームはcとdの2フレームからフィールドを取ってこないといけないため、奇数の5にしかありません。青色のフレームはaのフレームにしか存在しないため、偶数の0にしかありません。黄色はbのフレームをそのまま使ってもいいし、cのトップフィールドの部分を使ってもいいので、偶数の2、奇数の3の2つの選択肢があります(緑も同様)

 

画質チェック

24pにする方法が4パターンあることを確認しました。では次にこの4パターンを色々比較してみましょう

ノイズ比較

まずはノイズを比較してみましょう。画質の判定にはちょっとだけさんのDecombUCFを使いました。ノイズ量を見てノイズが多いフレームを探してくれます

ノイズが激しいと判定されるフレームの数を比較します。結果はこうなりました

(0, 2) (0, 3) (10, 0, 3, 5, 7) (10, 0, 2, 5, 8)
ノイズフレーム 214フレーム 210フレーム 341フレーム 83フレーム

だいぶ差が出ています。このときのノイズフレームを集合図で表すと

593_12

 

このようになっていました。記号で表すと

SelectEvery(10, 0, 2, 5, 8) は Pulldown(0, 2) ∩ Pulldown(0, 3)

SelectEvery(10, 0, 3, 5, 7) は Pulldown(0, 2) ∪ Pulldown(0, 3)

ということです。日本語で言うなら

Pulldown(0, 2)、Pulldown(0, 3)の両方で汚いと判定されたフレームのみSelectEvery(10, 0, 2, 5, 8)でも汚いと判定された

Pulldown(0, 2)、Pulldown(0, 3)の片方でも汚いと判定されたフレームがSelectEvery(10, 0, 3, 5, 7)でも汚いと判定された

ということになります。SelectEvery(10, 0, 2, 5, 8)が一番綺麗で、SelectEvery(10, 0, 3, 5, 7)が一番汚く、Pulldown()は中間といったところですね

 

593_13

Pulldown(0, 2)で汚いと判定されたけれど、SelectEvery(10, 0, 2, 5, 8)では汚いと判定されなかったフレームの例。Pulldown(0, 2) = SelectEvery(10, 0, 2, 5, 7) なので、7より8の方が綺麗だった例ということになります

 

差がでる原因

動きが激しいシーンではビットレートが必要になる分、画質が落ちますよね。それがPPIIPのIIの部分に重なると画質の劣化が激しくなるようです

593_14

 

例として黄色→茶色でシーンチェンジが起きたものを考えてみましょう。ただでさえ変化が大きいのでノイズがのりやすい上に、黄色と茶色という差が大きい2種類のフレームが1つのcのフレームに混在しているためか、このcのフレームの黄色のフィールドと茶色のフィールドはかなり汚くなってしまいます

DoubleWeave後はその汚い部分が3, 4, 5にきてしまうため、黄色のフレームは2は綺麗だけれど3のトップフィールドは汚い、ということが起こります

593_15

次の例として、茶色→緑色のところでシーンチェンジが起きた場合を考えてみます。同様にdが汚いフレームになってしまうので、そのフレームのフィールドが使われてしまう5, 6, 7は汚い、ということになります

 

つまりPPIIPのIIのところで変化が激しくなった場合、3~7は汚くなってしまう可能性が高いのでそれを避けるように選択するのがよい、ということになります。SelectEvery(10, 0, 2, 5, 8)はそういう選択の仕方をしているので、最もノイズフレームが少なくなった(5の部分だけ)、逆にSelectEvery(10, 0, 3, 5, 7)は最もノイズフレームが多くなった(3,5,7の部分)、ということです

593_16

極端な例として、青色→黄色でシーンチェンジが起きて、その後静止フレームなケースを考えてみます。この場合はできるだけシーンチェンジから遠いフレームを取った方がよさそうなので、2ではなく3を取った方が大差はないかもしれませんが、ノイズレスになるのではないでしょうか。そしてこの手のケースでは後述のゴーストについても差がでるでしょう

と、いうわけで、どのフレームも必ずSelectEvery(10, 0, 2, 5, 8)が綺麗になる、というわけではないはずです。(2より3が綺麗 or 8より7が綺麗 になるフレームは滅多にないだろうけれどありうる) ただ、全体的にみればノイズレスになる、とは言えると思います

PPIIPの場合で話をしていましたが、他の場合は

PPIII (10, 0, 2, 4, 7)
PPIIP (10, 0, 2, 5, 8)
PIIPP (10, 0, 3, 6, 8)
IIPPP (10, 1, 4, 6, 8)
PIIIP (10, 2, 4, 6, 9)

ノイズレスな選択パターンはこうなります。奇数が少なくなるように選択すればよい、と覚えると楽かもしれません

 

ゴースト比較

ゴースト(前フレームのうつりこみ)について考えてみましょう。これは単純に後ろのフレームを取るようにした方がゴーストは減るんでしょう

593_17

上はPulldown(0, 3)、下はSelectEvery(10, 0, 2, 5, 8)です。左半分は1フレーム前の映像で、数字はAverageLuma()の値、となっています。SelectEvery(10, 0, 3, 5, 8)とSelectEvery(10, 0, 2, 5, 8)の比較ということになるので、2と3の比較ということになりますね。

見た目ではあまりわかりませんが、下のSelectEvery(10, 0, 2, 5, 8)の方が輝度が高いです。多分直前のフレームの影響を受けてしまっているんでしょう

593_18

上から1フレーム進んだ状態はこちらです。以降このシーンはある程度続くのですが、平均輝度は108.9付近で落ち着いていました。上のPulldown(0, 3) = SelectEvery(10, 0, 3, 5, 8)の方がゴーストが少なかった、と見ることができるのではないでしょうか

2と3の比較、と書きましたが、2と3の違いはDoubleWeaveの図を見てもわかるとおり、トップフィールドだけです。なのでトップフィールドだけ輝度が落ち着いた状態になったということでしょう

 

画質比較まとめ

今までの結果を総合すると

  • ノイズが少ないのはSelectEvery(10, )で偶数を多く選択したもの
  • ゴーストが少ないのはPulldown(かSelectEvery)でより後ろのフレームを選択するようにしたもの

となるのではないでしょうか。PPIIPのときは

ノイズ面で見るなら

SelectEvery(10, 0, 2, 5, 8) > Pulldown(0, 2) ≒ Pulldown(0, 3) > SelectEvery(10, 0, 3, 5, 7)

ゴースト面で見るなら

Pulldown(0, 3) > SelectEvery(10, 0, 2, 5, 8) ≒ SelectEvery(10, 0, 3, 5, 7) > Pulldown(0, 2)

総合的には

SelectEvery(10, 0, 2, 5, 8) > Pulldown(0, 3) > Pulldown(0, 2) > SelectEvery(10, 0, 3, 5, 7)

かな?基本的にはもっともノイズが少なくなるようにフレームを選択して、低ビットレートだとかでゴーストが気になるソースに遭遇したときは後ろのフレームを選択するようにすればいいんじゃないでしょうか

 

縞字幕回避

映画や海外ドラマを逆テレシネしたときに出てくる、縞字幕について考えてみます。今回は逆テレシネ前に縞字幕がないのに、逆テレシネすると縞字幕ができてしまうものについて考えてみましょう。専門チャンネルはこのパターンのようです

例としてPPIIPのもので、最初のPPIには字幕があるけれど、次のIPでは字幕がないものを考えてみます

593_1

茶色のフレームはボトムフィールドにのみ字幕がある状態になってしまいました

 

同様に最初のPPIに字幕はないけれど、次のIPで字幕が出るような場合は同じように考えてみます

593_2

ボトムフィールドに字幕はないけれどトップフィールドに字幕がある茶色ができあがってしまいました

 

次に最初のPPに字幕はあるけれど、次のIIPでは字幕がないものを同様に考えてみます

593_3

DoubleWeave時0, 2 or 3, 5, 7 or 8の6つがPになりますが、2は字幕縞がないが3は字幕縞が出ることになります

要は2枚のソースフレームから1枚のPを取る場合(図で言うと網掛けが混じるフレーム、奇数のフレーム)は縞字幕の出る可能性がある、ということですね。なので、この場合はSelectEvery(10, 0, 2, 5, 8)がもっとも縞字幕が少なくなる、ということになります。DoubleWeaveの基礎確認のところでも書きましたが、偶数はDoubleWeave前のフレームと同じになるので、DoubleWeave前に縞がない=偶数は縞がない、という考え方でもいいです

本当に縞字幕が少ないのか、縞判定スクリプトを実行して、日本語字幕音声英語の米ドラで縞字幕の数を比較します

(0, 2) (0, 3) (0, 3, 5, 7) (0, 2, 5, 8)
縞字幕フレーム 205フレーム 158フレーム 269フレーム 94フレーム

理屈通り、SelectEvery(10, 0, 2, 5, 8)が一番縞字幕が少ない結果になりました

593_12

先ほどノイズフレーム比較でもでてきた集合図の特徴と一致しました。ということで逆テレシネ前に縞字幕がない場合に縞字幕を減らしたい場合は、Pulldownよりも、偶数を最大限(3つ)選択したSelectEvery(10,)の方がよい、となります

 

 

まとめ

 

Pulldown()ならできるだけ後ろを取ったほうがよさそう、SelectEvery(10, )なら偶数をできるだけ多く(3つ)取ったものがよさそう、という結論になりましたが、最後にこの2つの特徴でもまとめておきましょう

ここでのPulldownは後ろを選択するようにしたもの、SelectEveryはSelectEvery(10, )でできるだけ多く(=3つ)偶数を選択したもの、とします

 

Pulldown

  • ゴーストが起こりにくい
  • Pulldownは2つの周期に対応できるので、周期変化があっても何もしなくてもきっちり24pになることもある(ただしそのときは上のメリットは消える)

 

SelectEvery

  • ノイズや(ソースによっては)縞字幕が少なくなるように選択してくれる
  • 周期変化があったらPulldownと違って必ず対応しないといけない

 

最後に表のっけておきます

Pulldown SelectEvery
×
PPPII (2, 4) (0, 2) (2, 5, 7, 9) (0, 2, 4, 7)
PPIIP (0, 2) (0, 3) (0, 3, 5, 7) (0, 2, 5, 8)
PIIPP (0, 3) (1, 3) (1, 3, 5, 8) (0, 3, 6, 8)
IIPPP (1, 3) (1, 4) (1, 3, 6, 9) (1, 4, 6, 8)
IPPPI (1, 4) (2, 4) (1, 4, 7, 9) (2, 4, 6, 9)

人によって評価は変わるかもしれませんが、個人的にはどれか1つ使うなら右端でいいんじゃないかと思ってます

 

コメント

  1. Takuan より:

    ちなみに…
    Pulldown( x, y ) は内部的には

    a = last.SelectEvery( 5, x % 5 )
    b = last.SelectEvery( 5, y % 5 )
    Interleave( a, b ).AssumeFrameBased()

    になってます.

  2. QuintRokk より:

    >Pulldown(x,y)はSelectEvery(5,x,y)と等しい
    とか書いた1時間後にあっさりダメ出しされてしまいました・・・
    インタレへの愛がないからこんなダメダメなんでしょうね。もっとインタレを愛していこうと思います

  3. Takuan より:

    いやまあ どっちでも同じでしょう(ぇ
    インタレェ…

タイトルとURLをコピーしました