2011年3月26日土曜日
DeLetterL 0.8
リニューアル(test)版を公開しました。
前回の説明通り、新しい手法も追加していますが、画質にこだわらなければdeletterlの方が使いやすいので残しています。使い方は変わりませんが内部処理含め大幅に変更しています。個々の処理の説明はavsiファイル中に記載。長名のfunctionも増えたので表記上はDeLetterLと部分的に大文字にしていますが使う時は小文字でも大文字でも構いません。
説明として適切かどうか怪しいけれど録画している人も多そうなサンプルとして、3/20TBS放送のSTAR DRIVER 輝きのタクトのうち、次回予告~青の祓魔師番宣部分で説明します。
ヴァンガードのCM明け予告開始のフレームが0になるようにTrim()した状態を前提にしていますので、予告の最初のフレームが1234であればTrim(1234, 0)として、予告の最初のフレームがクリップの最初のフレームになるようにして下さい。
この条件でL字(TBSでは額縁状態なのでL字っぽい口字)のフィールド位置を確認すると、
0 予告開始
31 L字が出現
72 L字最大直前のフィールド
73 L字最大化、以降同じ
1084 L字継続のまま青の祓魔師開始
1917 L字最大の最後のフィールド
1918 L字縮小開始
1959 L字の残る最後のフィールド
1960 L字消滅、以降通常
1976 番宣最後のフィールド
1977 CMスタート
ShowFieldNumber()で数字を確認する時、L字の迫り出しがカクカクする場合はbottomfirstになっている可能性がありますのでAssumeTFF()などでtopfirstにして下さい。
deletterlでの補正
L字の開始フィールドは31, 終了フィールドは1959なので
DeLetterL(31, 1959, "tbs")
これで絵としては元のサイズに戻っていますが、tbsの場合周囲が欠けているため緑額縁が残ります。
これ以降はインタレ解除前提になりますので、普段使う方法でプログレ化して下さい。
失われた部分はどうにもならないので、
A案:素直に周囲を削って絵を拡大してしまう
CropDeLetterL(left=32, top=12, right=32, bottom=42)
サイズを維持するため少し拡大されます。フレーム範囲指定も可能。複数回のリサイズを避け、cropと同時に別のサイズにする場合は
cropdeletterl(left=32, top=12, right=32, bottom=42, width=1280, height=720)
のようにwidth, heightを指定してします。ただし複数箇所になる場合は注意が必要。指定している数値は例であって、推奨値ではありません。
B案:削る替わりに周囲をモーションぼかし(不正確な表現)っぽく流して誤魔化す
blurdeletterl(left=32, top=12, right=32, bottom=42)
処理イメージは(みどり)にあります。欠けていた部分を残っている絵の隅の色で埋めて誤魔化します。大抵は気持ち悪い映像になってしまうけれど絵によっては気にならないこともあるのでMXの短時間L字では代替できるパターンもありそう。
C案:色が気になるので、別の色で塗り替える
borderdeletterl(left=32, top=12, right=32, bottom=42, color=$000000)
欠けている部分を指定色で塗ってしまう。視聴環境によっては微妙幅の額は気にならないこともありそう?というこれも強引な方法。
ほとんどの場合素直に削ってしまうのが無難だけど、遊び的な意味で追加してみた処理。
フィールド単位の拡大を避けた補正
次にフィールド単位のリサイズの劣化を抑える少し面倒な手法を説明。
まずL字になっていない部分をL字化して全体をL字状態に統一します。全体といってもMXの部分L字のような場合はカット境界で分けるのが無難かも。追記 (より余分な劣化を減らすために、L字のない部分は別処理にした方が有利です・・が、範囲ごとに処理を変えるのも面倒になので、こだわりと手間のバランスで判断した方がよさそう)
最初に、最大L字なっていない範囲を最大L字化します。この指定がややこしいので意図を理解しないと分かりにくいけれど、上のフィールド位置でいうと0~72のフィールドがL字が皆無または、迫り出しの途中で最大になっていない部分になるので新しい関数FullLetterLにこの範囲を指定します。
FullLetterL(0, 72, "tbs", "in")
同様にL字終了部分では、1918~1976が最大L字になっていないので
FullLetterL(1918, 1976, "tbs", "out")
"in"はL字開始、"out"はL字終了を意味し省略時は"in"。最大L字になっていない範囲を指定するというわかりにくい指定になりますので注意して下さい。DeLetterLで指定するL字の開始位置や終了位置は使いません。
この2行で予告番宣全体がL字処理されたような状態になりますので、そのサイズのままインタレ解除し、その後で余分なところを切り取ります。
FullLetterL(0, 72, "tbs", "in")
FullLetterL(1918, 1976, "tbs", "out")
#ここで適当なインタレ解除
FullDeLetterL(0, 791, "tbs")
FullDeletterLは指定範囲全フレームが最大L字になっていることを前提に局設定に従ってフレームで拡大することでL字解除します。といっても欠け問題は対処していませんのでtbsの場合はDeLetterLと同様額縁状態になります。この場合もCropDeLetterLなどの後処理を行ないます。
DeLetterLとFullLetterl + fulldeletterlの組み合わせはどちらも似たような状態になりますが、後者はフィールド単位の拡大を回避しているため、劣化の少ない映像になります。
ここまで説明で気になる通り、FullLetterL + FullDeLetterLで処理した後にさらにCropDeLetterLでリサイズするのは軽微とはいえ劣化するので最初からFullLetterLから直接CropDeLetterLしてしまった方が効率的で画質面でも有利になります。
FullLetterL(0, 72, "tbs", "in")
FullLetterL(1918, 1976, "tbs", "out")
#ここで適当なインタレ解除
CropDeLetterL(0, 791, left=196, top=22, right=40, bottom=160)
どこまで削ってよいかは個々の判断になりますので、局指定の初期値はありません。適当に気にならない数字を決めて下さい。場合によっては少し工夫も必要になるので、無駄があってもFullLetterlL + FullDeLetterlL + CropDeLetterLの方がわかりやすいかもしれません。
テレ東など欠けのほとんど局の場合は、FullLetterLとFullDeLetterLでL字に関する処理は完了するので、通常CropDeLetterLなどを使う必要はありません。
MXやフジテレビではロゴ含めてリサイズされているため、FullLetterLを使う場合、対象個所はL字状態のままロゴ削除した方がよさそう。
前回の説明通り、新しい手法も追加していますが、画質にこだわらなければdeletterlの方が使いやすいので残しています。使い方は変わりませんが内部処理含め大幅に変更しています。個々の処理の説明はavsiファイル中に記載。長名のfunctionも増えたので表記上はDeLetterLと部分的に大文字にしていますが使う時は小文字でも大文字でも構いません。
説明として適切かどうか怪しいけれど録画している人も多そうなサンプルとして、3/20TBS放送のSTAR DRIVER 輝きのタクトのうち、次回予告~青の祓魔師番宣部分で説明します。
ヴァンガードのCM明け予告開始のフレームが0になるようにTrim()した状態を前提にしていますので、予告の最初のフレームが1234であればTrim(1234, 0)として、予告の最初のフレームがクリップの最初のフレームになるようにして下さい。
この条件でL字(TBSでは額縁状態なのでL字っぽい口字)のフィールド位置を確認すると、
0 予告開始
31 L字が出現
72 L字最大直前のフィールド
73 L字最大化、以降同じ
1084 L字継続のまま青の祓魔師開始
1917 L字最大の最後のフィールド
1918 L字縮小開始
1959 L字の残る最後のフィールド
1960 L字消滅、以降通常
1976 番宣最後のフィールド
1977 CMスタート
ShowFieldNumber()で数字を確認する時、L字の迫り出しがカクカクする場合はbottomfirstになっている可能性がありますのでAssumeTFF()などでtopfirstにして下さい。
deletterlでの補正
L字の開始フィールドは31, 終了フィールドは1959なので
DeLetterL(31, 1959, "tbs")
これで絵としては元のサイズに戻っていますが、tbsの場合周囲が欠けているため緑額縁が残ります。
これ以降はインタレ解除前提になりますので、普段使う方法でプログレ化して下さい。
失われた部分はどうにもならないので、
A案:素直に周囲を削って絵を拡大してしまう
CropDeLetterL(left=32, top=12, right=32, bottom=42)
サイズを維持するため少し拡大されます。フレーム範囲指定も可能。複数回のリサイズを避け、cropと同時に別のサイズにする場合は
cropdeletterl(left=32, top=12, right=32, bottom=42, width=1280, height=720)
のようにwidth, heightを指定してします。ただし複数箇所になる場合は注意が必要。指定している数値は例であって、推奨値ではありません。
B案:削る替わりに周囲をモーションぼかし(不正確な表現)っぽく流して誤魔化す
blurdeletterl(left=32, top=12, right=32, bottom=42)
処理イメージは(みどり)にあります。欠けていた部分を残っている絵の隅の色で埋めて誤魔化します。大抵は気持ち悪い映像になってしまうけれど絵によっては気にならないこともあるのでMXの短時間L字では代替できるパターンもありそう。
C案:色が気になるので、別の色で塗り替える
borderdeletterl(left=32, top=12, right=32, bottom=42, color=$000000)
欠けている部分を指定色で塗ってしまう。視聴環境によっては微妙幅の額は気にならないこともありそう?というこれも強引な方法。
ほとんどの場合素直に削ってしまうのが無難だけど、遊び的な意味で追加してみた処理。
フィールド単位の拡大を避けた補正
次にフィールド単位のリサイズの劣化を抑える少し面倒な手法を説明。
まずL字になっていない部分をL字化して全体をL字状態に統一します。全体といってもMXの部分L字のような場合はカット境界で分けるのが無難かも。追記 (より余分な劣化を減らすために、L字のない部分は別処理にした方が有利です・・が、範囲ごとに処理を変えるのも面倒になので、こだわりと手間のバランスで判断した方がよさそう)
最初に、最大L字なっていない範囲を最大L字化します。この指定がややこしいので意図を理解しないと分かりにくいけれど、上のフィールド位置でいうと0~72のフィールドがL字が皆無または、迫り出しの途中で最大になっていない部分になるので新しい関数FullLetterLにこの範囲を指定します。
FullLetterL(0, 72, "tbs", "in")
同様にL字終了部分では、1918~1976が最大L字になっていないので
FullLetterL(1918, 1976, "tbs", "out")
"in"はL字開始、"out"はL字終了を意味し省略時は"in"。最大L字になっていない範囲を指定するというわかりにくい指定になりますので注意して下さい。DeLetterLで指定するL字の開始位置や終了位置は使いません。
この2行で予告番宣全体がL字処理されたような状態になりますので、そのサイズのままインタレ解除し、その後で余分なところを切り取ります。
FullLetterL(0, 72, "tbs", "in")
FullLetterL(1918, 1976, "tbs", "out")
#ここで適当なインタレ解除
FullDeLetterL(0, 791, "tbs")
FullDeletterLは指定範囲全フレームが最大L字になっていることを前提に局設定に従ってフレームで拡大することでL字解除します。といっても欠け問題は対処していませんのでtbsの場合はDeLetterLと同様額縁状態になります。この場合もCropDeLetterLなどの後処理を行ないます。
DeLetterLとFullLetterl + fulldeletterlの組み合わせはどちらも似たような状態になりますが、後者はフィールド単位の拡大を回避しているため、劣化の少ない映像になります。
ここまで説明で気になる通り、FullLetterL + FullDeLetterLで処理した後にさらにCropDeLetterLでリサイズするのは軽微とはいえ劣化するので最初からFullLetterLから直接CropDeLetterLしてしまった方が効率的で画質面でも有利になります。
FullLetterL(0, 72, "tbs", "in")
FullLetterL(1918, 1976, "tbs", "out")
#ここで適当なインタレ解除
CropDeLetterL(0, 791, left=196, top=22, right=40, bottom=160)
どこまで削ってよいかは個々の判断になりますので、局指定の初期値はありません。適当に気にならない数字を決めて下さい。場合によっては少し工夫も必要になるので、無駄があってもFullLetterlL + FullDeLetterlL + CropDeLetterLの方がわかりやすいかもしれません。
テレ東など欠けのほとんど局の場合は、FullLetterLとFullDeLetterLでL字に関する処理は完了するので、通常CropDeLetterLなどを使う必要はありません。
MXやフジテレビではロゴ含めてリサイズされているため、FullLetterLを使う場合、対象個所はL字状態のままロゴ削除した方がよさそう。
2011年3月24日木曜日
deletterl リニューアル版
深夜帯L字も減少傾向で需要は少なさそうだけど、まとめ的な意味を含めて近日中にリニューアル版を公開予定。元々MXの一部L字を気にならない程度に誤魔化す方法として作ったこともあって、既存のアプローチでは処理品質が低く、多局対応に合わせて大幅に書き直し。MXSD放送、日テレも仮対応予定。
L字処理は局に関係なくフィールド毎のリサイズで映像が縮小されている。フィールド毎のリサイズは拡大では縞アプコンのように顕著な劣化が出やすいのに対し、フィールド毎の縮小ではよれよれ化などの劣化は出ることはあっても拡大よりは軽微に影響で済む。 追記訂正 すべてフィールド毎の処理と思ってしまっていたけれど、実際は-ipアプコンに近い(性能としてはそれ以上)フレームでの拡大が可能な部分はフレーム化してリサイズしている局もあり、フィールド毎というのは誤認というより注意力不足と先入観のよる誤解でした。大半の-ipアプコンと異なり、前後のフィールドから正しい組み合わせにしてから縮小するという理想的なリサイズ処理になっている局も多いように見える。手元のデータだけで見るとかなり複雑な判定処理をやっているように見える局もあるけれど、データが少な局ごとの正確な挙動を確認するのは諦め。サンプルの多いMXに関して言えば、基本はフレーム化できるところはフレームで縮小しているけれど低頻度ながら誤判定もあり、フレームで処理しているところとフィールドで処理しているところの違いを確認できる例もあった。従って以下の説明も若干不適切な内容になっていますが、L字部を削る処理はフレームで処理した方が良いという話は変わりません。
現状のdeletterlはフィールド毎の拡大という逆の処理で元絵に近似させているため、フィールド毎のリサイズの影響が大きくなってしまっている。補正後の映像は縞HV映像そのものであり、ここで縞問題を何度も取り上げてきたのに同じ問題を作っているのはある意味恥ずかしい話。出来の悪い手法のまま長く放置してごめんなさい。
ということで逆転の発想というほどのものではないけれど、L字を解消するのではなくL字でないところもすべてL字かしてしまった上でプログレ化し、その後でフレームでリサイズすることで劣化を回避する、というアプローチを追加します。少し面倒な処理になるもののアニメのようにフレームが基本の映像の場合効果は大きい。ここで書くまでもなく質にこだわる人であれば以前から適切な手法を使っているだろうけど。
実験サンプル。ソースはスパロボ@MXでのL字。
既存のdeleterl処理後の映像の分布。
フィールド毎の拡大による劣化がはっきり出ていて、HV1280-iで良く出てくる上下に影のある分布になってしまっている。
むしろ素直なアプローチでフレームで処理するように変更した時の分布。縦の劣化も消え少し四角感はあるものの円に近い分布になる。
最初からまともな処理にしとけ、と文句を言われても当然な話だけど、MXのL字は一時的な上絵の欠けもある。面倒な上妥協も必要なL字消し処理するより他局で見た方がよいこともあって、処理品質を気にする以前に使う機会もほとんどなかった。縞解消もそうだけど、可能であるというだけでなく許容できる容易さで設定値を決めることができないと実用にならないことも多いだけに妥協も重要だったりする。
・・・と、思いっきり言い訳しておこう。
現状のdeletterlはフィールド毎の拡大という逆の処理で元絵に近似させているため、フィールド毎のリサイズの影響が大きくなってしまっている。補正後の映像は縞HV映像そのものであり、ここで縞問題を何度も取り上げてきたのに同じ問題を作っているのはある意味恥ずかしい話。出来の悪い手法のまま長く放置してごめんなさい。
ということで逆転の発想というほどのものではないけれど、L字を解消するのではなくL字でないところもすべてL字かしてしまった上でプログレ化し、その後でフレームでリサイズすることで劣化を回避する、というアプローチを追加します。少し面倒な処理になるもののアニメのようにフレームが基本の映像の場合効果は大きい。ここで書くまでもなく質にこだわる人であれば以前から適切な手法を使っているだろうけど。
実験サンプル。ソースはスパロボ@MXでのL字。
既存のdeleterl処理後の映像の分布。
フィールド毎の拡大による劣化がはっきり出ていて、HV1280-iで良く出てくる上下に影のある分布になってしまっている。
むしろ素直なアプローチでフレームで処理するように変更した時の分布。縦の劣化も消え少し四角感はあるものの円に近い分布になる。
最初からまともな処理にしとけ、と文句を言われても当然な話だけど、MXのL字は一時的な上絵の欠けもある。面倒な上妥協も必要なL字消し処理するより他局で見た方がよいこともあって、処理品質を気にする以前に使う機会もほとんどなかった。縞解消もそうだけど、可能であるというだけでなく許容できる容易さで設定値を決めることができないと実用にならないことも多いだけに妥協も重要だったりする。
・・・と、思いっきり言い訳しておこう。
2011年3月20日日曜日
deltterl TBS対応暫定版
※この記事の処理は推奨しません。こちらを参照して下さい
TBS対応。
deletterl(100, 200, "tbs")
放送局指定
"tbs" TBS, "cx" フジテレビ, "ex" テレビ朝日, "tx" テレビ東京
"tvk" テレビ神奈川, "mx"(または指定なし) TOKYO MX
TBSもテレ朝に似た口字状態だけど、映像の欠けも起こっていて、処理後も額縁状態になってしまう。周囲をcropしないと気になる人も多そうだけど、文字は見えないので枠残したままでも普通に見る分には邪魔な感じはしないかも?TBSもロゴ消しが先。
日テレは、L字開始の動きが一定でなかったり、挙動も少し変わっていて他と同じアプローチでは誤差が大きいなど問題が多いため保留。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+54) ? 1 + f - s :
\ ((f >= e-54 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlex_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+36) ? 1 + f - s :
\ ((f >= e-36 && f <= e) ? 1 + e - f : 37))
w=5.74
w2=0.49
h=2.34
h2=0.15
return c.Lanczos4Resize(
\ 1440, 540, w*r, r*h2, 1440-(w+w2)*r, 540-(h)*r)
}
function deletterltbs_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+42) ? 1 + f - s :
\ ((f >= e-42 && f <= e) ? 1 + e - f : 43))
w=3.92
w2=0.36
h=1.61
h2=0.138
return c.Lanczos4Resize(
\ 1440, 540, w*r, r*h2, 1440-(w+w2)*r, 540-(h)*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltvk_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+12) ? 1 + f - s :
\ ((f >= e-12 && f <= e) ? 1 + e - f : 13))
w=18.92
h=7.096
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
deletterl(100, 200, "tbs")
放送局指定
"tbs" TBS, "cx" フジテレビ, "ex" テレビ朝日, "tx" テレビ東京
"tvk" テレビ神奈川, "mx"(または指定なし) TOKYO MX
TBSもテレ朝に似た口字状態だけど、映像の欠けも起こっていて、処理後も額縁状態になってしまう。周囲をcropしないと気になる人も多そうだけど、文字は見えないので枠残したままでも普通に見る分には邪魔な感じはしないかも?TBSもロゴ消しが先。
日テレは、L字開始の動きが一定でなかったり、挙動も少し変わっていて他と同じアプローチでは誤差が大きいなど問題が多いため保留。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+54) ? 1 + f - s :
\ ((f >= e-54 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlex_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+36) ? 1 + f - s :
\ ((f >= e-36 && f <= e) ? 1 + e - f : 37))
w=5.74
w2=0.49
h=2.34
h2=0.15
return c.Lanczos4Resize(
\ 1440, 540, w*r, r*h2, 1440-(w+w2)*r, 540-(h)*r)
}
function deletterltbs_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+42) ? 1 + f - s :
\ ((f >= e-42 && f <= e) ? 1 + e - f : 43))
w=3.92
w2=0.36
h=1.61
h2=0.138
return c.Lanczos4Resize(
\ 1440, 540, w*r, r*h2, 1440-(w+w2)*r, 540-(h)*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltvk_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+12) ? 1 + f - s :
\ ((f >= e-12 && f <= e) ? 1 + e - f : 13))
w=18.92
h=7.096
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
deltterl テレビ朝日対応暫定版
※この記事の処理は推奨しません。こちらを参照して下さい
テレ朝も追加。
テレビ朝日は左と下だけでなく上、右も迫り出すので状態としては口字。枠による絵の欠けは極僅か。ロゴは後入れなので、ロゴ消しを先に行なうのはテレ東と同じパターン。
deletterl(100, 200, "ex")
放送局指定
"cx" フジテレビ, "ex" テレビ朝日, "tx" テレビ東京
"tvk" テレビ神奈川, "mx"(または指定なし) TOKYO MX
cx, txに比べてテレ朝をexと呼ぶことは稀だけど短い方が楽なのでex。tvk以外はコールサイン由来。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+54) ? 1 + f - s :
\ ((f >= e-54 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlex_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+36) ? 1 + f - s :
\ ((f >= e-36 && f <= e) ? 1 + e - f : 37))
w=5.74
w2=0.49
h=2.34
h2=0.15
return c.Lanczos4Resize(
\ 1440, 540, w*r, r*h2, 1440-(w+w2)*r, 540-h*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltvk_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+12) ? 1 + f - s :
\ ((f >= e-12 && f <= e) ? 1 + e - f : 13))
w=18.92
h=7.096
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
テレビ朝日は左と下だけでなく上、右も迫り出すので状態としては口字。枠による絵の欠けは極僅か。ロゴは後入れなので、ロゴ消しを先に行なうのはテレ東と同じパターン。
deletterl(100, 200, "ex")
放送局指定
"cx" フジテレビ, "ex" テレビ朝日, "tx" テレビ東京
"tvk" テレビ神奈川, "mx"(または指定なし) TOKYO MX
cx, txに比べてテレ朝をexと呼ぶことは稀だけど短い方が楽なのでex。tvk以外はコールサイン由来。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+54) ? 1 + f - s :
\ ((f >= e-54 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlex_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+36) ? 1 + f - s :
\ ((f >= e-36 && f <= e) ? 1 + e - f : 37))
w=5.74
w2=0.49
h=2.34
h2=0.15
return c.Lanczos4Resize(
\ 1440, 540, w*r, r*h2, 1440-(w+w2)*r, 540-h*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltvk_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+12) ? 1 + f - s :
\ ((f >= e-12 && f <= e) ? 1 + e - f : 13))
w=18.92
h=7.096
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
deltterl tvk対応暫定版
※この記事の処理は推奨しません。こちらを参照して下さい
tvkL字に暫定対応。ただ少し例外的な処理が必要な感じでこのままでは難あり。
deletterl(100, 200, "tvk")
放送局指定
"cx" フジテレビ, "tx" テレビ東京, "tvk" テレビ神奈川, "mx"(または指定なし) TOKYO MX
わかりにくい制約があったリ不要な劣化や無駄を削減するなど工夫すべき点も多い状態だけど、調整に時間もかかりそうなので、先に対処可能な局について一通り調べてから整理する予定。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+54) ? 1 + f - s :
\ ((f >= e-54 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltvk_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+12) ? 1 + f - s :
\ ((f >= e-12 && f <= e) ? 1 + e - f : 13))
w=18.92
h=7.096
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
deletterl(100, 200, "tvk")
放送局指定
"cx" フジテレビ, "tx" テレビ東京, "tvk" テレビ神奈川, "mx"(または指定なし) TOKYO MX
わかりにくい制約があったリ不要な劣化や無駄を削減するなど工夫すべき点も多い状態だけど、調整に時間もかかりそうなので、先に対処可能な局について一通り調べてから整理する予定。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+54) ? 1 + f - s :
\ ((f >= e-54 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltvk_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+12) ? 1 + f - s :
\ ((f >= e-12 && f <= e) ? 1 + e - f : 13))
w=18.92
h=7.096
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
2011年3月18日金曜日
deltterl cx対応暫定版
※この記事の処理は推奨しません。こちらを参照して下さい
フジテレビL字に対応。
deletterl(100, 200, "cx")
放送局指定
"cx" フジテレビ, "tx" テレビ東京, "mx"(または指定なし) TOKYO MX
MX, フジテレビはL字消し後にロゴ消し
テレ東はロゴ消し後にL字消し
MX ,フジテレビでは元映像が大きく欠けるためL字消し後もL字が少し残ります。残った部分を誤魔化す方法として新しい手法(といっても陳腐なごまかしだけど)を追記予定。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+53) ? 1 + f - s :
\ ((f >= e-53 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
deletterl(100, 200, "cx")
放送局指定
"cx" フジテレビ, "tx" テレビ東京, "mx"(または指定なし) TOKYO MX
MX, フジテレビはL字消し後にロゴ消し
テレ東はロゴ消し後にL字消し
MX ,フジテレビでは元映像が大きく欠けるためL字消し後もL字が少し残ります。残った部分を誤魔化す方法として新しい手法(といっても陳腐なごまかしだけど)を追記予定。
function deletterlmx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+53) ? 1 + f - s :
\ ((f >= e-53 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterlcx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+60) ? 1 + f - s :
\ ((f >= e-60 && f <= e) ? 1 + e - f : 61))
w=2.93
h=1.10
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
return c.ConvertToRGB24().ScriptClip(
\ "deletterl" + tp + "_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
deltterl tx対応暫定版
※この記事の処理は推奨しません。こちらを参照して下さい
パート2も中途半端だったり編集ミスで正常に動作しない内容になっていたことがあったりと問題が多くてごめんなさい、な状態でしたがテレビ東京L字に対応した暫定版。不適切な部分もMX版の欠点そのままで不備も多いので少し整理して(みどり)に移動する予定。
テレビ東京の場合、
deletterl(100, 200, "tx")
と最後に"tx"を追加して指定する以外はMXと同じ。
function deletterl_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+53) ? 1 + f - s :
\ ((f >= e-53 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
ft = "deletterl_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
return c.ConvertToRGB24().ScriptClip(
\ ((tp == "tx") ? "deletterltx_f(" : "deletterl_f(") + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
パート2も中途半端だったり編集ミスで正常に動作しない内容になっていたことがあったりと問題が多くてごめんなさい、な状態でしたがテレビ東京L字に対応した暫定版。不適切な部分もMX版の欠点そのままで不備も多いので少し整理して(みどり)に移動する予定。
テレビ東京の場合、
deletterl(100, 200, "tx")
と最後に"tx"を追加して指定する以外はMXと同じ。
function deletterl_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterltx_f(clip c, int s, int e, int f) {
r = (f <> e ) ? 0 :
\ ((f >= s && f <= s+53) ? 1 + f - s :
\ ((f >= e-53 && f <= e) ? 1 + e - f : 55))
w=3.93
h=1.477
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e, string "tp") {
ft = "deletterl_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
return c.ConvertToRGB24().ScriptClip(
\ ((tp == "tx") ? "deletterltx_f(" : "deletterl_f(") + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e, string "tp") {
tp = default(tp, "mx")
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e, tp).
\ weave()
}
2009年10月3日土曜日
番外 MXのL字を消してみよう パート2
※この記事の処理は推奨しません。こちらを参照して下さい
追記
そらのおとしもの1話のL字で、縞解消を行なうと不都合があったので、deletterlcrop_szのみ修正しています。
前回L字消し記事を書いておきながら、他局やBDなどで補完、あるいはそもそもL字があったアニメに興味がないなどで、自分で実用的に使うことが1度もなかったけれど、MXのみ高画質でBDなしという例も多々あるので、いきなりL字(しかも事件でも災害でもない)炸裂だった超電磁砲を機会に見直してみよう。
といっても、やることは同じなので精度の向上と使いやすさを優先。改良の余地はまだあるだろうし試行錯誤途中のコードも残っているけれど、α版程度の気分で。
おかしいと思う点は適当に修正して下さい。それなりにavisynthを日常的に使っている人であれば、処理の内容を理解しなくても手順通りにやることでそれなりの結果になるようにしたつもり。
利用するfunction群
function showfieldnumber(clip c) {
return c.separatefields().ScriptClip(
\ "SubTitle(String(current_frame), size=90)")
}
function showframenumber(clip c) {
return c.ScriptClip(
\ "SubTitle(String(current_frame), size=90)")
}
function deletterl_f(clip c, int s, int e, int f) {
r = (f <> e) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e) {
ft = "deletterl_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
return c.ConvertToRGB24().ScriptClip(
\ "deletterl_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e) {
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e).
\ weave()
}
function deletterlcrop_sz(clip c, float l) {
w = c.width()
h = c.height()
return c.Lanczos4Resize(w, h,
\ l, 0, w - l, h - (l*float(h)/float(w)))
}
function deletterlcrop(clip c, int s, int e, float "l") {
l = default(l, 30)
return c.ApplyRange(s, e, "deletterlcrop_sz", l)
}
ステップ 1
はじめに、リサイズやインタレ解除等なしでL字の開始位置と終了位置を確認。
showfieldnumber()
だけを追加し、avsを読み込んで表示できるツールでL字の開始と終了フィールドの数値を記録する。フィールドに分けているので1440x540に潰れた状態になります。
開始位置とは青いL字が出現する最初のフィールド。終了は青いL字が見える最後のフィールド = L字が完全に消えるフィールドの一つ前です。
以下説明のため、開始フィールドが14107, 終了フィールドが18710の場合として記述します。
ステップ 2
ロゴ削除処理用に、L字で削られたエリアを取り除く。
deletterl(14107, 18710)
showfieldnumber()はもう不要です。ステップ1で確認した数字を指定するだけです。この状態でL字が映像に少し食い込んでいる部分は残りますが、絵の位置やサイズがL字がない時の状態に戻ります(といっても当然ながら劣化は残る)。
やっかいなところはこれで終わりなので、あとは好きなように処理すればよいだけですが、ステップ3以降は食い込んだL字部分も取り除く一つの方法を紹介
ステップ 3
適当にロゴ削除とかインタレ解除を行なった上で、食い込みL字を消す範囲を確認。ここ以降、赤字部分は自分の環境に合わせて置き換えてください。
deletterl(14107, 18710)
delogo_mx()
#アプコン縞解消をする場合はこのタイミング
fps24p()
showframenumber()
フレーム毎に数字が表示されるので、L字の残骸が見え始めるフレームが存在するカットの最初のフレームと、消えるカットの最後のフレームの数字を確認します。カット単位で処理するのは、絵を少し拡大する加工を行なうわけで、カットの途中で切り替えるとその変化が見えてしまうのを回避するためです。結果的にL字の影響がないフレームまで一部が切り取られてしまうけれど、人が視聴する映像なので、気になる問題を残さないことを優先。
以降開始フレームが5564、終了が 7533だった場合として説明します。
ステップ 4
ステップ3で確認した範囲のフレームの左と下を削ります。
deletterl(14107, 18710)
delogo_mx()
#アプコン縞解消をする場合はこのタイミング
fps24p()
deletterlcrop(5564, 7533)
最終的に通常の処理に2行を追加するだけで、そこに記述する数字の確認方法を冗長に説明した形。
削る量は調整が可能で
deletterlcrop(5564, 7533, 30)
のように最後に削る量を指定できます。初期値は30。小さくすると削る量が減ります。縦横比維持優先で指定は一つだけ。L字によって左側より下の方が比率として広く絵が削られるため、横は必要以上削る形になります。
流石に通常の場所ほど綺麗にロゴ消しできるわけでもないけれど、気にならない感じにはなり、それでも気になるならその範囲を少しぼかすのもあり。
L字状態中のロゴデータを作ることで、L字のせり出し以外の部分はもっと綺麗に消すこともできそうだけど複雑で面倒な上、BD買った方が確実に綺麗で時間も無駄にならないということで、このあたりが妥協点かな。
注意点
1440x1080決め打ちなのでHD放送専用。マルチ編成時は頑張ってなんとかして下さい。
キャプチャ環境などで微妙に横位置がずれる場合、若干悪い結果になる可能性がありそう。
昨日の超電磁砲しかL字のデータでチェックしていないので、他のL字でもこのままでよいか不明。運良く(むしろ「運悪く」か)今後のL字放送で改善できるような点が見つかれば更新するかも。
個別の処理の説明は秋新番が出揃った後、時間に余裕があれば加筆予定。(こういう表現の時はやらない可能性が高い)
追記
そらのおとしもの1話のL字で、縞解消を行なうと不都合があったので、deletterlcrop_szのみ修正しています。
前回L字消し記事を書いておきながら、他局やBDなどで補完、あるいはそもそもL字があったアニメに興味がないなどで、自分で実用的に使うことが1度もなかったけれど、MXのみ高画質でBDなしという例も多々あるので、いきなりL字(しかも事件でも災害でもない)炸裂だった超電磁砲を機会に見直してみよう。
といっても、やることは同じなので精度の向上と使いやすさを優先。改良の余地はまだあるだろうし試行錯誤途中のコードも残っているけれど、α版程度の気分で。
おかしいと思う点は適当に修正して下さい。それなりにavisynthを日常的に使っている人であれば、処理の内容を理解しなくても手順通りにやることでそれなりの結果になるようにしたつもり。
利用するfunction群
function showfieldnumber(clip c) {
return c.separatefields().ScriptClip(
\ "SubTitle(String(current_frame), size=90)")
}
function showframenumber(clip c) {
return c.ScriptClip(
\ "SubTitle(String(current_frame), size=90)")
}
function deletterl_f(clip c, int s, int e, int f) {
r = (f <> e) ? 0 :
\ ((f >= s && f <= s+30) ? 1 + f - s :
\ ((f >= e-30 && f <= e) ? 1 + e - f : 31))
w=5.809
h=2.178
return c.Lanczos4Resize(
\ 1440, 540, w*r, 0, 1440-w*r, 540-h*r)
}
function deletterl_sz(clip c, int s, int e) {
ft = "deletterl_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
return c.ConvertToRGB24().ScriptClip(
\ "deletterl_f(" + String(s) + "," +
\ String(e) + ",current_frame)"
\ ).ConvertToYUY2()
}
function deletterl(clip c, int s, int e) {
return c.ConvertToYUY2(interlaced=true).
\ separatefields().
\ ApplyRange(s, e, "deletterl_sz", s, e).
\ weave()
}
function deletterlcrop_sz(clip c, float l) {
w = c.width()
h = c.height()
return c.Lanczos4Resize(w, h,
\ l, 0, w - l, h - (l*float(h)/float(w)))
}
function deletterlcrop(clip c, int s, int e, float "l") {
l = default(l, 30)
return c.ApplyRange(s, e, "deletterlcrop_sz", l)
}
ステップ 1
はじめに、リサイズやインタレ解除等なしでL字の開始位置と終了位置を確認。
showfieldnumber()
だけを追加し、avsを読み込んで表示できるツールでL字の開始と終了フィールドの数値を記録する。フィールドに分けているので1440x540に潰れた状態になります。
開始位置とは青いL字が出現する最初のフィールド。終了は青いL字が見える最後のフィールド = L字が完全に消えるフィールドの一つ前です。
以下説明のため、開始フィールドが14107, 終了フィールドが18710の場合として記述します。
ステップ 2
ロゴ削除処理用に、L字で削られたエリアを取り除く。
deletterl(14107, 18710)
showfieldnumber()はもう不要です。ステップ1で確認した数字を指定するだけです。この状態でL字が映像に少し食い込んでいる部分は残りますが、絵の位置やサイズがL字がない時の状態に戻ります(といっても当然ながら劣化は残る)。
やっかいなところはこれで終わりなので、あとは好きなように処理すればよいだけですが、ステップ3以降は食い込んだL字部分も取り除く一つの方法を紹介
ステップ 3
適当にロゴ削除とかインタレ解除を行なった上で、食い込みL字を消す範囲を確認。ここ以降、赤字部分は自分の環境に合わせて置き換えてください。
deletterl(14107, 18710)
delogo_mx()
#アプコン縞解消をする場合はこのタイミング
fps24p()
showframenumber()
フレーム毎に数字が表示されるので、L字の残骸が見え始めるフレームが存在するカットの最初のフレームと、消えるカットの最後のフレームの数字を確認します。カット単位で処理するのは、絵を少し拡大する加工を行なうわけで、カットの途中で切り替えるとその変化が見えてしまうのを回避するためです。結果的にL字の影響がないフレームまで一部が切り取られてしまうけれど、人が視聴する映像なので、気になる問題を残さないことを優先。
以降開始フレームが5564、終了が 7533だった場合として説明します。
ステップ 4
ステップ3で確認した範囲のフレームの左と下を削ります。
deletterl(14107, 18710)
delogo_mx()
#アプコン縞解消をする場合はこのタイミング
fps24p()
deletterlcrop(5564, 7533)
最終的に通常の処理に2行を追加するだけで、そこに記述する数字の確認方法を冗長に説明した形。
削る量は調整が可能で
deletterlcrop(5564, 7533, 30)
のように最後に削る量を指定できます。初期値は30。小さくすると削る量が減ります。縦横比維持優先で指定は一つだけ。L字によって左側より下の方が比率として広く絵が削られるため、横は必要以上削る形になります。
流石に通常の場所ほど綺麗にロゴ消しできるわけでもないけれど、気にならない感じにはなり、それでも気になるならその範囲を少しぼかすのもあり。
L字状態中のロゴデータを作ることで、L字のせり出し以外の部分はもっと綺麗に消すこともできそうだけど複雑で面倒な上、BD買った方が確実に綺麗で時間も無駄にならないということで、このあたりが妥協点かな。
注意点
1440x1080決め打ちなのでHD放送専用。マルチ編成時は頑張ってなんとかして下さい。
キャプチャ環境などで微妙に横位置がずれる場合、若干悪い結果になる可能性がありそう。
昨日の超電磁砲しかL字のデータでチェックしていないので、他のL字でもこのままでよいか不明。運良く(むしろ「運悪く」か)今後のL字放送で改善できるような点が見つかれば更新するかも。
個別の処理の説明は秋新番が出揃った後、時間に余裕があれば加筆予定。(こういう表現の時はやらない可能性が高い)
2008年10月11日土曜日
番外 MXのL字を消してみよう
この記事は半分ギャグのような力技なので使わないで下さい。
もう少しまともなアプローチの改良版はこちらにあります。
MXの速報がテロップからL字に変わってアニメ放送中のL字に何度も遭遇しているけれど、最初に調べたR.O.Dの時にも書いた通り、多少問題はあっても及第点程度の絵には戻すことはできるはず、というところで実験で作ったものを参考に書いておこう。動画加工に興味ない人はスルーして下さい。
MXのL字は、開始から30フィールドを使って少しずつ目的のサイズに伸びてきて、同様に30フィールドを使って少しずつ隠れていきます。L字中はすべてフィールドごとに処理されている状態のため、開始後の30フィールドと終了前の30フィールド以外は同じ処理で問題なし。
L字の大きさが変わるところは1フィールドずつ状態が異なるので、だったら1フィールドずつそれなりの絵になるようにリサイズしてやればいいだけ、という単純なアプローチで元の絵に近い状態に復元してしまおう。
L字の開始位置と終了位置を指定することで、間のフィールドを全部元のサイズにしてしまう処理をAvisynthで関数化したもの。
function DeLetterL_sub(clip "c", int "cl", int "cb", int "s", int "e")
{
e = default(e, s)
t = c.trim(s, e)
return t.crop(cl, 0, 0, -cb).Lanczos4Resize(1440, 540)
}
function DeLetterL(clip "c", int "s", int "e")
{
i0 = DeLetterL_sub(c, 6, 2, s+0)
i1 = DeLetterL_sub(c, 12, 4, s+1)
i2 = DeLetterL_sub(c, 18, 7, s+2)
i3 = DeLetterL_sub(c, 24, 9, s+3)
i4 = DeLetterL_sub(c, 30, 11, s+4)
i5 = DeLetterL_sub(c, 36, 13, s+5)
i6 = DeLetterL_sub(c, 41, 15, s+6)
i7 = DeLetterL_sub(c, 47, 17, s+7)
i8 = DeLetterL_sub(c, 53, 19, s+8)
i9 = DeLetterL_sub(c, 59, 22, s+9)
inpart1 = i0+i1+i2+i3+i4+i5+i6+i7+i8+i9
i10 = DeLetterL_sub(c, 65, 24, s+10)
i11 = DeLetterL_sub(c, 71, 26, s+11)
i12 = DeLetterL_sub(c, 76, 28, s+12)
i13 = DeLetterL_sub(c, 82, 30, s+13)
i14 = DeLetterL_sub(c, 88, 33, s+14)
i15 = DeLetterL_sub(c, 94, 35, s+15)
i16 = DeLetterL_sub(c, 100, 37, s+16)
i17 = DeLetterL_sub(c, 106, 39, s+17)
i18 = DeLetterL_sub(c, 111, 41, s+18)
i19 = DeLetterL_sub(c, 117, 43, s+19)
inpart2 = i10+i11+i12+i13+i14+i15+i16+i17+i18+i19
i20 = DeLetterL_sub(c, 123, 46, s+20)
i21 = DeLetterL_sub(c, 129, 48, s+21)
i22 = DeLetterL_sub(c, 135, 50, s+22)
i23 = DeLetterL_sub(c, 141, 52, s+23)
i24 = DeLetterL_sub(c, 146, 54, s+24)
i25 = DeLetterL_sub(c, 152, 56, s+25)
i26 = DeLetterL_sub(c, 158, 59, s+26)
i27 = DeLetterL_sub(c, 164, 61, s+27)
i28 = DeLetterL_sub(c, 170, 63, s+28)
i29 = DeLetterL_sub(c, 175, 65, s+29)
inpart3 = i20+i21+i22+i23+i24+i25+i26+i27+i28+i29
inpart = inpart1+inpart2+inpart3
lpart = DeLetterL_sub(c, 181, 67, s+30, e - 30)
o0 = DeLetterL_sub(c, 175, 65, e-29)
o1 = DeLetterL_sub(c, 170, 63, e-28)
o2 = DeLetterL_sub(c, 164, 61, e-27)
o3 = DeLetterL_sub(c, 158, 59, e-26)
o4 = DeLetterL_sub(c, 152, 56, e-25)
o5 = DeLetterL_sub(c, 146, 54, e-24)
o6 = DeLetterL_sub(c, 141, 52, e-23)
o7 = DeLetterL_sub(c, 135, 50, e-22)
o8 = DeLetterL_sub(c, 129, 48, e-21)
o9 = DeLetterL_sub(c, 123, 46, e-20)
outpart1 = o0+o1+o2+o3+o4+o5+o6+o7+o8+o9
o10 = DeLetterL_sub(c, 117, 43, e-19)
o11 = DeLetterL_sub(c, 111, 41, e-18)
o12 = DeLetterL_sub(c, 106, 39, e-17)
o13 = DeLetterL_sub(c, 100, 37, e-16)
o14 = DeLetterL_sub(c, 94, 35, e-15)
o15 = DeLetterL_sub(c, 88, 33, e-14)
o16 = DeLetterL_sub(c, 82, 30, e-13)
o17 = DeLetterL_sub(c, 76, 28, e-12)
o18 = DeLetterL_sub(c, 71, 26, e-11)
o19 = DeLetterL_sub(c, 65, 24, e-10)
outpart2 = o10+o11+o12+o13+o14+o15+o16+o17+o18+o19
o20 = DeLetterL_sub(c, 59, 22, e-9)
o21 = DeLetterL_sub(c, 53, 19, e-8)
o22 = DeLetterL_sub(c, 47, 17, e-7)
o23 = DeLetterL_sub(c, 41, 15, e-6)
o24 = DeLetterL_sub(c, 36, 13, e-5)
o25 = DeLetterL_sub(c, 30, 11, e-4)
o26 = DeLetterL_sub(c, 24, 9, e-3)
o27 = DeLetterL_sub(c, 18, 7, e-2)
o28 = DeLetterL_sub(c, 12, 4, e-1)
o29 = DeLetterL_sub(c, 6, 2, e-0)
outpart3 = o20+o21+o22+o23+o24+o25+o26+o27+o28+o29
outpart = outpart1+outpart2+outpart3
return c.trim(0, s-1)+inpart+lpart+outpart+c.trim(e+1, 0)
}
力技らしく思いっきり冗長で、諸事情で無駄もあるけれど、使い方はフィールドオーダーが正しいことを確認した上で、フィルードに分け、L字の範囲をフィールドの位置で指定して、戻すだけ。
#
separatefields()
ConvertToRGB24()
DeLetterL(45980, 51168)
ConvertToYUY2()
weave()
#インタレ解除とかは後で
劣化覚悟でRGB化するのは微妙なサイズからのリサイズになるため。全体をこれで処理するとよろしくないので、L字の始まるカットの冒頭から、終了のカットの終わるところまでを切り出した上で処理した方が無難かな。45980と51168の数字は先週のかんなぎ@MXの番組の最初を0フレームとした場合の数字なので、同じところで切れば2~4程度の補正で合うはず。
やってみるとわかるけれど、この処理の後でもL字が少し残った状態になる。というのもL字が元の映像の一部にかぶってしまっているためで、この範囲は少し余分に切り取って誤魔化すとか、さらに面倒な作業も必要だったりするので覚悟の上でのチャレンジがおすすめ。今まで確認した限り、MXのL字は常に同じ挙動なので、他でも開始、終了位置を変えるだけで使えます。
フィールドごとのリサイズの数字はTSで適当に調整したものですが、1440x1080でのキャプであれば、変更は不要のはず。この数字も調整が少し雑なので、さらに微調整することでもっとよい状態にもできると思います。
もう少しまともなアプローチの改良版はこちらにあります。
MXの速報がテロップからL字に変わってアニメ放送中のL字に何度も遭遇しているけれど、最初に調べたR.O.Dの時にも書いた通り、多少問題はあっても及第点程度の絵には戻すことはできるはず、というところで実験で作ったものを参考に書いておこう。動画加工に興味ない人はスルーして下さい。
MXのL字は、開始から30フィールドを使って少しずつ目的のサイズに伸びてきて、同様に30フィールドを使って少しずつ隠れていきます。L字中はすべてフィールドごとに処理されている状態のため、開始後の30フィールドと終了前の30フィールド以外は同じ処理で問題なし。
L字の大きさが変わるところは1フィールドずつ状態が異なるので、だったら1フィールドずつそれなりの絵になるようにリサイズしてやればいいだけ、という単純なアプローチで元の絵に近い状態に復元してしまおう。
L字の開始位置と終了位置を指定することで、間のフィールドを全部元のサイズにしてしまう処理をAvisynthで関数化したもの。
function DeLetterL_sub(clip "c", int "cl", int "cb", int "s", int "e")
{
e = default(e, s)
t = c.trim(s, e)
return t.crop(cl, 0, 0, -cb).Lanczos4Resize(1440, 540)
}
function DeLetterL(clip "c", int "s", int "e")
{
i0 = DeLetterL_sub(c, 6, 2, s+0)
i1 = DeLetterL_sub(c, 12, 4, s+1)
i2 = DeLetterL_sub(c, 18, 7, s+2)
i3 = DeLetterL_sub(c, 24, 9, s+3)
i4 = DeLetterL_sub(c, 30, 11, s+4)
i5 = DeLetterL_sub(c, 36, 13, s+5)
i6 = DeLetterL_sub(c, 41, 15, s+6)
i7 = DeLetterL_sub(c, 47, 17, s+7)
i8 = DeLetterL_sub(c, 53, 19, s+8)
i9 = DeLetterL_sub(c, 59, 22, s+9)
inpart1 = i0+i1+i2+i3+i4+i5+i6+i7+i8+i9
i10 = DeLetterL_sub(c, 65, 24, s+10)
i11 = DeLetterL_sub(c, 71, 26, s+11)
i12 = DeLetterL_sub(c, 76, 28, s+12)
i13 = DeLetterL_sub(c, 82, 30, s+13)
i14 = DeLetterL_sub(c, 88, 33, s+14)
i15 = DeLetterL_sub(c, 94, 35, s+15)
i16 = DeLetterL_sub(c, 100, 37, s+16)
i17 = DeLetterL_sub(c, 106, 39, s+17)
i18 = DeLetterL_sub(c, 111, 41, s+18)
i19 = DeLetterL_sub(c, 117, 43, s+19)
inpart2 = i10+i11+i12+i13+i14+i15+i16+i17+i18+i19
i20 = DeLetterL_sub(c, 123, 46, s+20)
i21 = DeLetterL_sub(c, 129, 48, s+21)
i22 = DeLetterL_sub(c, 135, 50, s+22)
i23 = DeLetterL_sub(c, 141, 52, s+23)
i24 = DeLetterL_sub(c, 146, 54, s+24)
i25 = DeLetterL_sub(c, 152, 56, s+25)
i26 = DeLetterL_sub(c, 158, 59, s+26)
i27 = DeLetterL_sub(c, 164, 61, s+27)
i28 = DeLetterL_sub(c, 170, 63, s+28)
i29 = DeLetterL_sub(c, 175, 65, s+29)
inpart3 = i20+i21+i22+i23+i24+i25+i26+i27+i28+i29
inpart = inpart1+inpart2+inpart3
lpart = DeLetterL_sub(c, 181, 67, s+30, e - 30)
o0 = DeLetterL_sub(c, 175, 65, e-29)
o1 = DeLetterL_sub(c, 170, 63, e-28)
o2 = DeLetterL_sub(c, 164, 61, e-27)
o3 = DeLetterL_sub(c, 158, 59, e-26)
o4 = DeLetterL_sub(c, 152, 56, e-25)
o5 = DeLetterL_sub(c, 146, 54, e-24)
o6 = DeLetterL_sub(c, 141, 52, e-23)
o7 = DeLetterL_sub(c, 135, 50, e-22)
o8 = DeLetterL_sub(c, 129, 48, e-21)
o9 = DeLetterL_sub(c, 123, 46, e-20)
outpart1 = o0+o1+o2+o3+o4+o5+o6+o7+o8+o9
o10 = DeLetterL_sub(c, 117, 43, e-19)
o11 = DeLetterL_sub(c, 111, 41, e-18)
o12 = DeLetterL_sub(c, 106, 39, e-17)
o13 = DeLetterL_sub(c, 100, 37, e-16)
o14 = DeLetterL_sub(c, 94, 35, e-15)
o15 = DeLetterL_sub(c, 88, 33, e-14)
o16 = DeLetterL_sub(c, 82, 30, e-13)
o17 = DeLetterL_sub(c, 76, 28, e-12)
o18 = DeLetterL_sub(c, 71, 26, e-11)
o19 = DeLetterL_sub(c, 65, 24, e-10)
outpart2 = o10+o11+o12+o13+o14+o15+o16+o17+o18+o19
o20 = DeLetterL_sub(c, 59, 22, e-9)
o21 = DeLetterL_sub(c, 53, 19, e-8)
o22 = DeLetterL_sub(c, 47, 17, e-7)
o23 = DeLetterL_sub(c, 41, 15, e-6)
o24 = DeLetterL_sub(c, 36, 13, e-5)
o25 = DeLetterL_sub(c, 30, 11, e-4)
o26 = DeLetterL_sub(c, 24, 9, e-3)
o27 = DeLetterL_sub(c, 18, 7, e-2)
o28 = DeLetterL_sub(c, 12, 4, e-1)
o29 = DeLetterL_sub(c, 6, 2, e-0)
outpart3 = o20+o21+o22+o23+o24+o25+o26+o27+o28+o29
outpart = outpart1+outpart2+outpart3
return c.trim(0, s-1)+inpart+lpart+outpart+c.trim(e+1, 0)
}
力技らしく思いっきり冗長で、諸事情で無駄もあるけれど、使い方はフィールドオーダーが正しいことを確認した上で、フィルードに分け、L字の範囲をフィールドの位置で指定して、戻すだけ。
#
separatefields()
ConvertToRGB24()
DeLetterL(45980, 51168)
ConvertToYUY2()
weave()
#インタレ解除とかは後で
劣化覚悟でRGB化するのは微妙なサイズからのリサイズになるため。全体をこれで処理するとよろしくないので、L字の始まるカットの冒頭から、終了のカットの終わるところまでを切り出した上で処理した方が無難かな。45980と51168の数字は先週のかんなぎ@MXの番組の最初を0フレームとした場合の数字なので、同じところで切れば2~4程度の補正で合うはず。
やってみるとわかるけれど、この処理の後でもL字が少し残った状態になる。というのもL字が元の映像の一部にかぶってしまっているためで、この範囲は少し余分に切り取って誤魔化すとか、さらに面倒な作業も必要だったりするので覚悟の上でのチャレンジがおすすめ。今まで確認した限り、MXのL字は常に同じ挙動なので、他でも開始、終了位置を変えるだけで使えます。
フィールドごとのリサイズの数字はTSで適当に調整したものですが、1440x1080でのキャプであれば、変更は不要のはず。この数字も調整が少し雑なので、さらに微調整することでもっとよい状態にもできると思います。
登録:
投稿 (Atom)