Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 使用ImageMagick将有限范围YUV转换为sRGB_Image Processing_Ffmpeg_Imagemagick_Rgb_Yuv - Fatal编程技术网

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

Image processing 使用ImageMagick将有限范围YUV转换为sRGB,image-processing,ffmpeg,imagemagick,rgb,yuv,Image Processing,Ffmpeg,Imagemagick,Rgb,Yuv,我正在尝试使用ImageMagick将一组原始视频帧从YUV444转换为sRGB 输入格式:原始YUV444有限范围,平面数据顺序为BT.709。 所需输出格式:sRGB(PNG图像集) 主要问题:ImageMagick转换始终适用 关于“有限范围”YUV格式的备注: 在8位有限范围YUV格式中,Y的范围为[16235],U的范围为[16240]。(有限范围BT.709用于HTDV系统)。 JPEG使用“全范围”YUV格式,其中Y、U、V范围为[0255]。 sRGB用于PC系统,R、G、B的

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

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

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

  • 关于“有限范围”YUV格式的备注:
    在8位有限范围YUV格式中,Y的范围为[16235],U的范围为[16240]。(有限范围BT.709用于HTDV系统)。
    JPEG使用“全范围”YUV格式,其中Y、U、V范围为[0255]。
    sRGB用于PC系统,R、G、B的范围为全范围[0255]。
    YUV和YCbCr是可互换的
为了进行测试,我使用了以下示例图像:

  • sRGB格式的示例图像(
    rgb_input.png
    ):
我使用FFmpeg
ffmpeg-y-colorspace bt709-i rgb_input.png-pix_fmt yuv444p yuv_input.yuv

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

  • YUV444格式的ImageMagick输入图像(
    yuv\u Input.yuv
    平面数据顺序图示):
我使用ImageMagick转换器(版本7.0.8-51)将
yuv\u input.yuv
转换为PNG:
magick-深度8-交错平面-尺寸128x96-颜色空间Rec709YCbCr-采样因子4:4:4 yuv:yuv_输入.yuv rgb_输出_magick.png

  • ImageMagick
    rgb\u输出\u magick.png
    )的结果:

    如果仔细观察,您会发现图像与
    rgb_input.png
    不同
使用
FFmpeg
进行相同的转换(用作参考):
ffmpeg-y-s 128x96-色彩空间bt709-pix_fmt yuv444p-i yuv_input.yuv-pix_fmt rgb24 rgb_output_ffmpeg.png

  • FFmpeg
    rgb\u输出\u 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颜色矩阵命令,假设它有意义。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


请参见

可能使用-color矩阵代替-colorspace Rec709YCbCr。看见然后你可以使用你的转换系数。您不需要填写所有额外的行和列。只需将系数用作3x3矩阵即可。另外,为什么要使用-colorspace Rec709YCbCr。你不应该仅仅使用-colorspace-YUV吗?我认为它应该在你阅读原始图像之后出现,而不是之前?参见
颜色矩阵
语法有一个疯狂的语法。我想我确实需要使用6x6矩阵,因为有3个偏移。将
-colorspace Rec709YCbCr
放在后面会产生非常小的差异(2个灰度级),
-colorspace YUV
-colorspace Rec709YCbCr
相差1个灰度级。看起来仍然像JPEG转换公式。您(或任何人)可以使用
-color matrix
发布答案吗?我想我能想出如何使用它,但我更愿意接受答案。我试图复制你的命令。ffmpeg命令似乎正常工作,但您的ImageMagick命令失败,错误为
magick:文件'yuv_input.yuv'的意外结尾:没有这样的文件或目录
。所以我不确定这是IM还是ffmpeg的问题。我正在Mac OSX Sierra上使用IM7.0.8.51。为什么在ffmpeg命令中使用bt709而不是yuv444,在IM命令中使用-colorspace YUV?也许你能看到。注意:我不是ffmpeg或raw格式的专家。我使用的是Windows 10,但我不认为这是操作系统的问题。我下载的版本是
ImageMagick-7.0.8-52-Q8-x64-static.exe
。关于使用bt709:
-采样因子4:4:4 yuv:yuv\u输入。yuv
应用yuv444。我只能猜测,
Rec709YCbCr
标志设计用于将RGB转换为YUV,而不是从YUV转换为RGB。您忘记了几个减号。。。你能发布完整的命令吗?使用
-color matrix
,我得到了两个具有奇怪颜色的输出图像(
rgb\u output\u magick-0.png
rgb\u output\u magick-1.png
)。谢谢。对不起,我复制了你的3行,然后试图删除多余的部分以获得矩阵项,但无意中删除了减号。我已经在上面修复了它,但仍然不知道这是否与您想要做或更正的内容相关。应该没有理由获得两个输出图像-0和-1,除非复制错误。只需一个输入,它就可以很好地为我工作。除了一些PNG或JPG输入和PNG或JPG输出之外,请尝试不包含其他命令。这会产生多个输出结果吗?如果是这样,发布你的全部命令。在“窗口语法”中,将第\行的结尾改为“^I”以解决问题。我必须使用:
rgb:yuv\u input.yuv
-color matrix
与rgb输入一起工作,并使用yuv输入给出奇怪的结果)。完整的命令是:
magick-interlace plane-size 128x96 rgb:yuv\u 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.0,0.0,-1.133400.0.0 0.0 0.0 1.0,0.0,0.0.0,0.0.0.0”rgb_输出0 0 0.0 0 0 0 0.0.0,0.0.0.0.0.0.0.0,0.0.0.0.0.0.0.0.0.0