国语视界

 找回密码
 立即注册
查看: 20230|回复: 63

[视频技术] vapoursynth视频处理方案

[复制链接]

32

主题

959

帖子

3563

积分

团长

大洋
146310
阅读权限
60
发表于 21-4-21 23:41 | 显示全部楼层 |阅读模式
本帖最后由 fyc0066 于 21-4-22 13:43 编辑

前言:个人不擅长写教程,不太善于将问题简洁易懂地表述出来,故在此大多是提供参考资料供大家阅读,还望理解。由于vapoursynth的各种用法纷乱复杂,本人水平有限,不太可能在有限的篇幅中面面俱到,故希望后面能得到补充。时间仓促,写的比较粗糙,建议先看一看准备知识。

为什么选择vapoursynth:
vapoursynth相对avisynth的优点:语法更简单;滤镜原生支持多线程,速度更快;vsedit图形界面相比avspmod更友好且支持16bit抖动输出

一些准备知识:
vapoursynth运行环境搭建、滤镜使用和vsedit使用方法请参考:https://www.zhihu.com/column/c_1178979505539166208

视频处理中的一些常见术语:
https://vcb-s.nmm-hd.org/Templar%20Archive/
读懂下面的处理流程需要大致了解以下术语以及滤镜用法:
YUV、luma-chroma、bit depth、函数变量传递、Deband、Dering、AA、Repair、Unsharp Mask、LimitDiff、nr-deband、MaskTools ...。仔细阅读VCB-S的教程对理解这些处理方案很有帮助

Merge、MergeDiff、MakeDiff、MaskedMerge、Maximum&Minimum、ShufflePlanes、Binarize、Lut、Expr等滤镜的使用可以参考
http://www.vapoursynth.com/doc/functions/
https://guide.geeking.moe/cong-ru-men-dao-jing-tong/se-dai-chu-li

vapoursynth基本视频处理思路请参考:
https://www.cnlang.org/thread-46876-1-1.html

帧服务器法实现非线编软件(如Premiere)无损推流至vspipe x265压制
https://www.bilibili.com/read/cv311975
(这里介绍的是avs,vs同理,即在vpy脚本里用avisource加载Advanced Frameserver输出的流,并用vspipe推给x265压制)

vapoursynth视频修复处理实例:
本例中所有图片均是在vsedit 16bit源处理中的截图,不代表经过压制后的结果。后面会简要提及vspipe推流至x265的压制,并对比x265压制前后的结果

以电影太阳照常升起电影的蓝光原盘为例(省字数就不复制全了):
原盘的mediainfo:
  1. Video
  2. Writing library             : x264 core 115
  3. Encoding settings           : cabac=1 / ref=3 /...
复制代码



压制信息没有抹去,疑似非官方制作,整个视频画面主要有两类瑕疵:大噪点颗粒与杂色(主要集中在luma平面),灰尘与划痕(dust and scratches,下面统称为dirt)
几处视频截图:









以上前三幅图中分别存在明显的噪点和dirt(注意观察天空和人脸的噪点,第二幅图的亮斑即为dirt),而除去第三幅图,每幅图中都有丰富的细节(草地和人脸上的细节),处理噪点与dirt会对平面部分造成巨大的涂抹效果,伤害到细节,这里提供一个vapoursynth的处理方案,试图在降噪和修复dirt的同时尽量保留细节,先看结果
经vapoursynth处理后的同帧画面,可自行下载图片对比:









个人对处理效果还是比较满意的,天空人脸处的噪点抹得比较干净,同时基本细节有所保留。如果不想过度涂抹,可自行更改降噪强度

vpy脚本,带有一定的批注,这里分模块给出,其中edge与nonedge分别代表边缘与平面,代码写的略丑,将就看吧。#为该行注释掉了
源导入与预处理
  1. import vapoursynth as vs
  2. import sys
  3. import havsfunc as haf
  4. import mvsfunc as mvf
  5. import nnedi3_resample as nnrs
  6. import CSMOD as cs
  7. import muvsfunc as muf
  8. import vsTAAmbk as taa
  9. from adptvgrnMod import *
  10. from vsutil import *
  11. import removedirtvs

  12. core = vs.get_core()
  13. core.max_cache_size = 2000

  14. source1 = r"E:\The.Sun.Also.Rises.2007\BDMV\STREAM\test_1.mkv"

  15. ###读取视频,转为16bit色深。removedirt开到最大以尽可能消除灰尘与划痕,8bit处理dirt后转为16bit。16bit用于后面高精度处理与输出
  16. source1 = core.lsmas.LWLibavSource(source1, threads = 0, format = "yuv420p8")#8bit源
  17. src16 = mvf.Depth(source1, depth = 16)#16bit源
  18. src16_blur = core.rgvs.RemoveGrain(src16, 20).rgvs.RemoveGrain(20).rgvs.RemoveGrain(20).rgvs.RemoveGrain(20)#16bit源做模糊
  19. source1_RD = removedirtvs.RemoveDirt(source1, repmode = 5)#8bit源做removedirt
  20. src16_RD = mvf.Depth(source1_RD, depth = 16)#16bit源removedirt结果
  21. src16_RD_blur = core.rgvs.RemoveGrain(src16_RD, 20).rgvs.RemoveGrain(20).rgvs.RemoveGrain(20)#16bit源removedirt结果做模糊
复制代码


建立蒙版修复dirt
游客,如果您要查看本帖隐藏内容请回复

为了直观理解mask覆盖dirt的过程,我截取了nrmask,nrmask1,core.std.MakeDiff(nrmask, nrmask1, planes = 0)和nrmask_d的结果








可以看到,nrmask_d有效地达到了只覆盖dirt区域的效果

评分

参与人数 2威望 +100 大洋 +2600 收起 理由
why1812 + 50 + 600 厉害了我的神!
cnlang + 50 + 2000 厉害了我的神!

查看全部评分

32

主题

959

帖子

3563

积分

团长

大洋
146310
阅读权限
60
 楼主| 发表于 21-4-21 23:42 | 显示全部楼层
本帖最后由 fyc0066 于 21-4-22 13:41 编辑

edge降噪,nonedge降噪
游客,如果您要查看本帖隐藏内容请回复


生成edgemask
游客,如果您要查看本帖隐藏内容请回复

edgemask的截图


edgemask覆盖了边缘细节等高频区域

edge与nonedge区域的高低频分离
游客,如果您要查看本帖隐藏内容请回复


生成luma自适应的蒙版
游客,如果您要查看本帖隐藏内容请回复

这里解释一下,在16bit里,luma值从0-65535,8bit对应0-256,8bit下的luma值乘256即为16bit下的luma值。
nrweight1,2,3的结果分别是






实际上就是为加噪和加分离出的高频信息设计的一个基于luma值的mask

edge区域做unsharp mask、aa、dering
游客,如果您要查看本帖隐藏内容请回复


nonedge区域deband
游客,如果您要查看本帖隐藏内容请回复


生成动静态混合噪点
游客,如果您要查看本帖隐藏内容请回复


将噪点与nonedge区域的高频信息luma自适应地加回到deband后的平面上
游客,如果您要查看本帖隐藏内容请回复


利用edgemask合成edge与nonedge,16bit输出
  1. ###利用蒙版叠加edge与nonedge,合成最终画面
  2. res1 = core.std.MaskedMerge(nonedge, edge, edge_mask, [0, 1, 2], True)

  3. ###输出结果
  4. Debug = 0
  5. if Debug:
  6.         compare = core.std.Interleave([src16_RD_RP, res1])
  7.         compare = mvf.ToRGB(compare, full=False, depth=8).set_output()
  8. else: res1 = mvf.Depth(res1, 16).set_output()

  9. ###此套流程比较适合于修复包含dirt与大噪点的老电影,在一定程度上提升观感
复制代码


