【问题标题】:Converting limited range YUV to sRGB using ImageMagick使用 ImageMagick 将有限范围的 YUV 转换为 sRGB
【发布时间】:2019-11-15 14:10:16
【问题描述】:

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

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

主要问题: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):

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

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

  • YUV444 格式的 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_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 转换器进行上述转换?

【问题讨论】:

  • 也许使用 -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。我只能猜测Rec709YCbCr flag 是为将 RGB 转换为 YUV 而设计的,而不是从 YUV 转换为 RGB。

标签: image-processing ffmpeg imagemagick rgb yuv


【解决方案1】:

根据您的要求,这将是用于变换的 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

【讨论】:

  • 您忘记了一些减号...您能发布完整的命令吗?使用-color-matrix,我得到两个颜色怪异的输出图像(rgb_output_magick-0.pngrgb_output_magick-1.png)。谢谢。
  • 对不起,我复制了你的 3 行,然后尝试删除多余的部分以仅获取矩阵项,并意外删除了减号。我已经在上面修复了它,但仍然不知道这是否与您想要做的事情或正确的事情有关。应该没有理由得到两个输出图像 -0 和 -1,除非你复制错了。一个输入对我来说效果很好。除了一些 PNG 或 JPG 输入和 PNG 或 JPG 输出之外,请尝试不包含其他命令。这会给出多个输出结果吗?如果是这样,请发布您的完整命令。 在 Window 语法中,将行尾 \ 更改为 ^
  • 我找出了问题所在。而不是yuv:yuv_input.yuv,我不得不使用:rgb:yuv_input.yuv-color-matrix 与 RGB 输入一起工作,并在 YUV 输入下给出奇怪的结果)。
  • 完整的命令是:magick -interlace plane -size 128x96 rgb:yuv_input.yuv -color-matrix "1.1644 0.0 1.79270 0.0, 0.0, -0.97294 1.1644 -0.21325 -0.53291 0.0, 0.0, 0.30148 1.1644 2.11240 0.0 0.0, 0.0, -1.13340 0.0 0.0 0.0 1.0, 0.0, 0.0 0.0 0.0 0.0 0.0, 1.0, 0.0 0.0 0.0 0.0 0.0, 0.0, 1.0" rgb_output_magick.png
  • 只有当我将 -depth 8 指定为 im7 magick -interlace plane -depth 8 -size 128x96 rgb:yuv_input.yuv -color-matrix "1.1644 0.0 1.79270 0.0, 0.0, -0.97294 1.1644 -0.21325 -0.53291 0.0, 0.0, 0.30148 1.1644 2.11240 0.0 0.0, 0.0, -1.13340 0.0 0.0 0.0 1.0, 0.0, 0.0 0.0 0.0 0.0 0.0, 1.0, 0.0 0.0 0.0 0.0 0.0, 0.0, 1.0" rgb_output_magick.png 时,您的命令才对我有效。它会产生一个输出,它似乎与您的 rgb_input.png 匹配。 -ImageMagick 的 Q16 编译需要深度 8;否则,IM 假设它是深度 16 并且命令失败。我建议您将此命令发布回您的第一篇文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多