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:
-
YV12:
-
-
yuv420sp:
Y
是planar采样,UV
是packet采样-
NV12:
-
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
-
常规转换标准:
-
BT.601 标准:(SD TV)
-
BT.709 标准:(HD TV)
RGB ——> YUV
-
常规转换标准:
-
BT.601 标准:(SD TV)
-
BT.709 标准:(HD TV)