版面规则
提问时请注意:尽量详细描述操作过程、AVS脚本内容等,最好能写出片名,只贴图有时无法看出问题原因。
提示:发布原创内容请尽量使用附件上传。使用网盘会出现过期失效的问题,请注意。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

MStabilize v1.2 - 任意范围时域Smooth脚本

MStabilize v1.2
NMM碗柜:http://nmm.me/xd
我的所有avsi脚本所需滤镜(Requirements)打包下载:http://pan.baidu.com/s/1Bt2fY

简要说明
函数名MStabilize()

以Temporal Stabilize为目的的脚本,利用Trim和Dither_lutxyz8将前后任意范围内的3帧进行16bit精度的temporal blur(默认设置下radius=1),用Dither_limit_dif16限制改变量(默认设置下limit=4.00),可以利用motion mask、edge mask、temporal diff mask保护运动、边缘及变化较大的区域(默认设置下只使用motion mask和temporal diff mask)。

这脚本是为了处理这个帖子中遇到的问题而写的,也就是对付诸如画面静态部分轻微闪烁的情况,但参数(主要为mask相关)经过调整后应该也能用于更多情况,例如flicker等。
这个脚本有一个重要目的就是为了能较高速地处理那些帧跨度比较大的temporal问题,例如以4帧为周期的轻度闪烁(...a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4...)这时就适合于用MStabilize(radius=4)来处理。

注1:由于使用了Dither_lutxyz8这个24bit(3*8bit)输入16bit(2*8bit)输出的Lookup Table(查找表),并且利用Trim做temporal处理,所以运行脚本时的初始化时间会比较长,初始化结束后的运行速度就比较快了。
注2:MStabilize内部处理精度始终为16bit。而如果输入的clip为16bit,在MStabilize内部会先降到8bit然后才能处理(Dither_lutxyz8只接受8bit输入,输出16bit),但16bit输入clip的精度还是能在limit部分和mask部分有所保留。

原理:
pixel of [Frame N] = ( (pixel of [Frame N-radius])*wf + (pixel of [Frame N])*wc + (pixel of [Frame N+radius])*wb ) / (wf+wc+wb)

例子:
MStabilize(radius=1, wf=0.5, wc=1.0, wb=0.5, limit=255, lsb=false)时是将第n-1、n、n+1帧做Temporal Gaussian Blur后得到第n帧,同时不限制改变量。输入为8bit输出为8bit。
MStabilize(radius=3, wf=1.0, wc=1.0, wb=1.0, limit=2.5, lsb=true )时是将第n-3、n、n+3帧取平均(Average Blur)后得到第n帧,限制最大改变量为2.5(8bit scale)。输入为8bit输出为stacked 16bit。

具体的各个参数说明详见脚本内部,不再赘述了。

YUV平面的设置
Y/U/V三个参数控制是否处理各个平面,3为处理,2为不处理,1为完全不管输出的结果。默认Y=3、U=2、V=2,也就是只处理Y平面。

输入输出的设置
lsb_in默认false,决定输入的clip是否为16bit stack格式。
lsb默认false,决定输出的clip是否为16bit stack格式。(不影响速度,脚本内部始终16bit精度处理)
dither默认6,设置16bit降至8bit时使用的dither方式,等于DitherPost中的mode参数。
show默认false,设为true时输出Stabilize mask,可以用于帮助调整mask相关的参数。
v1.1增加clip型参数src,在多个MStabilize串接处理时可以用于指定limit所参考的源,具体用法见下方的例子。

example
如果是比较大radius的处理可以考虑多个MStabilize串接处理,radius递减,在最后一个MStabilize中指定src和limit来限制相对于源的最大改编量,这样应该能获得更稳定的结果。
设定MVGlobal=true来使各个MStabilize共用一个MV Super clip以减少重复运算。
可以配合MP_Pipeline以及它的prefetch、export clip使用,以提高各个滤镜处理的效率,例如:
MP_Pipeline("""

XXXSource("XXX.xxx")

### prefetch: 64, 32
### ###

SetMemoryMax(1000)

src = last

MStabilize(radius=7, limit=255, MVGlobal=true, lsb_in=false, lsb=true, Y=3, U=3, V=3)

### export clip: src, MS_MVS
### prefetch: 32, 16
### ###

SetMemoryMax(1000)

MStabilize(radius=4, limit=255, MVGlobal=true, lsb_in=true, lsb=true, Y=3, U=3, V=3)

### export clip: src, MS_MVS
### prefetch: 16, 8
### ###

SetMemoryMax(1000)

last.MStabilize(src.Dither_convert_8_to_16, radius=1, limit=3.00, MVGlobal=true, lsb_in=true, lsb=true, Y=3, U=3, V=3)

#DitherPost()
#Down10(stack=false)

""")
Changelog
v1.0
Release

v1.1
增加clip型参数src,在多个MStabilize串接处理时可以用于指定limit所参考的源,具体用法见上方的例子。

v1.2
2个严重bug修复,默认设置下不再处理U和V。
增加参数MVGlobal,设为true时可以使多个MStabilize共用一个MV Super clip以减少重复运算。
mask部分大幅度改进,几乎等于重写了,原先的motion mask大幅改进,新增edge mask和temporal diff mask,默认情况下使用motion mask和temporal diff mask。
上次由 mawen1250 在 2016-01-08 11:21,总共编辑 20 次。
littlepox
帖子: 116
注册时间: 2012-08-26 16:56

Re: MStabilize v1.0 - 任意范围时域Smooth脚本

“MStabilize内部处理精度始终为16bit,而如果输入16bit的clip在MStabilize内部会先降到8bit然后才能处理”

这段没怎么读懂。。。MStabilize 对于10bit/16bit 输入,先down到8bit,再dither到16bit处理?
littlepox
帖子: 116
注册时间: 2012-08-26 16:56

Re: MStabilize v1.0 - 任意范围时域Smooth脚本

mawen1250 写了:
littlepox 写了:“MStabilize内部处理精度始终为16bit,而如果输入16bit的clip在MStabilize内部会先降到8bit然后才能处理”

这段没怎么读懂。。。MStabilize 对于10bit/16bit 输入,先down到8bit,再dither到16bit处理?
编辑了一下说明,这下应该更清楚了。
嗯,这下没问题了。

伸手党mark之,谢谢。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: MStabilize v1.2 - 任意范围时域Smooth脚本

v1.2
2个严重bug修复,默认设置下不再处理U和V。
增加参数MVGlobal,设为true时可以使多个MStabilize共用一个MV Super clip以减少重复运算。
mask部分大幅度改进,几乎等于重写了,原先的motion mask大幅改进,新增edge mask和temporal diff mask,默认情况下使用motion mask和temporal diff mask。
头像
猫耳幽香
帖子: 22
注册时间: 2014-12-22 12:24

Re: MStabilize v1.2 - 任意范围时域Smooth脚本

链接挂掉了。
mawen1250的签名档里有好多教程 | 带2+5.1ch声道ts的处理方法 | AssumeFPS、ChangeFPS、ConvertFPS的区别 | 关于音频抽出却延迟不同的一些疑问(未解决)
一些常用的文档和工具:(大多收录非记载在nmm论坛的内容)
H.264Level计算器 | x264参数介绍(中文翻译可以戳这里,但是不全) | x265参数介绍 | BillyTC下载链接修复
► 显示剧情透露 致那些“我看不懂”的人
► 显示剧情透露 我不懂为啥有人说HEVC慢Orz
► 显示剧情透露 鸠子的愤怒:我不明白
► 显示剧情透露 芳乃琴里樱这名字太长了,叫我琴乃多好。

回到 “AviSynth”