Skip to content

Inverse Telecine Filters

Nekopanda edited this page Nov 23, 2018 · 14 revisions

KFM(KFM.dll)の逆テレシネ関連フィルタ

KFMPad(clip)

解析用にpaddingしたクリップ(KFMSuper等の入力に必要)

  • CUDA対応: Yes
  • clip
    • ソースクリップ

KFMSuper(clip, clip)

フィールドマッチング解析クリップ(KPreCycleAnalyze等の入力に必要)

  • CUDA対応: Yes
  • clip
    • ソースクリップ
  • clip
    • ソースクリップをKFMPadしたクリップ

KCleanSuper(clip, int "thY", int "thC")

KFMSuperから動きのない部分の縞を削除する

  • CUDA対応: Yes
  • clip
    • KFMSuperクリップ
  • int thY = 10
    • 縞を消すY成分の動きしきい値
  • int thC = 8
    • 縞を消すChroma成分の動きしきい値

KPreCycleAnalyze(clip, int "threshMY", int "threshSY", int "threshMC", int "threshSC")

フレームごとのフィールドマッチング値を計算(旧バージョンのKFMFrameAnalyzeに相当するフィルタ)

  • CUDA対応: Yes
  • clip
    • KFMSuperクリップ
  • int threshMY = 20
    • Y成分の動きしきい値
  • int threshSY = 12
    • Y成分の縞しきい値
  • int threshMC = 24
    • Chroma成分の動きしきい値
  • int threshSC = 16
    • Chroma成分の縞しきい値

KFMSuperShow(clip, int "threshMY", int "threshSY", int "threshMC", int "threshSC")

KFMSuperの可視化デバッグ用フィルタ。計算はKPreCycleAnalyzeと同じだが、可視化されたクリップを出力する。

  • CUDA対応: No
  • 引数はKPreCycleAnalyzeと同じなので説明は省略

KFMDumpFM(clip, string "filepath")

KPreCycleAnalyzeの結果をファイル出力。最後のフレームを出力するとファイル出力が完了する。

  • CUDA対応: No
  • clip
    • KPreCycleAnalyzeクリップ
  • string filepath = "kfm.txt"
    • 出力ファイルパス

出力はテキストファイルで以下の形式

#shima,large shima,move
<shima>,<large shima>,<move>
<shima>,<large shima>,<move>
...

N行目(最初のコメント行は除く)のshimaとlarge shimaは、ソースをDoubleWeave()したクリップのN番目のフレームの縞の数。large shimaの方はしきい値がshimaの3倍で判定された大きな(=よりはっきりした)縞の数。 N行目のmoveは、ソースをSeparateFields()したクリップのN番目のフレームとN+2番目のフレームの差分。

使用例

LWLibavVideoSource(srcpath,dominance=1,repeat=True).OnCPU(4)
KFMSuper(KFMPad()).KCleanSuper().KPreCycleAnalyze().OnCUDA(4).KFMDumpFM("kfm_dump.txt")

KFMCycleAnalyze(clip, clip, int "mode", float "lscale", float "costth", float "adj2224", float "adj30", int "range", float "thresh", int "past", float "th60", float "th24", float "rel24", string "filepath", int "debug")

KPreCycleAnalyzeの結果から、プルダウンパターンをサイクルごとに判定

  • CUDA対応: No
  • clip
    • KPreCycleAnalyzeクリップ
  • clip
    • ソースクリップ
  • int mode = 0
    • 0: 通常(リアルタイム最良)
    • 1: マルチパスの1パス目(出力はリアルタイム最良)
      • マルチパスは前後のパターンからの推定を使ってパターンを安定化させる効果がある。1パス目は判定結果を蓄積して、2パス目で前後のパターンも考慮した結果を出力する。1パス目は最後のフレームまで出力する必要がある。
    • 2: マルチパスの2パス目(前後のパターンも考慮した結果を出力)
    • デフォルト: 0
  • float lscale = 5.0
    • 大きい縞(KFMFrameAnalyzeで縞しきい値の3倍以上ある縞)を加味するときの係数。大きいほど「大きい縞」を重要視する。
  • float costth = 1.5
    • 24p判定コスト閾値。大きいと判定が厳しくなり、コストの数値が大きくなる
  • float adj2224 = 0.5
    • 縞なし24fpsの重み付け(数値を大きくすると縞なし24fpsパターンが選ばれにくくなり、小さいと選ばれやすくなる)
  • float adj30 = 1.5
    • 30fpsの重み付け(数値を大きくすると30fpsパターンが選ばれにくくなり、小さいと選ばれやすくなる) 以下、マルチパス用のパラメータです。
  • int range = 5
  • float thresh = 1.0
    • この2つはパターン切り替え判定のパラメータです。パターン切り替えは、(現在のサイクルを含む過去range個のサイクルのコストの和) > (thresh * range)のときに発生する。1サイクルは30fpsで5フレーム分です。
    • 縞なし24fpsと30fpsが適切に切り替わるには adj2224 < thresh < adj30 にする必要がある。
  • int past = 180
    • パターン切替時に、過去のパターンも、切り替え後のパターンが最良パターンと同じなら、変更する。このときに遡って適用するサイクル数です。
  • float th60 = 3.0
  • float th24 = 0.1
  • float rel24 = 0.2
    • この3つは、60fps判定用のパラメータです。以下のように判定する。
      • コストがth60以上なら60fps
      • コストがth24以下かつ非信頼度がrel24以下なら24fps
      • それ以外は前後から推定
  • string filepath = "kfm_cycle.dat"
    • マルチパスでは、1パス目の結果をファイル出力して、2パス目でそのファイルを読む。ファイル出力するファイル名です。
  • int debug = 0
    • デバッグ&パラメータ調整用です。1にすると、1パス目の判定途中データを"(filepath).debug"に、最終判定結果を"(filepath).pattern"に出力する。

