FFmpeg:以 16 位/通道缩放 RGB = 不准确的颜色输出

FFmpeg:以 16 位/通道缩放 RGB = 不准确的颜色输出

我正在尝试以伽马校正方式缩放 RGB 图像,即在缩放器之前和之后进行伽马变换。由于 8 位/通道的伽马校正会产生“条带”,因此我首先将图像转换为 16 位/通道 (gbrp16le),然后在一切完成后再转换回 rgb24。

问题是,这个过程不知何故导致了不准确的颜色:而不是黑色(rgb0,0,0)我得到了深紫色(RGB25,0,27)。

我的命令行(Windows 批处理,因此 ^ 字符转义双引号和换行符):

ffmpeg -loglevel 42 -hide_banner -y -i testcase.png -vf ^"^
    format=gbrp16le,^
    lutrgb='r=gammaval(2.2):g=gammaval(2.2):b=gammaval(2.2)',^
    scale=iw/2:ih/2:flags=bicubic,^
    lutrgb='r=gammaval(0.454545):g=gammaval(0.454545):b=gammaval(0.454545)',^
    format=gbrp16le,^
    format=rgb24^" ^
testcase-out.png

(第二个format=gbrp16le原因是缩放器本身似乎会转换为 rgb24,并在第二次伽马变换后给我带来带状)

示例输入“testcase.png”-条形周围的黑色区域是 rgb0,0,0

示例输入(testcase.png)

输出结果如下。可能很难看清,但如果你实际检查一下颜色值,黑色现在变成了25,0,27 (#19001B)

示例输出(testcase-out.png)

在这个日志级别,我还获得了有关过滤器图正在做什么的以下详细信息:

[Parsed_scale_2 @ 0000000002c90340] w:iw/2 h:ih/2 flags:'bicubic' interl:0
[graph 0 input from stream 0:0 @ 000000000019d200] w:420 h:212 pixfmt:rgb24 tb:1/25 fr:25/1 sar:0/1
[auto_scaler_0 @ 00000000001aa4c0] w:iw h:ih flags:'bicubic' interl:0
[Parsed_format_0 @ 00000000006f8f00] auto-inserting filter 'auto_scaler_0' between the filter 'graph 0 input from stream 0:0' and the filter 'Parsed_format_0'
[auto_scaler_1 @ 00000000001aa5c0] w:iw h:ih flags:'bicubic' interl:0
[Parsed_format_5 @ 000000000019cf80] auto-inserting filter 'auto_scaler_1' between the filter 'Parsed_format_4' and the filter 'Parsed_format_5'
[auto_scaler_0 @ 00000000001aa4c0] w:420 h:212 fmt:rgb24 sar:0/1 -> w:420 h:212 fmt:gbrp16le sar:0/1 flags:0x4
[Parsed_scale_2 @ 0000000002c90340] w:420 h:212 fmt:gbrp16le sar:0/1 -> w:210 h:106 fmt:gbrp16le sar:0/1 flags:0x4
[auto_scaler_1 @ 00000000001aa5c0] w:210 h:106 fmt:gbrp16le sar:0/1 -> w:210 h:106 fmt:rgb24 sar:0/1 flags:0x4

有线索吗?如何解决这个问题?

我已经尝试过一些方法:

  • 添加其他缩放器标志(accurate_rnd、full_chroma_int、full_chroma_inp、bitexact)
  • 更改src_range缩放dst_range器选项,以防万一是“完整”与“有限”问题(尽管绿色通道不受影响)
  • 从输入 .png 中删除 ICC 配置文件
  • 更改gbrp16le为其他像素格式(>8 位/通道),例如gbrp10le
  • 使用不同的缩放算法(例如 lanczos、邻居)

以上都无济于事……

答案1

我已经更新了我的 FFmpeg 版本并且问题已经消失 —— 显然这个错误在过去 2 个月内的某个时间已经得到修复。

(之前的版本是4.3.1-2020-11-19,当前版本是2021-01-12-git-ca21cb1e36

相关内容