这套流程一般是通用的,不用修复dirt的话,前面蒙版0与蒙版1做差,合成覆盖dirt的蒙版等操作就直接去掉即可
整套流程走完,将vpy脚本利用vspipe推流给x265压制
  1. vspipe --y4m "E:\The.Sun.Also.Rises.2007\BDMV\STREAM\00000.vpy" - |"E:\x265-Asuna-3.4+13-g729a838d3+38\x265-gcc-multilib-full.exe" --y4m --input-depth 16 -D 10 --dither --preset slower --deblock -2:-2 --ctu 32 --qg-size 16 --crf 18.0 --ipratio=1.4 --pbratio 1.2 --cbqpoffs -3 --crqpoffs -3 --no-sao --me 3 --subme 4 --merange 44 --b-intra --limit-tu 4 --rect --no-amp --ref 4 --limit-refs 2 --weightb --keyint 360 --min-keyint 1 --bframes 6 --aq-mode 1 --aq-strength 1.0 --rd 4 --psy-rd 2.0 --psy-rdoq 1.5 --rdoq-level 2 --no-open-gop --rc-lookahead 80 --lookahead-slices 4 --scenecut 40 --qcomp 0.60 --no-strong-intra-smoothing --tu-inter-depth 2 --tu-intra-depth 2 --max-merge=3 --qpmax 69 --sar 0 --output "E:\The.Sun.Also.Rises.2007\BDMV\STREAM\test_1.hevc" -
复制代码


参数是从VCB-S压的真人片抄的,具体设置没测试过,最终结果似乎还行,破本子的CPU i7-7700HQ压制速度稳定在1.4fps左右,可以接受。压制后体积在源的1/3大小,还行









压制x265 10bit的原因是10bit色深能尽可能保留deband等16bit高精度下画面处理的结果,但为保留画面处理的结果,有几个参数最好要指定:
--deblock -1:-1或--deblock -2:-2 值越小,画面涂抹力度越小
--aq-strength 1.0-1.2 值越大,质量越高,体积越大
--no-sao 防止暴力涂抹
--ctu 32 防止区块过大造成的涂抹

最后分享一下vpy脚本中用到的滤镜,收集还是很花时间的,但由于版本太多,个人建议还是自己去github上下载,
核心滤镜+py脚本滤镜,记得放置在正确的位置:
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

194

主题

2704

帖子

869

积分

连长

大洋
29550
阅读权限
40
发表于 21-4-21 23:51 | 显示全部楼层
膜拜大佬,高深,值得仔细学习
回复 支持 反对

使用道具 举报

8

主题

1001

帖子

3043

积分

团长

大洋
59592
阅读权限
60
发表于 21-4-22 00:09 | 显示全部楼层
虽然看不太懂,不过还是支持了           
回复 支持 反对

使用道具 举报

13

主题

1442

帖子

1084

积分

营长

大洋
4815
阅读权限
50
发表于 21-4-22 04:56 | 显示全部楼层
这个方法可以应用在例如像hqdn3d这类降噪滤镜很有用。但用knlmeanscl这类滤镜基本上都不太用画mask。除非遇上难搞的噪点。
回复 支持 反对

使用道具 举报

34

主题

8774

帖子

3509

积分

团长

大洋
74160
阅读权限
60
发表于 21-4-22 07:40 | 显示全部楼层
大佬发教程不容易,支持一下
回复 支持 反对

使用道具 举报

0

主题

1343

帖子

157

积分

班长

大洋
7458
阅读权限
20
发表于 21-4-22 08:05 | 显示全部楼层
仰望大佬
回复

使用道具 举报

301

主题

4880

帖子

5787

积分

工作组

大洋
302427
阅读权限
135
发表于 21-4-22 08:10 | 显示全部楼层
个人反而比较喜欢胶片的噪点
回复 支持 反对

使用道具 举报

32

主题

959

帖子

3563

积分

团长

大洋
146310
阅读权限
60
 楼主| 发表于 21-4-22 08:34 | 显示全部楼层
言冰云 发表于 21-4-22 04:56
这个方法可以应用在例如像hqdn3d这类降噪滤镜很有用。但用knlmeanscl这类滤镜基本上都不太用画mask。除非遇 ...


knlm似乎确实可以不用,我的初衷是想让edge部分更干净,所以还是对edge部分用了降噪。另外是把平面部分的fft3d替换成hqdn3d吗,我不太了解hqdn3d,能否介绍一下呢,非常感谢
回复 支持 反对

使用道具 举报

32

主题

959

帖子

3563

积分

团长

大洋
146310
阅读权限
60
 楼主| 发表于 21-4-22 08:42 | 显示全部楼层