KTelecine(clip, clip, bool "show")

KFMCycleAnalyzeの結果から、ソースクリップを逆テレシネ変換する。

  • CUDA対応: Yes
  • clip
    • ソースクリップ
  • clip
    • KFMCycleAnalyzeクリップ
  • bool show = false
    • 左上に判定結果を表示

KTelecineSuper(clip, clip)

KFMCycleAnalyzeの結果から、KFMSuperクリップを逆テレシネ変換する。

  • CUDA対応: Yes
  • clip
    • KFMSuperクリップ
  • clip
    • KFMCycleAnalyzeクリップ

KSwitchFlag(clip, float "thY", float "thC")

KTelecineクリップで縞が残った部分をbobクリップから貼り付けるためのフラグを作成

  • CUDA対応: Yes
  • clip
    • KTelecineSuperクリップ
  • float thY = 60
    • Y成分の縞閾値(大きいと縞判定部分が小さくなり、小さいと大きくなる)
  • float thC = 80
    • UV成分の縞閾値(大きいと縞判定部分が小さくなり、小さいと大きくなる)

KContainsCombe(clip)

KSwitchFlagクリップでbobクリップから貼り付ける部分があるかどうかを返すクリップ

  • CUDA対応: Yes
  • clip
    • KSwitchFlagクリップ

KCombeMask(clip, clip)

KSwitchFlagをマスク化するフィルタ

  • CUDA対応: Yes
  • clip
    • ソースクリップ(画面サイズなどの情報だけ取得するのに使う)
  • clip
    • KSwitchFlagクリップ

KRemoveCombe(clip, clip, float "thY", float "thC")

しきい値以上の縞部分をブレンドにより縞除去する

  • CUDA対応: Yes
  • clip
    • KFMPadした24pクリップ
  • clip
    • KTelecineSuperクリップ(縞判定に使う)
  • float thY= 6
    • Y成分の縞判定しきい値。この値が小さいと、より広範囲を縞ありと判定し、除去する。
  • float thC= 6
    • UV成分の縞判定しきい値。この値が小さいと、より広範囲を縞ありと判定し、除去する。

KPatchCombe(clip, clip, clip, clip, clip)

KTelecineクリップの縞部分をbobクリップに置き換え

  • CUDA対応: Yes
  • clip
    • 24pクリップ
  • clip
    • 60pクリップ
  • clip
    • KFMCycleAnalyzeクリップ
  • clip
    • KCombeMaskクリップ
  • clip
    • KContainsCombeクリップ

KFMSwitch(clip, clip, clip, clip, clip, clip "ucfclip", float "thresh", int "mode", string "filepath", bool "show", bool "showflag")

60pフレームと30pフレームと24pフレームを切り替える。出力は60p固定。

  • CUDA対応: Yes
  • clip
    • 60pクリップ
  • clip
    • KFMCycleAnalyzeクリップ
  • clip
    • 24pクリップ
  • clip
    • 24pのKCombeMaskクリップ
  • clip
    • 24pのKContainsCombeクリップ
  • clip
    • 30pクリップ
  • clip
    • 30pのKCombeMaskクリップ
  • clip
    • 30pのKContainsCombeクリップ
  • clip
    • KDecombUCF60クリップ
  • float thswitch = 3.0
    • 60pと24p/30pを切り替えるしきい値。KFMCycleAnalyzeが出力する24p/30pコスト(大きいほど24p/30pでない可能性が高い)を元に、しきい値を超えるサイクルは60pフレーム、しきい値以下のサイクルは24p/30pフレームを出力する。
  • int mode = 0
    • 0: 通常出力
    • 1: フレームにフレーム継続時間を付加して出力(VFR用)
    • 2: フレーム継続時間のみ出力(VFR用)
    • デフォルト: 0
  • string filepath = "kfmswitch"
    • VFR情報出力ファイルパス
      • タイムコードは filepath + "timecode.txt" に、フレーム継続時間は filepath + "duration.txt" に出力される。
  • bool show = false
    • 判定結果を左上に表示する
  • bool showflag = false
    • 24p/30p判定されたフレームで、60pフレームから取得される部分を青く表示する。(CUDA非対応)

KFMDecimate(clip, string "filepath")

フレーム継続時間を元に60pクリップから有効フレームのみ抽出。

  • CUDA対応: Yes
  • clip
    • 60pクリップ
  • string filepath = "kfmswitch"
    • KFMSwitchの出力したVFR情報ファイルのパス
      • VFR情報のうちフレーム継続時間(filepath + "duration.txt")を読む