Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
Mr-Z-2697 opened this issue Jun 28, 2022 · 9 comments
Closed

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

Mr-Z-2697 opened this issue Jun 28, 2022 · 9 comments
Labels
area: effect bug Something isn't working

Comments

@Mr-Z-2697
Copy link

Mr-Z-2697 commented Jun 28, 2022

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

@Mr-Z-2697 Mr-Z-2697 added the bug Something isn't working label Jun 28, 2022
@Blinue
Copy link
Owner

Blinue commented Jun 29, 2022

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

锯齿问题

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

NNEDI3 的半像素偏移

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

@Mr-Z-2697
Copy link
Author

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

锯齿问题

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

NNEDI3 的半像素偏移

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

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

@Blinue
Copy link
Owner

Blinue commented Jun 30, 2022

FSRCNNX_Linear.zip

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

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

@Mr-Z-2697
Copy link
Author

Mr-Z-2697 commented Jul 3, 2022

FSRCNNX_Linear.zip

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

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

FSRCNNX - Imgsli

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

@Blinue
Copy link
Owner

Blinue commented Jul 3, 2022

有个小问题,你的修改会导致 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
Copy link
Author

有个小问题,你的修改会导致 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
Copy link
Owner

Blinue commented Jul 4, 2022

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

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

@NeilTohno
Copy link
Contributor

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

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

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

@Blinue
Copy link
Owner

Blinue commented Jul 26, 2022

我将这些更改合并进了主仓库 a7b4b50

@Blinue Blinue closed this as completed Jul 26, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: effect bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants