【发布时间】:2019-11-15 14:10:16
【问题描述】:
我正在尝试使用 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 可以互换。
为了测试,我使用了以下示例图片:
我使用 FFmpeg 将示例转换为 YUV444 格式:ffmpeg -y -colorspace bt709 -i rgb_input.png -pix_fmt yuv444p yuv_input.yuv
下图说明了 YUV444 的输出(按平面数据顺序):
我使用 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
使用FFmpeg 进行相同的转换(用作参考):ffmpeg -y -s 128x96 -colorspace bt709 -pix_fmt yuv444p -i yuv_input.yuv -pix_fmt rgb24 rgb_output_ffmpeg.png
8位有限范围YUV BT.709到sRGB的转换公式:R = 1.1644*Y + 0.00000*U + 1.79270*V - 248.10G = 1.1644*Y - 0.21325*U - 0.53291*V + 76.878B = 1.1644*Y + 2.11240*U + 0.00000*V - 289.02
如何使用 ImageMagick 转换器进行上述转换?
【问题讨论】:
-
也许使用 -color-matrix 代替 -colorspace Rec709YCbCr。见imagemagick.org/script/command-line-options.php#color-matrix。然后你可以使用你的转换系数。您不需要填写所有额外的行和列。只需将您的系数用作 3x3 矩阵。附言你为什么使用-colorspace Rec709YCbCr。你不应该只使用-colorspace YUV,我认为应该在你阅读原始图像之后,而不是之前?见imagemagick.org/script/command-line-options.php#colorspace
-
color-matrix语法有一种疯狂的语法。我想我确实需要使用 6x6 矩阵,因为有 3 个偏移量。将-colorspace Rec709YCbCr放在后面会产生非常小的差异(2 个灰度级),而-colorspace YUV与-colorspace Rec709YCbCr相差1 个灰度级。看起来还是 JPEG 转换公式。 -
您(或任何人)可以使用
-color-matrix发布答案吗?我想我可以弄清楚如何使用它,但我更喜欢接受答案。 -
我试图复制你的命令。 ffmpeg 命令似乎可以工作,但是您的 ImageMagick 命令失败并出现错误
magick: unexpected end-of-file 'yuv_input.yuv': No such file or directory。所以我不确定这是 IM 还是 ffmpeg 的问题。我在 Mac OSX Sierra 上使用 IM 7.0.8.51。为什么在 ffmpeg 命令中使用 bt709 而不是 yuv444 而在 IM 命令中使用 -colorspace YUV?也许见trac.ffmpeg.org/wiki/colorspace。请注意,我不是 ffmpeg 或原始格式方面的专家。 -
我使用的是 Windows 10,但我认为这不是操作系统问题。我下载的版本是
ImageMagick-7.0.8-52-Q8-x64-static.exe。关于使用 bt709:-sampling-factor 4:4:4 yuv:yuv_input.yuv应用 yuv444。我只能猜测Rec709YCbCrflag 是为将 RGB 转换为 YUV 而设计的,而不是从 YUV 转换为 RGB。
标签: image-processing ffmpeg imagemagick rgb yuv