Yuanjiachun 发表于 21-4-22 08:10
个人反而比较喜欢胶片的噪点


可以将fft3d的降噪强度减小以获得更多噪点保留,但不利于压制时的码率控制。我这里实际是将原本的大噪点替换成了生成的小噪点,从某种意义上还是有噪点的
回复 支持 反对

使用道具 举报

11

主题

4875

帖子

687

积分

连长

大洋
56548
阅读权限
40
发表于 21-4-22 09:04 | 显示全部楼层
学会后可以自己修复电影了!
回复 支持 反对

使用道具 举报

1

主题

156

帖子

24

积分

列兵

大洋
782
阅读权限
10
发表于 21-4-22 09:56 | 显示全部楼层
仰望大佬,这是相当于通用的x265 encode教程还是利用滤镜进行视频修复的教程?

点评

主要是vapoursynth滤镜处理,x265的编码参数不做详解  发表于 21-4-22 09:59
回复 支持 反对

使用道具 举报

17

主题

2065

帖子

547

积分

连长

大洋
3057
阅读权限
40
发表于 21-4-22 10:48 | 显示全部楼层
看天书的感觉
回复 支持 反对

使用道具 举报

274

主题

4874

帖子

6万

积分

炊事员

大洋
325056
阅读权限
120

灌水之王热心会员论坛元老王者至尊

发表于 21-4-22 10:51 | 显示全部楼层
学一学vs,不错
回复 支持 反对

使用道具 举报

13

主题

1442

帖子

1084

积分

营长

大洋
4815
阅读权限
50
发表于 21-4-22 11:08 | 显示全部楼层
本帖最后由 言冰云 于 21-4-22 11:09 编辑
fyc0066 发表于 21-4-22 08:34
knlm似乎确实可以不用,我的初衷是想让edge部分更干净,所以还是对edge部分用了降噪。另外是把平面部分的 ...


不画mask主要是因为knlm,BM3D这类滤镜由于算法的优势能降噪且不破坏细节还有就是涂抹感不高,画个mask会额外增加运算力。264压时间上还可以接受,用265可就太慢了,时间上不划算。在vs上除非像我一样为了省时间用hqdn3d降噪,不然还是不太推荐。因为这个滤镜只支持8 bit输入的clip。精度上就输其他降噪滤镜一大圈了。
回复 支持 反对

使用道具 举报

32

主题

959

帖子

3563

积分

团长

大洋
146310
阅读权限
60
 楼主| 发表于 21-4-22 11:34 | 显示全部楼层
本帖最后由 fyc0066 于 21-4-22 11:37 编辑
言冰云 发表于 21-4-22 11:08
不画mask主要是因为knlm,BM3D这类滤镜由于算法的优势能降噪且不破坏细节还有就是涂抹感不高,画个mask会 ...


好的谢谢指导。我画mask的另一个原因是区分nonedge与edge区域,以便在nonedge区域开高强度的deband而不伤及edge区域,但从速度考虑确实可以不用mask
回复 支持 反对

使用道具 举报

0

主题

326

帖子

503

积分

连长

大洋
449
阅读权限
40
发表于 21-4-22 11:35 | 显示全部楼层
膜拜大佬。
现在蓝光修复的通常标准是胶片电影保留胶片颗粒(film grain)以维持胶片质感,并使锐度和细节最大程度保留。
回复 支持 反对

使用道具 举报

32

主题

959

帖子

3563

积分

团长

大洋
146310
阅读权限
60
 楼主| 发表于 21-4-22 12:52 | 显示全部楼层
命令写的丑哭了,我自己都忍不了了。稍微改了一下,要是能支持语法高亮就好了
回复 支持 反对

使用道具 举报

45

主题

1526

帖子

1747

积分

营长

大洋
3131
阅读权限
50
发表于 21-4-22 14:24 | 显示全部楼层
厉害了 非常实用的教程,从头学习,谢谢您的发布分享
回复 支持 反对

使用道具 举报

0

主题

161

帖子

24

积分

列兵

大洋
283
阅读权限
10
发表于 21-4-23 03:36 | 显示全部楼层
真的是非常有用的教程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表