作者 / Snail_YC
原文链接: juejin.cn/post/684490…
YUV
YUV 是一种颜色编码方法,Y 代表明亮度,U 和 V 则是色度。YUV 是一类颜色编码方法的统称,如 YUV、Y`UV、YCbCr、YPbPr 等专有名词都可以称为 YUV。
历史
Y'UV 的发明是由于黑白电视到彩色电视的过渡时期。黑白视频只有 Y 数据,也就是灰阶值,到了彩色电视时期,增加了 UV 表示图像的色度(U 代表蓝色通道与亮度的差值,V 代表红色通道与亮度的差值),如果忽略了 UV,那么剩下的 Y 信号就与之前的黑白电视表现一致,这样便解决了黑白电视和彩色电视的兼容问题。
RGB 诉求于人眼对色彩的感应,YUV 则着重于视觉对于亮度的敏感程度。因此 YUV 可以通过降低色度的采样率来减少带宽而不会对图像产生大的影响。
YUV Formats
YUV 格式通常有两类:
- packed formats:打包格式,每个像素点的 Y、U、V 混合在一起存放,类似 RGB 的存放方式。
- planar formats:平面格式,将一帧图像的 Y、U、V 以独立的平面组织,存放在不同的数组中。
根据不同的采样方式分为 YUV4:4:4、YUV4:2:2、YUV4:2:0、YUV4:1:1 等,代表 Y:U:V。
- YUV4:4:4 表示完整采样,保持了 UV 分量的完整信息。
- YUV4:2:2 表示色度分量具有 2:1的水平采样,垂直完全采样。
- YUV4:2:0 表示色度分量具有 2:1的水平采样,2:1的垂直采样,YUV4:2:0 并不是指只有 U,没有 V,而是对于每一行,只有一个 U 或者 V 分量,如果第一行是 4:2:0,那么下一行就是 4:0:2,以此类推。
- YUV4:1:1 表示色度分量具有 4:1的水平采样,垂直完全采样。
常见的 YUV 存储方式
YUV420P: I420/YU12/YV12
YUV420P 属于 YUV4:2:0 采样,是一种 Plane 模式,将 Y、U、V 分量分别打包,依次存储。YU12 与 I420 相同,而 YV12 与 YU12 的区别仅仅是 UV 顺序不同。
在 I420/YU12 格式中,是以 Y平面-> U 平面-> V 平面的方式排列的,即 YUV;YV12 则相反,以 Y平面-> V 平面-> U 平面的方式排列,即 YVU。
排列举例:
- I420/YU12:
- 2*2图像 YYYYUV
- 4*4图像 YYYYYYYYYYYYYYYYUUUUVVVV
- YV12:
- 2*2图像 YYYYVU
- 4*4图像 YYYYYYYYYYYYYYYYVVVVUUUU
YU12 取名代表 Y 后面紧跟 U,YV12 则相反,12 代表它位深 12,在 2*2 图像中,一共四个像素点,占用 6 个字节,则每个像素占用空间 12 bit。
YUV420SP: NV12/NV21
YUV420P 属于 YUV4:2:0 采样,是一种 Two-Plane 模式,即 Y 和 UV 分为两个平面,UV 为交错存储。NV12 和 NV21 类似,区别仅是 UV 顺序不同。
在 NV12 格式中,是以 Y平面-> UV平面(以 UV 的方式交错存储);NV21 则相反,以 Y平面-> UV平面(以 VU 的方式交错存储)。
排列举例:
- NV12:
- 2*2图像 YYYYUV
- 4*4图像 YYYYYYYYYYYYYYYYUVUVUVUV
- NV21:
- 2*2图像 YYYYVU
- 4*4图像 YYYYYYYYYYYYYYYYVUVUVUVU
YUV 和 RGB 的转换
首先说下 YCbCr,YCbCr 是被 ITU 定义在标准 ITU-R BT.601(标清)、ITU-R BT.709(高清)、ITU-R BT.2020(超高清)中的一种色彩空间, 是一种针对 RGB 所做的编码,是 YUV 压缩和偏移的版本,YCbCr 通常用于视频和图像压缩和传输,在视频编解码中的"YUV 图像"指的就是 YCbCr。
对于 YCbCr 和 RGB 的转换来说,不同的标准有不同的方式,并且有时候需要区分 Video Range[16-235] 和 Full Range[0-255]。
为方便计算机运算和优化,下列提供定点化后的公式,默认使用 ITU-R BT.601 Video Range。
ITU-R BT.601 标准:
- RGB 转 YCbCr (Video Range):
⎣⎡YCbCr⎦⎤=⎣⎡16128128⎦⎤+⎣⎡0.257−0.1480.4390.504−0.291−0.3680.0980.439−0.071⎦⎤∗⎣⎡RGB⎦⎤
定点化后:
Y=Cb=Cr=16+((66∗R+129∗G+25∗B+128)>>8)128+((−38∗R−74∗G+112∗B+128)>>8)128+((112∗R−94∗G−18∗B+128)>>8)
- YCbCr 转 RGB (Video Range):
⎣⎡RGB⎦⎤=⎣⎡1.1641.1641.1640.000−0.3922.0171.596−0.8130.000⎦⎤∗⎣⎡(Y−16)(Cb−128)(Cr−128)⎦⎤
定点化后:
限制范围[0,255]R=(298∗(Y−16)+409∗(Cr−128)+128)>>8G=(298∗(Y−16)−100∗(Cb−128)−208∗(Cr−128)+128)>>8B=(298∗(Y−16)+516∗(Cb−128)+128)>>8
- RGB 转 YCbCr (Full Range):
⎣⎡YCbCr⎦⎤=⎣⎡0128128⎦⎤+⎣⎡0.299−0.1690.5000.587−0.331−0.4190.1140.500−0.0813⎦⎤∗⎣⎡RGB⎦⎤
定点化后:
Y=Cb=Cr=((77∗R+150∗G+29∗B+128)>>8)128+((−43∗R−85∗G+128∗B+128)>>8)128+((128∗R−107∗G−21∗B+128)>>8)
- YCbCr 转 RGB (Full Range):
⎣⎡RGB⎦⎤=⎣⎡1.0001.0001.0000.000−0.3441.7721.4020.7140.000⎦⎤∗⎣⎡Y(Cb−128)(Cr−128)⎦⎤
定点化后:
限制范围[0,255]R=(Y+359∗(Cr−128)+128)>>8G=(Y−88∗(Cb−128)+183∗(Cr−128)+128)>>8B=(Y+454∗(Cb−128)+128)>>8
ITU-R BT.709 标准:
- RGB 转 YCbCr (Video Range):
⎣⎡YCbCr⎦⎤=⎣⎡16128128⎦⎤+⎣⎡0.183−0.1010.4390.614−0.339−0.3990.0620.439−0.040⎦⎤∗⎣⎡RGB⎦⎤
定点化后:
Y=Cb=Cr=16+((47∗R+157∗G+16∗B+128)>>8)128+((−26∗R−87∗G+112∗B+128)>>8)128+((112∗R−102∗G−10∗B+128)>>8)
- YCbCr 转 RGB (Video Range):
⎣⎡RGB⎦⎤=⎣⎡1.1641.1641.1640.000−0.2132.1121.793−0.5340.000⎦⎤∗⎣⎡(Y−16)(Cb−128)(Cr−128)⎦⎤
定点化后:
限制范围[0,255]R=(298∗(Y−16)+459∗(Cr−128)+128)>>8G=(298∗(Y−16)−55∗(Cb−128)−137∗(Cr−128)+128)>>8B=(298∗(Y−16)+541∗(Cb−128)+128)>>8
- RGB 转 YCbCr (Full Range):
⎣⎡YCbCr⎦⎤=⎣⎡0128128⎦⎤+⎣⎡0.213−0.1170.5110.715−0.394−0.4640.0720.511−0.047⎦⎤∗⎣⎡RGB⎦⎤
定点化后:
Y=Cb=Cr=((55∗R+183∗G+19∗B+128)>>8)128+((−30∗R−101∗G+130∗B+128)>>8)128+((130∗R−119∗G−12∗B+128)>>8)
- YCbCr 转 RGB (Full Range):
⎣⎡RGB⎦⎤=⎣⎡1.0001.0001.0000.000−0.1831.8161.540−0.4590.000⎦⎤∗⎣⎡Y(Cb−128)(Cr−128)⎦⎤
定点化后:
限制范围[0,255]R=(Y+394∗(Cr−128)+128)>>8G=(Y−47∗(Cb−128)−118∗(Cr−128)+128)>>8B=(Y+465∗(Cb−128)+128)>>8
参考
en.wikipedia.org/wiki/YUV
en.wikipedia.org/wiki/YCbCr
zhuanlan.zhihu.com/p/28766366