使用ImageMagick

时间:2019-07-04 22:08:44

标签: image-processing ffmpeg imagemagick rgb yuv

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

输入格式:原始 YUV444 有限范围 BT.709 (按平面数据顺序)。
所需的输出格式: sRGB PNG 图像集)。

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

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

为了进行测试,我使用了以下示例图像:

  • sRGB 格式(rgb_input.png)采样的图像:
    rgb_input.png

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

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

  • YUV444 格式(yuv_input.yuv平面数据顺序图)输入ImageMagick的图像:
    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_output_magick
    如果仔细看,您会发现图像与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)的结果:
    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 转换器进行上述转换?

1 个答案:

答案 0 :(得分:0)

根据您的要求,这将是用于变换的ImageMagick颜色矩阵命令,假设它是合理的。 ImageMagick颜色矩阵值被归一化为0到1的范围,包括偏移量(最右边)。我假设您的偏移量在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