使用 ImageMagick 将有限范围的 YUV 转换为 sRGB
Converting limited range YUV to sRGB using ImageMagick
我正在尝试使用 ImageMagick[=97] 将一组原始视频帧从 YUV444 转换为 sRGB =].
输入格式: Raw YUV444 有限范围, BT.709 in planar data order .
要求的输出格式:sRGB(PNG 图像集)。
主要问题: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
我正在尝试使用 ImageMagick[=97] 将一组原始视频帧从 YUV444 转换为 sRGB =].
输入格式: Raw YUV444 有限范围, BT.709 in planar data order .
要求的输出格式:sRGB(PNG 图像集)。
主要问题: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