ceshiwenfq
帖子: 19
注册时间: 2017-06-02 1:04

【已解决】Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

在VCB论坛发了个询问帖,不知是太naive了还是怎么样,并没有人理我,转帖到NMM求助
-----------------------------------------------------------------------------
如题,昨天看笨女孩看到一个面部特写的位置,突然想暂停下来看看视频信息。
结果非常吃惊,在这种没有打光的特写镜头下,几乎整个面部都是一整个色块,只有(253,224,207)一种颜色。
以我粗浅的知识认为这样会极大提升编码效率?所以非常感兴趣
图片
图片
附一张视频信息图,感觉H264L4在这个大小下B站网上的流压的真的挺好的。



而在我往常使用涂抹的经验中,通常这种镜头涂抹出的一个色块,是由颜色极相近的几种颜色抖动组成的,以我粗浅的知识认为这会造成容量的浪费,例如这张女主脸的部分和衣服上白色的部分。
(使用VBM3D,sigma=[10,10,10]涂出来的,感觉涂抹开的已经不低了,但是仍不能涂成纯色)
图片
也尝试过一些其他降噪滤镜,如KNLMeansCL,比较暴力的有Waifu2Xlevel3等等,不知是参数调教还是什么原因,都不能达到涂成纯色的效果。







姑且私下里猜测,达到这种效果是否是用区分edge-nonedge的mask做保护,对nonedge区域做了超强涂抹达到的。
想要实验一下这种思路,但是操作过程中产生两个问题。
其一是按照VCB的mask科普教程没法顺利生成edge-nonedge的mask:
图片
如图,用对半分的方式想实时预览mask平面。
但是调用tcanny之后,按照教程应该分别调用expand和inpand填充实线中的区域,我谷歌了半天不知道vs怎么调用expand。
(VCB论坛有人提醒,VS中使用Deflate/Inflate代替expand和inpand,遂将代码改成
mask = core.tcanny.TCanny(src, sigma=1.2, mode=0, planes=0)
mask = core.std.Inflate(clip=mask, planes=0, threshold=10)
但mask平面预览没有变化,请问是怎么回事?)



其二问题是,回到文章一开始的问题上来,即便生成edge-nonedge的mask之后,对nonedge区域用何种涂抹方式才能涂成纯色,据我所知的这些降噪插件无法实现这些效果。(除非把BM3D开到类似sigma=[100,100,100]这样的参数上来,但是感觉这么搞问题很大)


有没有触手能解答一下疑惑,感谢
上次由 ceshiwenfq 在 2017-08-06 22:16,总共编辑 1 次。
头像
Muonium
帖子: 42
注册时间: 2016-06-18 8:48

Re: Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

(如果源不是纯色的话,)压制成品中的纯色应该是编码时(在变换后)进行量化,并丢弃掉一些系数的结果,可参考
https://en.wikipedia.org/wiki/Compressi ... _artifacts 第二段 “Block-artifacts are a result of ...”

(我认为) VS上不太方便正确重现这种行为,不过可以通过
①直接进行低精度量化 比如 mvf.Depth(src, depth=6, dither="none")
或 ②大力度 haf.SMDegrain() 模拟 (对视频来说)

另外VS版的 expand() / inpand() 是 core.std.Maximum() / core.std.Minimum()
被噪点番支配的噩梦
被Waifu2x吊打的噩梦
不会写代码不会写脚本的我连咸鱼都不如了orz
eedi3好慢啊…………
为什么某SSIM的计算值大于1……
被一个月前自己写的脚本吊打,很爽
CropAbs上也能掉坑……
不要乱搞什么对数亮度作图…
魔幻炼丹主义
NAVras
帖子: 141
注册时间: 2016-04-24 1:32

Re: Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

KNLMeansCL, wmode=0, d=!0, ref循环
s越大涂抹区域距离线条越远
上次由 NAVras 在 2017-08-26 15:11,总共编辑 3 次。
ceshiwenfq
帖子: 19
注册时间: 2017-06-02 1:04

Re: Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

Muonium 写了:(如果源不是纯色的话,)压制成品中的纯色应该是编码时(在变换后)进行量化,并丢弃掉一些系数的结果,可参考
https://en.wikipedia.org/wiki/Compressi ... _artifacts 第二段 “Block-artifacts are a result of ...”

(我认为) VS上不太方便正确重现这种行为,不过可以通过
①直接进行低精度量化 比如 mvf.Depth(src, depth=6, dither="none")
或 ②大力度 haf.SMDegrain() 模拟 (对视频来说)

另外VS版的 expand() / inpand() 是 core.std.Maximum() / core.std.Minimum()

