国语视界

 找回密码
 立即注册
查看: 5485|回复: 51

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

[复制链接]
  • TA的每日心情
    开心
    22-1-26 16:30
  • 签到天数: 746 天

    [LV.9]以坛为家II

    32

    主题

    962

    帖子

    3623

    积分

    团长

    Rank: 6Rank: 6

    大洋
    99260
    矿工
    15
    发表于 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 厉害了我的神!

    查看全部评分

  • TA的每日心情
    开心
    22-1-26 16:30
  • 签到天数: 746 天

    [LV.9]以坛为家II

    32

    主题

    962

    帖子

    3623

    积分

    团长

    Rank: 6Rank: 6

    大洋
    99260
    矿工
    15
     楼主| 发表于 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
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    22-1-27 00:00
  • 签到天数: 733 天

    [LV.9]以坛为家II

    182

    主题

    1578

    帖子

    510

    积分

    连长

    Rank: 4

    大洋
    11316
    矿工
    1
    发表于 21-4-21 23:51 | 显示全部楼层
    膜拜大佬,高深,值得仔细学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    22-1-27 00:08
  • 签到天数: 399 天

    [LV.9]以坛为家II

    8

    主题

    708

    帖子

    3012

    积分

    团长

    Rank: 6Rank: 6

    大洋
    13180
    矿工
    34
    发表于 21-4-22 00:09 | 显示全部楼层
    虽然看不太懂,不过还是支持了           
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    22-1-9 07:30
  • 签到天数: 411 天

    [LV.9]以坛为家II

    13

    主题

    1311

    帖子

    1111

    积分

    营长

    Rank: 5Rank: 5

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

    使用道具 举报

  • TA的每日心情
    开心
    22-1-27 07:12
  • 签到天数: 769 天

    [LV.10]以坛为家III

    26

    主题

    6758

    帖子

    3193

    积分

    团长

    Rank: 6Rank: 6

    大洋
    44243
    矿工
    21
    发表于 21-4-22 07:40 | 显示全部楼层
    大佬发教程不容易,支持一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    22-1-26 11:20
  • 签到天数: 437 天

    [LV.9]以坛为家II

    0

    主题

    698

    帖子

    92

    积分

    列兵

    Rank: 1

    大洋
    1912
    矿工
    3
    发表于 21-4-22 08:05 | 显示全部楼层
    仰望大佬
    回复

    使用道具 举报

  • TA的每日心情
    开心
    22-1-25 07:58
  • 签到天数: 1132 天

    [LV.10]以坛为家III

    115

    主题

    2752

    帖子

    3030

    积分

    工作组

    Rank: 14Rank: 14Rank: 14Rank: 14

    大洋
    51901
    矿工
    16
    发表于 21-4-22 08:10 | 显示全部楼层
    个人反而比较喜欢胶片的噪点
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    22-1-26 16:30
  • 签到天数: 746 天

    [LV.9]以坛为家II

    32

    主题

    962

    帖子

    3623

    积分

    团长

    Rank: 6Rank: 6

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


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

    使用道具 举报

  • TA的每日心情
    开心
    22-1-26 16:30
  • 签到天数: 746 天

    [LV.9]以坛为家II

    32

    主题

    962

    帖子

    3623

    积分

    团长

    Rank: 6Rank: 6

    大洋
    99260
    矿工
    15
     楼主| 发表于 21-4-22 08:42 | 显示全部楼层
    Yuanjiachun 发表于 21-4-22 08:10
    个人反而比较喜欢胶片的噪点


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

    使用道具 举报

  • TA的每日心情
    无聊
    22-1-26 13:25
  • 签到天数: 550 天

    [LV.9]以坛为家II

    10

    主题

    3882

    帖子

    534

    积分

    连长

    Rank: 4

    大洋
    39048
    矿工
    0
    发表于 21-4-22 09:04 | 显示全部楼层
    学会后可以自己修复电影了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    21-12-27 15:48
  • 签到天数: 83 天

    [LV.6]常住居民II

    1

    主题

    163

    帖子

    29

    积分

    列兵

    Rank: 1

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

    点评

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

    使用道具 举报

  • TA的每日心情

    22-1-25 21:38
  • 签到天数: 533 天

    [LV.9]以坛为家II

    9

    主题

    1183

    帖子

    284

    积分

    排长

    Rank: 3Rank: 3

    大洋
    590
    矿工
    5
    发表于 21-4-22 10:48 | 显示全部楼层
    看天书的感觉
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    21-10-5 22:57
  • 签到天数: 300 天

    [LV.8]以坛为家I

    246

    主题

    4297

    帖子

    3万

    积分

    军区司令

    Rank: 10Rank: 10Rank: 10

    大洋
    238489
    矿工
    50

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

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

    使用道具 举报

  • TA的每日心情
    难过
    22-1-9 07:30
  • 签到天数: 411 天

    [LV.9]以坛为家II

    13

    主题

    1311

    帖子

    1111

    积分

    营长

    Rank: 5Rank: 5

    大洋
    1279
    矿工
    28
    发表于 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。精度上就输其他降噪滤镜一大圈了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    22-1-26 16:30
  • 签到天数: 746 天

    [LV.9]以坛为家II

    32

    主题

    962

    帖子

    3623

    积分

    团长

    Rank: 6Rank: 6

    大洋
    99260
    矿工
    15
     楼主| 发表于 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
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    22-1-24 23:49
  • 签到天数: 218 天

    [LV.7]常住居民III

    0

    主题

    289

    帖子

    207

    积分

    排长

    Rank: 3Rank: 3

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

    使用道具 举报

  • TA的每日心情
    开心
    22-1-26 16:30
  • 签到天数: 746 天

    [LV.9]以坛为家II

    32

    主题

    962

    帖子

    3623

    积分

    团长

    Rank: 6Rank: 6

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

    使用道具 举报

  • TA的每日心情
    开心
    22-1-27 01:52
  • 签到天数: 424 天

    [LV.9]以坛为家II

    45

    主题

    716

    帖子

    848

    积分

    连长

    Rank: 4

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

    使用道具 举报

  • TA的每日心情
    奋斗
    22-1-24 04:19
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    0

    主题

    88

    帖子

    16

    积分

    列兵

    Rank: 1

    大洋
    89
    矿工
    1
    发表于 21-4-23 03:36 | 显示全部楼层
    真的是非常有用的教程
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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