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 用于 模拟信号 领域;MPEG、DVD、摄像机中常说的 YUV 其实是 Y'CbCr,二者转换为 RGBA 的转换矩阵是不同的。
- Cr:(色度红)反应了
RGB输入信号 红色 部分与RGB信号亮度值之间的差异(即,当前颜色对 红色 的偏移程度)。 - Cb:(色度红)反应了
RGB输入信号 蓝色 部分与RGB信号亮度值之间的差异(即,当前颜色对 蓝色 的偏移程度)。
注意:如无特殊说明,本文讨论的 YUV 均指 Y'CbCr 。
格式
YUV存储格式:
- planar:先存储
Y,然后U,然后V。 - packed:
yuv交叉存储。
常见格式
-
yuv444: packet 采样(
yuv yuv yuv)和 planar 采样(yyyy uuuu vvvv) -
yuv422:packet 采样
- yuvy:
YUYV YUYV - uyvy:
UYVY UYVY
- yuvy:
-
yuv422p:planar采样:
YYYY UU VV -
yuv420:packet采样:
YUV Y YUV Y -
yuv420p:planar采样
-
I420:
![I420 内存布局]()
-
YV12:
![YV12 内存布局]()
-
-
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 内置的矩阵(如 mat2、mat3、mat4 )是 列主序,即需要将下列转换矩阵转换成 转置矩阵 !
YUV ——> RGB
-
常规转换标准:
![常规 YUV ——> RGB 转换矩阵]()
-
BT.601 标准:(SD TV)
![BT.601 YUV ——> RGB 转换矩阵]()
-
BT.709 标准:(HD TV)
![BT.709 YUV ——> RGB 转换矩阵]()
RGB ——> YUV
-
常规转换标准:
![常规 RGB ——> YUV 转换矩阵]()
-
BT.601 标准:(SD TV)
![BT.601 RGB ——> YUV 转换矩阵]()
-
BT.709 标准:(HD TV)
![BT.709 RGB ——> YUV 转换矩阵]()











浙公网安备 33010602011771号