Skip to content

DecombUCF

Nekopanda edited this page Nov 23, 2018 · 15 revisions

KFM(KFM.dll)のシーンチェンジ周辺のフレーム置き換えフィルタ

ちょっとだけさんのDecombUCFを参考に、シーンチェンジをマージしたり、CUDA化したりしたフィルタ。

KNoiseClip(clip, clip, int "nmin_y", int "range_y", int "nmin_uv", int "range_uv")

DecombUCF用ノイズ解析前処理フィルタ

  • clip
    • ソースクリップ
  • clip
    • ノイズ検出用クリップ(ソースクリップにガウシアンフィルタ等を掛けたクリップ)
  • int nmin_y = 1
  • int range_y = 128
  • int nmin_uv = 1
  • int range_uv = 128

KAnalyzeNoise(clip, clip, clip "pad")

DecombUCF用ノイズ解析フィルタ

  • CUDA対応: Yes
  • clip
    • ソースクリップ
  • clip
    • KNoiseClipクリップ
  • clip "pad"
    • KFMPadクリップ

KDecombUCFParam(int "chroma", float "fd_thresh", int "th_mode", float "off_t", float "off_b", float "namax_thresh", float "namax_diff", float "nrt1y", float "nrt2y", float "nrt2x", float "nrw", bool "show", float "y1", float "y2", float "y3", float "y4", float "y5", float "x1", float "x2", float "x3", float "x4", float "x5")

DecombUCFのパラメータクリップ

  • CUDA対応: -

  • int chroma = 1

    • [0-2] #(0:Y),(1:UV),(2:YUV) for noise detection
  • float fd_thresh = 128

    • [0-] #threshold of FieldDiff #fd_thresh = FieldDiff * 100 / (Width * Height)
  • int th_mode = 0

    • [1-2:debug][3-7:normal][8-10:restricted] #preset of diff threshold. you can also specify threshold by x1-x5 y1-y5(need th_mode=0).
  • float off_t = 0

    • offset for diff threshold of top field (first field, top,diff<0)
  • float off_b = 0

    • offset for diff threshold of bottom field (second field, botom, 0<diff)
  • reverse (chroma=0のみで機能。ノイズ量の絶対値が多過ぎる場合、映像効果と考えノイズの大きいフィールドを残す(小さいほうはブロックノイズによる平坦化))

    • int namax_thresh = 82
      • 82 #MX:90 #[0-256] #disabled with chroma=1 #upper limit of max noise for Noise detaction (75-80-83)
    • int namax_diff = 38
      • 30-40 #disabled with chroma=1 #If average noise >= namax_thresh, use namax_diff as diff threshold.
  • NR

    • float nrt1y = 28
      • 28-29-30 #threshold for nr
    • float nrt2y = 36
      • 36-36.5-37 #exclusion range
    • float nrt2x = 53.5
      • 53-54-55 #exclusion range
    • float nrw = 2
      • 1-2 #diff weight for nr threshold
  • bool show = false

    • デバッグ用表示をオンにする(実際の挙動は各フィルタによって異なる)
  • float y1, y2, y3, y4, y5, x1, x2, x3, x4, x5

    • スコア計算パラメータ

KDecombUCF(clip, clip, clip, clip, clip, clip "nr")

24pクリップを分析して24pクリップに適用するフィルタ(オリジナルと同等)

  • CUDA対応: Yes
  • clip
    • 適用対象24pクリップ
  • clip
    • KDecombUCFParamクリップ
  • clip
    • KAnalyzeNoiseクリップ
  • clip
    • bobクリップ(次のフィールドが汚いとき用)
  • clip
    • bobクリップ(前のフィールドが汚いとき用)
  • clip "nr"
    • NRクリップ(オプション)

