代码: 全选
# Motion-Compensate Any Temporal (Spatial-Temporal) Denoiser
#
# v0.3 by Holy 2011-08-13
#
# 本腳本未預設任何Denoiser,須由使用者自行代入欲借助動態補償的Temporal (Spatial-Temporal) Denoiser
#
#
# 適用對象:覺得壓制速度還不夠慢的人(誤
#
# 所需插件:MVTools2
# FFT3DGPU或FFT3DFilter
# flash3kyuu_deband
#
# 範例:MCAnyTempDenoiser(denoiser="dfttest(tbsize=3, dither=2)")
#
#
# v0.1: 初始發布
# v0.2: 新增search參數
# v0.3: 新增dct參數並改預設值為0
# 改用flash3kyuu_deband取代GradFun2db
function MCAnyTempDenoiser(clip input, string "denoiser", int "radius", bool "interlaced", bool "GPU", int "ncpu", int "pel", int "search", int "dct", clip "p") {
denoiser = Default(denoiser, "empty") # 欲使用的Temporal (Spatial-Temporal) Denoiser
radius = Default(radius, 1) # 前後幀的半徑範圍 [1-5]
# 例如:dfttest的tbsize=5,則radius=2
# FFT3DGPU的bt=3,則radius=1,暫不支援bt=2或bt=4這種前後幀不相等的模式
interlaced = Default(interlaced, false) # 輸入視訊是否為交錯
GPU = Default(GPU, true) # 使用FFT3DGPU或FFT3DFilter做pre-filtering,或者以參數p指定pre-filtered clip
ncpu = Default(ncpu, 1) # FFT3DFilter使用的CPU執行緒數
pel = Default(pel, 2) # 動態估算的精確度 [1-2]
# 1: a precision to the pixel (less accurate but faster)
# 2: a precision to half a pixel (more accurate but slower)
search = Default(search, 4) # 搜尋動態向量的方法,0和1不建議使用所以沒列出來 [2-5]
# 2: Diamond search
# 3: Exhaustive search
# 4: Hexagon search
# 5: Uneven Multi Hexagon (UMH) search
dct = Default(dct, 0) # 想追求更高品質可以嘗試dct=5 [0-10]
# using of block DCT (frequency spectrum) for blocks difference (SAD) calculation. In particular it can improve motion vector estimation at luma flicker and fades
# 0: usual spatial blocks, do not use DCT
# 1: use block DCT instead of spatial data (slow for block size 8x8 and very slow for other sizes)
# 2: mixed spatial and DCT data; weight is dependent on mean frame luma difference
# 3: adaptive per-block switching from spatial to equal-weighted mixed mode (experimental, a little faster)
# 4: adaptive per-block switching from spatial to mixed mode with more weight of DCT (experimental, a little faster)
# 5: SATD instead of SAD for luma
# 6: same as 2 only use SATD
# 7: same as 3 only use SATD
# 8: same as 4 only use SATD
# 9: similar to 2, use SATD and weight ranges from SAD only to equal SAD & SATD
# 10: similar to 3/4,use SATD weight is on SAD, only on strong luma changes
Assert(input.IsYV12(), "This is not an YV12 clip! Please convert color space to YV12 before using MCAnyTempDenoiser()")
Assert(denoiser != "empty", "'denoiser' have not been set!")
Assert(radius >= 1 && radius <= 5, "'radius' have not a correct value! [1-5]")
Assert(ncpu >= 1, "'ncpu' have not a correct value! [>=1]")
Assert(pel >= 1 && pel <= 2, "'pel' have not a correct value! [1-2]")
Assert(search >= 2 && search <= 5, "'search' have not a correct value! [2-5]")
Assert(dct >= 0 && dct <= 10, "'dct' have not a correct value! [0-10]")
input = (interlaced) ? input.SeparateFields() : input
blksize = (input.Width() > 1024) ? 16 : 8
overlap = blksize/2
p = Defined(p) ? p
\ : (GPU) ? input.FFT3DGPU(sigma=3.2, sigma2=2.4, sigma3=1.6, sigma4=0.8, bw=blksize, bh=blksize, ow=overlap, oh=overlap, precision=2).flash3kyuu_deband(Cb=0, Cr=0, ditherY=0, ditherC=0, sample_mode=2)
\ : input.FFT3DFilter(sigma=3.2, sigma2=2.4, sigma3=1.6, sigma4=0.8, bw=blksize, bh=blksize, ow=overlap, oh=overlap, ncpu=ncpu).flash3kyuu_deband(Cb=0, Cr=0, ditherY=0, ditherC=0, sample_mode=2)
pSuper = p.MSuper(pel=pel)
backward_vec5 = (radius == 5) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=true, delta=5, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
backward_vec4 = (radius >= 4) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=true, delta=4, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
backward_vec3 = (radius >= 3) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=true, delta=3, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
backward_vec2 = (radius >= 2) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=true, delta=2, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
backward_vec1 = MAnalyse(pSuper, blksize=blksize, search=search, isb=true, delta=1, truemotion=false, global=true, overlap=overlap, dct=dct)
forward_vec1 = MAnalyse(pSuper, blksize=blksize, search=search, isb=false, delta=1, truemotion=false, global=true, overlap=overlap, dct=dct)
forward_vec2 = (radius >= 2) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=false, delta=2, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
forward_vec3 = (radius >= 3) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=false, delta=3, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
forward_vec4 = (radius >= 4) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=false, delta=4, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
forward_vec5 = (radius == 5) ? MAnalyse(pSuper, blksize=blksize, search=search, isb=false, delta=5, truemotion=false, global=true, overlap=overlap, dct=dct) : NOP()
iSuper = input.MSuper(pel=pel, levels=1)
backward_comp5 = (radius == 5) ? input.MCompensate(iSuper, backward_vec5, thSCD1=300, thSCD2=100) : NOP()
backward_comp4 = (radius >= 4) ? input.MCompensate(iSuper, backward_vec4, thSCD1=300, thSCD2=100) : NOP()
backward_comp3 = (radius >= 3) ? input.MCompensate(iSuper, backward_vec3, thSCD1=300, thSCD2=100) : NOP()
backward_comp2 = (radius >= 2) ? input.MCompensate(iSuper, backward_vec2, thSCD1=300, thSCD2=100) : NOP()
backward_comp1 = input.MCompensate(iSuper, backward_vec1, thSCD1=300, thSCD2=100)
forward_comp1 = input.MCompensate(iSuper, forward_vec1, thSCD1=300, thSCD2=100)
forward_comp2 = (radius >= 2) ? input.MCompensate(iSuper, forward_vec2, thSCD1=300, thSCD2=100) : NOP()
forward_comp3 = (radius >= 3) ? input.MCompensate(iSuper, forward_vec3, thSCD1=300, thSCD2=100) : NOP()
forward_comp4 = (radius >= 4) ? input.MCompensate(iSuper, forward_vec4, thSCD1=300, thSCD2=100) : NOP()
forward_comp5 = (radius == 5) ? input.MCompensate(iSuper, forward_vec5, thSCD1=300, thSCD2=100) : NOP()
interleaved = (radius == 5) ? Interleave(forward_comp5, forward_comp4, forward_comp3, forward_comp2, forward_comp1, input, backward_comp1, backward_comp2, backward_comp3, backward_comp4, backward_comp5)
\ : (radius == 4) ? Interleave(forward_comp4, forward_comp3, forward_comp2, forward_comp1, input, backward_comp1, backward_comp2, backward_comp3, backward_comp4)
\ : (radius == 3) ? Interleave(forward_comp3, forward_comp2, forward_comp1, input, backward_comp1, backward_comp2, backward_comp3)
\ : (radius == 2) ? Interleave(forward_comp2, forward_comp1, input, backward_comp1, backward_comp2)
\ : Interleave(forward_comp1, input, backward_comp1)
output = Eval("interleaved." + denoiser)
output = output.SelectEvery(radius*2+1, radius)
return (interlaced) ? output.Weave() : output
}
部分參考自MCTemporalDenoise
可能有用,也可能沒用(死
補充:
若提示MAnalyse找不到FFTW3.DLL,請至http://www.fftw.org/install/windows.html下載Precompiled Windows DLL,解壓縮後將libfftw3f-3.dll重新命名為fftw3.dll,32位元系統丟到C:\Windows\System32,64位元系統丟到C:\Windows\SysWOW64