Blinue / Magpie

An all-purpose window upscaler for Windows 10/11.
GNU General Public License v3.0
9.5k stars 492 forks source link

使用nnedi3和fsrcnnx的时候出现颜色质量下降的问题 #398

Closed Mr-Z-2697 closed 2 years ago

Mr-Z-2697 commented 2 years ago

Magpie version 程序版本

0.9.0

Windows version 系统版本

Win10 21H2

Related screenshot (optional) 相关截图(可选)

还请以100%的比例来查看截图,不然可能看不出来 Anime4K: Anime4K NNEDI3: NNEDI3 FSRCNNX: FSRCNNX

Reproduction steps 复现步骤

选择fsrcnnx或nnedi3,然后启用全屏,注意观察对比强烈、线条清晰的颜色边缘,尤其是红色,可以看见明显的锯齿以及颜色位置稍微偏移(颜色偏移似乎没有在fsrcnnx上、只在nnedi3上出现)。 根据这样的特征来猜测,可能是在shader计算过程中有转到YUV420处理的部分,这样的情况或许是可以避免的,比如同样基于神经网络的Anime4K就不会出现这样的情况。

Log files 日志文件

logs.zip

Blinue commented 2 years ago

这和着色器的实现原理有关。

锯齿问题

FSRCNNX、NNEDI3、ACNet 都只在亮度分量上缩放,因为人眼对亮度最敏感,可以以微小的质量代价提高性能。(其他通道是最近邻缩放,因此有锯齿)

NNEDI3 的半像素偏移

NNEDI3 原本是用于去隔行的算法,用于放大的原理是,先竖直放大一倍,再水平放大一倍,通过两次去隔行将一个像素扩展为四个像素,这就引入了半像素偏移。

Mr-Z-2697 commented 2 years ago

这和着色器的实现原理有关。

锯齿问题

FSRCNNX、NNEDI3、ACNet 都只在亮度分量上缩放,因为人眼对亮度最敏感,可以以微小的质量代价提高性能。(其他通道是最近邻缩放,因此有锯齿)

NNEDI3 的半像素偏移

NNEDI3 原本是用于去隔行的算法,用于放大的原理是,先竖直放大一倍,再水平放大一倍,通过两次去隔行将一个像素扩展为四个像素,这就引入了半像素偏移。

这样是相当于提升到(相比三通道)三倍性能吧,确实让人无法拒绝( 但是应该可以使用Bicubic之类的算法来代替最近邻吧,影响应该不会很大?而且像素偏移的问题也可以在插值过程中顺便解决。

Blinue commented 2 years ago

FSRCNNX_Linear.zip

实现了在 UV 通道使用双线性插值的 FSRCNNX。对比:https://imgsli.com/MTE0NzI1

在色差大的边缘可以很好的消除锯齿。

FSRCNNX - Imgsli
Mr-Z-2697 commented 2 years ago

FSRCNNX_Linear.zip

实现了在 UV 通道使用双线性插值的 FSRCNNX。对比:https://imgsli.com/MTE0NzI1

在色差大的边缘可以很好的消除锯齿。

FSRCNNX - Imgsli

感谢,效果非常显著 我还试着模仿修改了nnedi3 NNEDI3_LinearUV.zip

FSRCNNX - Imgsli
Blinue commented 2 years ago

有个小问题,你的修改会导致 Y 通道和 UV 通道不重合 把这里的 1.0 改成 0.5,因为 Y 通道有半像素偏移

float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 1.0f 0.5f) * outputPt, 0).rgb);

Mr-Z-2697 commented 2 years ago

有个小问题,你的修改会导致 Y 通道和 UV 通道不重合 把这里的 1.0 改成 0.5,因为 Y 通道有半像素偏移

float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + ~1.0f~ 0.5f) * outputPt, 0).rgb);

因为fsrcnnx没有色度偏移,里面是0.5,所以我给nnedi3的这里再加了0.5…… 看起来是没有问题啦

Blinue commented 2 years ago

除了 FSRCNNX、NNEDI3,需要修改的还有 ACNet 和 RAVU。因为这算某种程度的魔改,所以我会把它放到 MagpieToys 里。

我还试过其他插值算法,但效果不尽人意,目前看来双线性插值是最合理的选择。

NeilTohno commented 2 years ago

除了 FSRCNNX、NNEDI3,需要修改的还有 ACNet 和 RAVU。因为这算某种程度的魔改,所以我会把它放到 MagpieToys 里。

我还试过其他插值算法,但效果不尽人意,目前看来双线性插值是最合理的选择。

建议把这两个包含在主程序中,视频播放器又没有这个问题,让喜欢的人用吧 (✧◡✧) FSRCNNX_Linear NNEDI3_LinearUV

Blinue commented 2 years ago

我将这些更改合并进了主仓库 https://github.com/Blinue/Magpie/commit/a7b4b50267deec9cf82e67e09de9a2adf2eee257