2012年8月28日火曜日

あぷこん考

そこのあなた、アプコンやったことありますか?
そう、アニメDVDとかを拡大してからわざわざ再エンコードするあれですよ、あれ。

私? ええ、やったことありますよ。何年前になるのかなぁ、エンコ始めたばっかの頃。
わけも分からずに、やたら糞重たいフィルタを何重にも掛けて、10数時間がかりでCPUぶん回した挙句、途中でクラッシュとかね。

だいたい1週間くらいで飽きてやめたんだけど、あの頃やったのは今でもとってあります。
なんつーか、見返すたびに当時の自分の精神状態を疑いたくなりますな。

で、若気の至り?の残骸を久しぶりに見ながら、「今だったらせめてこうやるよなぁ」みたいなことを考えたのでちょっと書いてみることにします。

1.まずは素材

拡大するんですからインタレ解除は必須です。
DVD素材なら、まあこんな感じでいいでしょう。
MPEG2Source("video.d2v", idct=3, cpu=0)

#1pass目
#TFM(d2v="video.d2v", output="matches.txt")
#TDecimate(mode=4, output="metrics.txt")

#2pass目
TFM(d2v="video.d2v", input="matches.txt")
TDecimate(mode=5, hybrid=2, vfrDec=1, input="metrics.txt", tfmIn="matches.txt",
\         tcfv1=false, mkvOut="timecodes.txt")
ここ数年はDVDでもソフトプルダウンのものが増えましたので、force filmで済むものも多くなりましたな。

2.拡大

DVDサイズ(720x480)を拡大するなら、とりあえず16:9なら1280x720、4:3で960x720くらいが妥当でしょう。それ以上はさすがに無理がある。
リサイザは色々ありますが、スピードとか考えたらSpline36Resizeあたりでいいんじゃないですかね。
あと、周囲に黒ベタがあるなら、それは綺麗に削ります。多少のアス比の狂いなんてキニシナイキニシナイ。
src = last
resized = src.Spline36Resize(1280, 720, 4, 2, -3, 0) #Crop値は適当です。

3.いろいろ

アプコンする人って、大抵線が濃いほうが好きですよね。まあ、拡大したせいで結構ボケてるでしょうし、それもいいでしょう。
resized = resized.FastLineDarkenMod()

え? 線が太いのがいや? ならWarpSharpで削りますか。
resized = resized.WarpSharp()

ここまでやると、ある程度エンコ歴のある人は顔をしかめますな。「油絵かよ」って。
WarpSharpは特にエンコ始めたばっかの人に人気のあるフィルタですが、線が細くなる以外に色の変化がキツくなるという作用もあります。ボケた感じの背景に掛けると油絵の具で塗ったみたいになるのです。

そもそもアニメなんてのは、エッジを除けばあとはベタ塗りとグラデーションとボケた背景の塊です。
こういった映像を拡大するなら、SplineやLanczosよりもBilinearResizeのほうが遥かに向いています。
ボケてるものはボケたままに拡大するほうが綺麗です。

じゃあ、どううすればいいかなって考えてみると
mask = resized.mt_edge().mt_binarize()
background = src.BilinearResize(1280, 720, 4, 2, -3, 0)
mt_merge(background, resized, mask)
つまり、FastLineDarkenやらWarpSharpやらかけたものはエッジだけ使って、その他の部分はBilinearResizeで拡大したものにしてやる。
これで完璧ってわけにはいきませんが、やらないよりはマシでしょう。

あとは画面が広くなった分バンディングが目立つようになるだろうから、低減フィルタをかければオシマイ。

4.まとめ

LoadPlugin("DGDecode.dll")
LoadPlugin("mt_masktools-26.dll")
LoadPlugin("warpsharp.dll")
Import("FastLineDarkenMod.avs")
#その他フィルタの読み込み

MPEG2Source("video.d2v", idct=3)
#インタレ解除
#必要ならデノイズ

bg = last.BilinearResize(1280, 720, left, top, right, bottom)
edge = last.Spline36Resize(1280, 720, left, top, right, bottom).
\      FastLineDarkenMod().WarpSharp()
mask = edge.mt_edge().mt_binarize()
mt_merge(bg, edge, mask)

#バンディング/暗部対策等

こんなもんじゃないですかね。
あくまでも考えただけで、実際に何本かやってみようとかは全然思わないんですけど。

0 件のコメント:

コメントを投稿