RGB/YUV 转换

ref: https://juejin.cn/post/6844903640377884679
https://blog.shenyuanluo.com/ColorConverter.html

YUV

YUV:是一种颜色空间,基于 YUV 的颜色编码是流媒体的常用编码方式,这种表达方式起初是为了彩色电视与黑白电视之间的信号兼容;其中

  • Y:表示明亮度(Luminance 或 Luma),也称灰度图。
  • U、V:表示色度(Chrominance 或 Chroma),作用是描述影像的色彩及饱和度,用于指定像素的颜色。

Y’CbCr:(也称为 YUV),是 YUV 的压缩版本,不同之处在于 Y’CbCr 用于 数字图像 领域,YUV 用于 模拟信号 领域;MPEGDVD、摄像机中常说的 YUV 其实是 Y'CbCr,二者转换为 RGBA 的转换矩阵是不同的。

  • Cr:(色度红)反应了 RGB 输入信号 红色 部分与 RGB 信号亮度值之间的差异(即,当前颜色对 红色 的偏移程度)。
  • Cb:(色度红)反应了 RGB 输入信号 蓝色 部分与 RGB 信号亮度值之间的差异(即,当前颜色对 蓝色 的偏移程度)。

注意:如无特殊说明,本文讨论的 YUV 均指 Y'CbCr

格式

YUV存储格式:

  • planar:先存储 Y,然后 U,然后 V
  • packed:yuv 交叉存储。

常见格式

  1. yuv444: packet 采样(yuv yuv yuv)和 planar 采样(yyyy uuuu vvvv

  2. yuv422:packet 采样

    • yuvy:YUYV YUYV
    • uyvy:UYVY UYVY
  3. yuv422p:planar采样:YYYY UU VV

  4. yuv420:packet采样: YUV Y YUV Y

  5. yuv420p:planar采样

    • I420:

      I420 内存布局

    • YV12:

      YV12 内存布局

  6. yuv420sp:Y 是planar采样,UV 是packet采样

    • NV12:

      NV12 内存布局

    • NV21:

      NV21 内存布局

转换

转换矩阵

注意:这里的转换矩阵中,当转换为 RGB 读取 YUV 时,需要将 U(Cb)**、V(Cr)** 的取值范围整数表示时,转换为:[-128, 127];浮点数表示时,转换为:[-0.5, 0.5]

(这是因为:U(Cb)**、V(Cr)** 取值范围是 [﹣128, 127],对应的浮点数表示为 [﹣0.5, 0.5];而在存储时,为了方便存储,跟 Y 数据一样,统一用一个(无符号)字节表示,即取值范围是 [0, 255],对应的浮点数表示为:[0, 1]。)

特别注意:OpenGL 内置的矩阵(如 mat2mat3mat4 )是 列主序,即需要将下列转换矩阵转换成 转置矩阵

YUV ——> RGB

  1. 常规转换标准:

    常规 YUV ——> RGB 转换矩阵

  2. BT.601 标准:(SD TV)

    BT.601 YUV ——> RGB 转换矩阵

  3. BT.709 标准:(HD TV)

    BT.709 YUV ——> RGB 转换矩阵

RGB ——> YUV

  1. 常规转换标准:

    常规 RGB ——> YUV 转换矩阵

  2. BT.601 标准:(SD TV)

    BT.601 RGB ——> YUV 转换矩阵

  3. BT.709 标准:(HD TV)

    BT.709 RGB ——> YUV 转换矩阵

原文地址:https://www.cnblogs.com/wioponsen/p/14547427.html