映画やアニメの60fpsインターレース動画を、24fpsプログレッシブ動画にしてみよう。

ちぇすにゃんがんばっ ♥


 えーっと、24fps化ってのが何なのか、とかはとりあえず省略。最初は、インターレース60fpsの画像5枚から、2枚を選び出す作業、とでもしておこう。細かいことは気にしにゃい。

 さて、いまいち環境が無いようなのでmatlabに読み込ませてみようかな、と・・・思ったんだけど、どうもavi対応とかは弱いようで、まぁ無圧縮のaviなら行けるんだけど、それってコマ送りするのにaviutlとかtmpgencとかいるよね、ってことでソースのmpeg2から連番bmpに吐いてから、matlabに読ませることにした。つまり、
        ソース(mpeg2,60i)→DVD2AVI (d2v)→Tmpgenc→連番bmp→matlab→aviutl→m4c等
と、いったフローを考えているのだが、まーその通りに行くとは限るまい(笑)

さて

 つまるところ、60fpsの連番bmpを、matlabで2/5に減らすわけだが、とりあえずTmpgenc程度のレベルにはしておかないと、そこから先が進まない。そんなわけで、インターレース解除を一からやることになる。

まずは、サンプル画像。
サンプルその1
  
シーンチェンジや24fps化周期が変わらない、しかも見るからにインターレース縞を検出しやすそうなサンプルである。これをmatlabでインターレース解除してみよう。

2001 10/23
 小手調べに、フレームの差をとって、その強度を並べてみた。下がそのグラフ。
 
右が時間軸、上がピクセルの差分の強度だ。差がほとんど無いフレームが5つおきに出現することがよくわかる。
このようなとってもわかりやすいサンプルだと、この程度のインターレース検出で、完全に24fps化できてしまうようだ。

そこで、もちっとわかりにくいサンプルにしてみる。
サンプルその2
今度は、前後2つのシーンがあり、それぞれ24化周期が異なっている。さらに前半は動きが少なく、差分だけでは苦しそうだ。
上と同じように、差分強度をグラフにしてみると・・・

こんな風になってしまう。
前半はほぼフラットで、5つおきの周期は検出不能だ。
真ん中の強い差分強度の2フレームは、前後のシーンの変わり目、つまりシーンチェンジを示している。後々、シーンチェンジを検出する必要も出てくるだろうから、あとで特徴をまとめておく必要があるだろうにゃ。
後半もスクロールが始まるまでは、ほぼフラットで、周期は検出できない。

考え方としては、同じシーン=同じ周期であるので、もしも各シーンチェンジ箇所が確実に分かっているなら、シーン毎に含まれる全フレームから24化周期を統計算出すれば、まず間違えることはないような気はする。が、シーンチェンジ箇所を間違えていると、悲惨なことになるのは確かであるし、シーンチェンジ箇所を特定するのはかなり難しいだろうから、これは補助的に考えて置いた方が良さそうだ。

とりあえず、この差分のみを使った24化周期検出は精度が悪いので、他の方法を考えてみよう。・・・といっても、インターレース検出なんてさっぱり思いつかないので、いろいろmatlabのデモとかを触ってみる。要するにTmpgencのフリッカー強度算出式が分かりゃ良いんだが・・・どっかにないの??

というわけで、わかんなかったので差分に水平方向エッジ検出なぞをかけてみて、インターレース縞を強調させてから、上の差分強度をとってみることにする。たとえばサンプル1の場合、エッジ検出をかけると、下のようにインターレース縞が強調されてくる。

左が5つ周期の連続フレーム、右がそれ以外の4つのフレームというわけだ。それなりに強調されてわかりやすくなっている。

ちなみに、こういう1方向縞模様パターンがどの程度あるか、という検出方法を考えれば、かなり正確になりそうなものなのだが、いまのところ思いつかないので、ただ単にこの白い部分の面積を足し会わせた。うーむいまいち・・。

サンプル1の結果はこれだ。
さすがにわかりやすいサンプルだけあって、結果も大差無し。

サンプル2の結果はこう。
前半はこれで正解だ。24化周期の検出が可能だろう。
問題は後半先頭部分。検出できないことはないが、これではミスの原因になるだろう。jpgにしてしまったので、このあたりのフレームはサンプルから読みとりにくいかと思うが、水面が微妙に変化していたりする。色合いの変化であるため、強度変化に現れにくかったのかもしれない。RGBそれぞれのチャンネルで上のようなグラフをつくり、別個に参照できるようにした方が良いかもにゃあ。

 

2001 12/07
その2。口パクシーンはどうかなにつづく