唔....不过我所知的控制涂抹与噪点的参数只有psy,SAO测试了几个样本,感觉不管如何开启就会损画质,还不能节省体积.
参数调成no-psy(x265)仍然不能达到向他们那样的纯色涂抹效果,真是迷呢
ceshiwenfq
帖子: 19
注册时间: 2017-06-02 1:04

Re: Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

Muonium 写了:(如果源不是纯色的话,)压制成品中的纯色应该是编码时(在变换后)进行量化,并丢弃掉一些系数的结果,可参考
https://en.wikipedia.org/wiki/Compressi ... _artifacts 第二段 “Block-artifacts are a result of ...”

(我认为) VS上不太方便正确重现这种行为,不过可以通过
①直接进行低精度量化 比如 mvf.Depth(src, depth=6, dither="none")
或 ②大力度 haf.SMDegrain() 模拟 (对视频来说)

另外VS版的 expand() / inpand() 是 core.std.Maximum() / core.std.Minimum()
nedge = haf.SMDegrain(nedge,tr=6,thSAD=500,contrasharp=30,prefilter=2,Str=1.2,RefineMotion=True)
nedge = haf.SMDegrain(nedge,tr=6,thSAD=500,contrasharp=30,prefilter=2,Str=1.2,RefineMotion=True)
nedge = haf.SMDegrain(nedge,tr=6,thSAD=500,contrasharp=30,prefilter=2,Str=1.2,RefineMotion=True)
连加了三遍还是没法涂出这种效果,看来是没戏了 {:xiaocry}
头像
Muonium
帖子: 42
注册时间: 2016-06-18 8:48

Re: Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

(比如低码率x264
被噪点番支配的噩梦
被Waifu2x吊打的噩梦
不会写代码不会写脚本的我连咸鱼都不如了orz
eedi3好慢啊…………
为什么某SSIM的计算值大于1……
被一个月前自己写的脚本吊打,很爽
CropAbs上也能掉坑……
不要乱搞什么对数亮度作图…
魔幻炼丹主义
ceshiwenfq
帖子: 19
注册时间: 2017-06-02 1:04

Re: Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

Muonium 写了:(比如低码率x264
按照你的思路吧,我目前推测是这样,第一遍高降噪+nopsy一压,之后第二遍二压到720P再过一遍降噪+nopsy
我目前感觉这个可能性最大
头像
Muonium
帖子: 42
注册时间: 2016-06-18 8:48

Re: Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

瞎补一句,如果只需要涂抹的话不妨试试 GradFun3 (),虽然感觉这样回复有些偏题

(定式思维让我现在才想起这东西
被噪点番支配的噩梦
被Waifu2x吊打的噩梦
不会写代码不会写脚本的我连咸鱼都不如了orz
eedi3好慢啊…………
为什么某SSIM的计算值大于1……
被一个月前自己写的脚本吊打,很爽
CropAbs上也能掉坑……
不要乱搞什么对数亮度作图…
魔幻炼丹主义
ceshiwenfq
帖子: 19
注册时间: 2017-06-02 1:04

Re: 【已解决】Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

说一下结论
今天下午试了半天,在VS里基本实现涂抹,之前说不经过编码器筛选比较难实现,实际上VS实现并不需要复杂算法,但代价是对线条极大杀伤,以及偏色。

目前的结论:
1、如果一定要只通过VS来模拟纯色涂抹的话
过去的误区是,认为完全涂抹是通过复杂降噪插件来实现。
目前认为,实际的实现应该是通过一些简单逻辑的算法。例如RemoveGrain19*n,将当前像素替换为周围9像素平均值。std.Minimum,将当前像素替换为周围9像素内最小值等。
目前方案是,前置通过f3kdb去色带同时的高涂抹+降噪插件实现初步涂抹,再辅以若干次上述算法达成。
(目前测试的几例片段中,YUV平面分别噪点强度各不相同,重点处理噪点严重的平面是降噪的重要步骤)
2、纯色涂抹后的危害:由于强涂抹对画面观感造成的严重影响,必须用edge/nonedge的mask保护线条。而用上述方法涂抹成纯色后平面颜色会发生整体偏移,造成线条周围的ringing,是很难在保护好线条观感的同时消除掉的。
3、故单纯在vs中达成高涂抹实际意义不大,基本没法用。B站视频应该是经过至少两次压缩,通过编码端的psy反复过滤掉某些噪点后实现的
myfreer
帖子: 11
注册时间: 2017-03-02 15:16

Re: 【已解决】Bilibili上的正版番剧,是如何做到完成度如此高的涂抹?

试试Bilateral
https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bilateral
clip = core.bilateral.Bilateral(clip, sigmaS=15)

另外,图挂了

回到 “VapourSynth”