现如今,当一些精彩的、真正的“高清重置”版的上世纪动画发行(或者放流)时,映入你眼帘的往往首先是大尺度的动态噪点。一些对原盘裸压很有研究的组(比如 jsum)可以帮助你在尽量缩减视频体积的情况下保持观感,他们能解决一部分人的口粮问题;与之对应的,当然也会有一些不怎么喜欢噪点的人,他们希望有人能对原盘进行不同程度的降噪处理,有的人喜欢降低噪点强度、但是仍然保持噪点在平面上的剧烈运动,有的人喜欢在噪点强度不怎么改变或者轻微减小的情况下使噪点相对静止和稳定,有的人压根就不喜欢噪点,希望在尽量保持细节的前提下进行充分的降噪。
本文引入的降噪方案,其目的是希望让大颗粒的雪花噪消失、并且使平面表现稳定。
其实处理在重度噪点的源的情况下,能作为主力使用的降噪滤镜并不多。BM3D 系滤镜的主要问题是其直接应用在重度噪点下时(降噪强度开到能抹掉噪点的强度),不能抑制噪点覆盖下的平面色块在时域上的“浮动”,这是实际上引入了面积更大的“噪点”,并且从实际观感上来说比不降噪时往往更差。MDegrain 系滤镜的主要问题则是非常容易出现鬼影,也许总有一套参数能适应你手上这个源的噪点特性,但是调参非常的浪费时间,并且很难说某某参数具备普遍意义。
这样想来,我们希望能使 BM3D 的结果在时域上更为稳定,亦或者是找到一组更普遍的 MDegrain 参数——这样自然而然就想到了本文的降噪策略:首先利用 BM3D 把源从重度噪点的形态打成重度“浮动色块”的形态,然后使用 MDegrain 按住浮动的色块。
我们以《机动刑事808》(Cyber City Oedo 808 / サイバーシティOEDO808)美版 Remaster 原盘为例,这是一个噪点及其重的源。出于运算速度考虑,我们截取 Y 平面处理,首先观察一下 VBasic 的结果:
vbasicy = srcy.bm3dcuda_rtc.BM3Dv2(sigma=12, block_step=4, bm_range=16, radius=2, ps_num=2, ps_range=8)
除了平面色块问题以外,不难发现由于 BM3D 算法本身的性质,在一些线条边缘或者纹理比较密集的地方,降噪的强度是低于大平面的,这个问题我们放到后面解决,按照之前的思路,我们要用 MDegrain 对 VBasic 的结果进行时域稳定。这里简单阐述一下我调参过程中的一些测试结果(一些精度与复杂度的权衡):
一、blksize 越小出的鬼影越不严重,越大出的鬼影越严重,与之对应的是 blksize 越大平面稳定性越好,我对比了 16、32 和 64,得出结论不论是直接应对原生重噪点还是应对 bm3d 出来的色块,blksize=32 都是比较好的选择
二、prefilter(SMD 里那种用法),必须要有一定的时域稳定功能,但是出的鬼影必须非常轻或者没有,SMD 里面的 4(knl)实测是平面稳定效果最好的,但是出来的鬼影太严重了,所以还是用 qtgmc 代替,权衡下速度我试了试 preset=medium,和默认的 slower 效果差不多
三、dct 里基本上和 SATD 相关的都不错,5 确实比 0 有提升,1234 鬼影太严重基本用不了,6 和 9 相对于 5 在鬼影方面要好一点,但都不是完全不会出鬼影;在平面稳定性方面就基本没什么区别(能用的这几个里面)
四、pel 提升效果不明显,其他的比如 tr、RefineMotion、search 这种和直觉差不多
这里方便起见,我用 SMD 写个例子:
tref = QTGMC(vbasicy, "medium", InputType=1, Sharpness=0, SourceMatch=3)
smdy = SMDegrain(vbasicy, tr=2, thSAD=350, RefineMotion=True, blksize=32, search=3, dct=6, prefilter=tref)
最后,我们需要找个方法来处理部分区域降噪强度不够的问题。一个很简单的方法就是直接用 Waifu2x 清理:
degrain = MergeChroma(smdy, src16).knlm.KNLMeansCL(h=1, channels="UV")
w2x = degrain_rgbs.w2xncnnvk.Waifu2x(noise=1, scale=1, model=2)
万事大吉。
如果你不需要锐化,可以接一个 DFTTest 作 ref 的 VBM3D,效果拔群