色彩空间
我们经常用到的色彩空间主要有RGB、YUV, CMYK, HSB, HSL等等,其中YUV和RGB是视讯通信领域用的较多的二种色彩空间。
RGB
RGB的所谓 多少 就是指亮度,并使用整数来表示。
在用8位表示时,RGB各有256级亮度,用数字量化表示为从0、1、2...直到255。
注意虽然数字最高是255,但0也是数值之一,因此共256级。
YUV
YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。
如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。
彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
YCbCr
YCbCr是被ITU定义在标准 ITU-R BT.601(标清),ITU-R BT.709(高清),ITU-R BT.2020(超高清) 中的一种色彩空间,用于数字电视系统。
YCbCr不是一种绝对色彩空间,是一种针对RGB所做的编码,是YUV压缩和偏移的版本,其中 Y 与 YUV 中的 Y 含义一致,Cb,Cr 同样都指色彩,只是在表示方法上不同而已,Cb,Cr是差值。
在视频通信系统中(特别是视频编解码)的“YUV”图像就是YCbCr。在平常的工作交流中,所称的YUV也是YCbCr。
Y = Kry · R + Kgy · G + Kby · B (R,G,B代表RGB色彩空间的红色,绿色,蓝色)
Cb = B – Y (Cb是差值)
Cr = R – Y (Cr是差值)
Kry + Kgy + Kby = 1(K 是比值或称权重, BT.601, BT.709,BT.2020中的权重是不同的。)
上面的公式中
Kru = - Kry;
Kgu = - Kgy;
Kbu = 1 - Kby;
Krv = 1 – Kry;
Kgv = -Kgy;
Kbv = -Kby
关于为什么要量化?
YUV是模拟信号,Y的取值范围是0到1伏。
未量化YUV取值 :
Y ~ [0,1]
U,V ~ [-0.5,0.5]
包括未量化 :
Y ∈ [0,1]
U ∈ [-0.5,0.5] (-0.436,0.436)
V ∈ [-0.5,0.5] (-0.615,0.615)
量化后 :
Y ∈ [16,235]
U ∈ [16,240]
V ∈ [16,240]
从YUV 转到 RGB 如果值小于0要取0,如果大于255要取255
1.众所周知,RGB的范围是【0,255】;
如果把R=0,G=0,B=255 带入公式 U = -0.169 * R - 0.331 * G + 0.5 * B;
得到的U = 127.5, 而char的范围是【-128,127】,无法表示到127.5,
那么,我们就需要将 Y U V 数据进行量化;
2. 量化后,我们进行 RGB 转 YUV 的时候, 如果我们就要进行边界判断,
类似于 Y = Y_int < 0 ? 0 : (Y_int > 255 ? 255 : Y_int);
这个语句非常消耗CPU,如果 YUV 进行量化之后,那么RGB转YUV的时候就不需要进行边界判断;
3. 进行量化后,编码时压缩率变大,因为色阶数变少了
关于如何判断图像是否经过量化?
在完全黑画面的时候打印出图像的Y数据, 如果 Y=16 左右 说明Y经过量化, 如果Y=0左右 说明Y未经过量化。
Y ~ [16,235]
U ~ [16-240]
V ~ [16-240]
量化就是让通过线性变换让 Y 或 U 或 V 处于一定的范围内,
比如让 Y【0,1】变到 Y' (16,235) 就这样来实行:
Y' = Y *(235-16)/ (1-0) + 16 即 Y' = 219 * Y + 16
量化后的公式写成整数的形式(减小计算量)
YUV --> RGB
R = (298 * Y + 411 * V - 57344) >> 8
G = (298 * Y - 101 * U - 211 * V + 34739) >> 8
B = (298 * Y + 519 * U - 71117) >> 8
RGB --> YUV
Y = (66 * R + 129 * G + 25 * B) >> 8 + 16
U = (-38 * R - 74 * G + 112 * B) >> 8 + 128
V = (112 * R - 94 * G - 18 * B) >> 8 + 128
YUV420P 和 YUV420SP 的区别
YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
快速了解yuv4:4:4 yuv4:2:2 yuv 4:1:1 yuv 4:2:0四种YUV格式区别
主流的采样方式有三种,YUV4:4:4, YUV4:2:2, YUV4:2:0, YUV4:1:1
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
四种YUV格式区别如下:
1.YUV 4:4:4抽样方式:
Y: Y0 Y1 Y2 Y3
U: U0 U1 U2 U3
V: V0 V1 V2 V3
2.YUV 4:2:2抽样方式:
Y : Y0 Y1 Y2 Y3
U/V : U0 V1 U2 V3
3.YUV 4:2:0抽样方式:
Y: Y0 Y1 Y2 Y3 ... Yn-1 第一行n个像素
U: U0 U2
Y: Yn Yn+1 Yn+2 Yn+3 ... Y2n-1 第二行n个像素
V: Vn Vn+2
4.YUV 4:1:1抽样方式:
Y : Y0 Y1 Y2 Y3
U/V : U0 V2
参考连接
https://www.cnblogs.com/huxiaopeng/p/5653257.html
https://www.cnblogs.com/luoyinjie/p/7219319.html
网友评论