使用 ImageMagick 将有限范围的 YUV 转换为 sRGB

Converting limited range YUV to sRGB using ImageMagick

我正在尝试使用 ImageMagick[=97] 将一组原始视频帧从 YUV444 转换为 sRGB =].

输入格式: Raw YUV444 有限范围, BT.709 in planar data order .
要求的输出格式:sRGBPNG 图像集)。

主要问题:ImageMagick 转换始终适用 JPEG conversion formula

  • 关于“有限范围”YUV格式的备注:
    在8位限定范围的YUV格式中,Y的范围是[16, 235],U,V的范围是[16, 240]。 (有限范围的 BT.709 用于 HTDV 系统)。
    JPEG使用“full range”YUV格式,其中Y,U,V范围为[0, 255].
    sRGB用于PC系统,R,G,B范围为全范围[0, 255].
    YUV 和 YCbCr 可以互换。

为了测试,我使用了以下示例图片:

  • sRGB 格式的示例图像 (rgb_input.png):

我使用 FFmpeg:
将示例转换为 YUV444 格式 ffmpeg -y -colorspace bt709 -i rgb_input.png -pix_fmt yuv444p yuv_input.yuv

下图说明了 YUV444 输出(按平面数据顺序):

  • ImageMagick 的输入图像 YUV444 格式(yuv_input.yuv 平面数据顺序说明):

我使用 ImageMagick 转换器(版本 7.0.8-51)将 yuv_input.yuv 转换为 PNG
magick -depth 8 -interlace plane -size 128x96 -colorspace Rec709YCbCr -sampling-factor 4:4:4 yuv:yuv_input.yuv rgb_output_magick.png

  • ImageMagick (rgb_output_magick.png) 的结果:

    如果仔细观察,您会发现图像与 rgb_input.png 不同。

使用 FFmpeg 的相同转换(用作参考):
ffmpeg -y -s 128x96 -colorspace bt709 -pix_fmt yuv444p -i yuv_input.yuv -pix_fmt rgb24 rgb_output_ffmpeg.png

  • FFmpeg (rgb_output_ffmpeg.png) 的结果:

    注意:我的原始输入视频帧的真实格式阻止我使用 FFmpeg。

8位有限范围YUV BT.709到sRGB的转换公式:
R = 1.1644*Y + 0.00000*U + 1.79270*V - 248.10
G = 1.1644*Y - 0.21325*U - 0.53291*V + 76.878
B = 1.1644*Y + 2.11240*U + 0.00000*V - 289.02

如何使用 ImageMagick 转换器进行上述转换?

根据您的要求,这将是用于转换的 ImageMagick color-matrix 命令,假设它有意义。 ImageMagick color-matrix 值标准化为 0 到 1 的范围,包括偏移量 (right-most) 项。我假设您的偏移量在 0 到 255(8 位)范围内。所以我不确定这是否有意义。不过,这是它的样子。

magick input -color-matrix \
"1.1644 0.00000 1.79270 0, 0, -0.9729 \
1.1644 -0.21325 -0.53291 0, 0, 0.30148 \
1.1644 2.11240 0.00000 0, 0, -1.1334 \
0 0 0 1, 0, 0 \
0 0 0 0, 1, 0 \
0 0 0 0, 0, 1" output


参见 http://www.adobetutorialz.com/articles/1987/1/Color-Matrix