-
RGB:红绿蓝
- 每个分量的位深度?RGB555,RGB565,RGB24
-
YUV:Y 亮度 luma,U(Cb),V(Cr) 色度 chroma
- 模拟 YUV, Y∈ [0,1] U,V∈[-0.5,0.5]
- YCbCr TV Range, YUV Y~[16,235] Cb~[16-240] Cr~[16-240] (解决滤波后的过冲现象)
- YCbCr Full Range,[0,255]
- Cr: 红-亮度,Cb:蓝-亮度
- YUV 采样格式:由于人眼对 Y 比对 UV 更敏感,因此我们可以考虑多个像素共用一个 UV,于是 YUV4xy 表示在 4×2 矩形中,第一行均匀分布 x 个,第二行均匀分布 y 个,如图
- 平面格式: 用三个不同的数组来表示 3 个分量,分开存储,这类似于存储/编址顺序的问题,如 YUV420p(i420)
- 压缩格式: 用一个数组表示 YCbCr,每个分量交替出现
YUV 与 RGB 互转
-
常规转换标准
[egin{bmatrix} R \ G \ B end{bmatrix} = egin{bmatrix} 1 & 0 & 1.370705 \ 1 & -0.337633 & -0.698001 \ 1 & 1.732446 & 0 end{bmatrix} egin{bmatrix} Y\U\V end{bmatrix} \ egin{bmatrix} Y\U\V end{bmatrix} = egin{bmatrix} 0.29882 & 0.58681 & 0.114363 \ -0.172485 & -0.338718 & 0.511207 \ 0.51155 & -0.42811 & -0.08343 end{bmatrix} egin{bmatrix} R \ G \ B end{bmatrix} ] -
BT.601 标准,用于 SDTV
[egin{bmatrix} R \ G \ B end{bmatrix} = egin{bmatrix} 1.0 & 0.0 & 1.13983 \ 1.0 & -0.39465 & -0.5806 \ 1.0 & 2.03211 & 0.0 end{bmatrix} egin{bmatrix} Y\U\V end{bmatrix} \ egin{bmatrix} Y\U\V end{bmatrix} = egin{bmatrix} 0.299 & 0.587 & 0.114 \ -0.14713 & -0.28886 & 0.436 \ 0.615 & -0.51499 & -0.10001 end{bmatrix} egin{bmatrix} R \ G \ B end{bmatrix} ]例:雷老师博客上的一段代码
y = (unsigned char)( ( 66 * r + 129 * g + 25 * b + 128) >> 8) + 16 ; u = (unsigned char)( ( -38 * r - 74 * g + 112 * b + 128) >> 8) + 128 ; v = (unsigned char)( ( 112 * r - 94 * g - 18 * b + 128) >> 8) + 128 ; // https://blog.csdn.net/leixiaohua1020/article/details/50534150
与上述公式相符,其中 (Y in [16,235], U in [0,255], V in [0,255])(没搞明白为啥又出来个 16-235-255 还是我算错了?)
-
BT.709 标准,用于 HDTV
[egin{bmatrix} R \ G \ B end{bmatrix} = egin{bmatrix} 1.0 & 0.0 & 1.28033 \ 1.0 & -0.21482 & -0.38059 \ 1.0 & 2.12798 & 0.0 end{bmatrix} egin{bmatrix} Y\U\V end{bmatrix} \ egin{bmatrix} Y\U\V end{bmatrix} = egin{bmatrix} 0.2126 & 0.7152 & 0.0722 \ -0.09991 & -0.33609 & 0.436 \ 0.615 & -0.55861 & -0.05639 end{bmatrix} egin{bmatrix} R \ G \ B end{bmatrix} ] -
BT.2020 标准,……
References
视音频数据处理入门:RGB、YUV像素数据处理_雷霄骅(leixiaohua1020)的专栏-CSDN博客
附录:代码与公式验证的运算过程
>> a=[66 129 25]
a =
66 129 25
>> b=[0.299 0.587 0.114]
b =
0.2990 0.5870 0.1140
>> a-(235-16)*b
ans =
0.5190 0.4470 0.0340
>> b2=[-0.14713 -0.28886 0.436]
b2 =
-0.1471 -0.2889 0.4360
>> a2=[-38 -74 112]
a2 =
-38 -74 112
>> a2-(240-16)*b2
ans =
-5.0429 -9.2954 14.3360
>> a1-(235-16+1)*b1
ans =
0.2200 -0.1400 -0.0800
>> a2-(240-16+1)*b2
ans =
-4.8957 -9.0065 13.9000
>> a2-(235-16+1)*b2
ans =
-5.6314 -10.4508 16.0800
>> a2-(255-16+1)*b2
ans =
-2.6888 -4.6736 7.3600
>> a2-(255-0+1)*b2
ans =
-0.3347 -0.0518 0.3840
>>