bobクリップが2つあるのは、QTGMCのような前後のフィールドから補間するbobフィルタを想定しているからである。つまり、汚いフィールドを避けるために前のフィールドを選んだとしても、前後のフィールドから補間するアルゴリズムの性質上、汚いフィールドも混ざることになる。汚いフィールドが混ざるのを避けるために、次のフィールドを使わないで補間したクリップと、前のフィールドを使わないで補間したクリップの2つを入力して、適切にbobクリップを切り替えるようになっている。

ただし、オリジナルのQTGMCには、次のフィールドを使わない、あるいは、前のフィールドを使わない、というようなオプションは存在しない。KTGMCは、useFlagでこれを切り替えることができる。以下の使用例を参考にすると良い。

TODO

KDecombUCF24(clip, clip, clip, clip, clip, clip "nr")

60iクリップを分析して24pクリップに適用するフィルタ

  • CUDA対応: Yes
  • clip
    • 適用対象24pクリップ
  • clip
    • KDecombUCFParamクリップ
  • clip
    • KFMCycleAnalyzeクリップ
  • clip
    • KAnalyzeNoiseクリップ
  • clip
    • bobクリップ(次のフィールドが汚いとき用)
  • clip
    • bobクリップ(前のフィールドが汚いとき用)
  • clip "nr"
    • NRクリップ(オプション)

TODO

KDecombUCF60(clip, clip, clip, clip, clip, clip "nr", float "sc_thresh", float "dup_factor")

60iクリップを分析して60pクリップに適用するフィルタ。

  • アルゴリズム

    • 大雑把に説明すると、一次判定にDecombUCFによるノイズ判定を使い、二次判定にシーンチェンジ判定を使っている。
      • 両方使うのは精度を高めるため
    • インターレースソースをDoubleWeaveした各フレームに対してDecombUCFによるノイズ判定を行う
      • 汚いと判定されたフィールドに対応するフレームを「汚いフレーム」とする
    • 汚いフレームが全て置き換えられるわけではなく、次の2つの条件を両方満たす場合のみ置き換えを行う
      • 汚いフレームがシーンチェンジ前後である
      • 置き換えに使用するフレームの前or後が静止している
        • 静止している場合はそのフレームが綺麗である確率が高い
        • 激しい動きの途中などはこれで弾かれる
    • さらに、汚いフレームの前後1フレームは、汚いフレームを避けるようにbobクリップが選択される
      • つまり、汚いフレームとその前後1フレームがbobクリップから取得されたフレームに置き換えられる
  • CUDA対応: Yes

  • clip

    • 適用対象60pクリップ
  • clip

    • KDecombUCFParamクリップ
  • clip

    • KAnalyzeNoiseクリップ
  • clip

    • bobクリップ(次のフィールドが汚いとき用)
  • clip

    • bobクリップ(前のフィールドが汚いとき用)
  • clip "nr"

    • NRクリップ(オプション)
  • float sc_thresh = 256

    • 置き換え対象フレームの前後がシーンチェンジかどうかの判定しきい値。小さくすると、より多くのフレームをシーンチェンジとみなすようになる。
  • float dup_factor = 2.5

    • 置き換えに使用するフレームの前後が静止しているかどうかを判定するしきい値。小さくすると、より多くのフレームを静止しているとみなすようになる。

srcpath = "..."
src = LWLibavVideoSource(srcpath,dominance=1,repeat=True).OnCPU(2)
bob = src.KTGMC(Preset="Faster")
before = src.KTGMC(Preset="Faster", PrevGlobals="Reuse", useFlag=1)
after = src.KTGMC(Preset="Faster", PrevGlobals="Reuse", useFlag=2)
fields = src.SeparateFields().Crop(4,4,-4,-4).Align()
noise = fields.KGaussResize(p=2.5)
noise = src.KAnalyzeNoise(fields.KNoiseClip(noise), src.KFMPad()).OnCUDA(2)
bob.KDecombUCF60(KDecombUCFParam(), noise, before, after).OnCUDA(2)