YUV图像格式
采样格式
YUV 4:4:4
图像格式为:(×为Y,圈为U或V)
每个Y对应一个U和一个V
采样码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
映射出的图像为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
与RGB占用的存储空间一样
YUV4:2:2
图像格式为:
每两个个Y对应一个U和一个V
采样码流为:Y0 U0 Y1 V1 Y2 U2 Y3 U3
映射出的图像为:[Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
U和V各减少一半,可比RGB节省1/3空间
YUV4:2:0
图像格式为:
每四个Y对应一个U和一个V,2:1水平采样,2:1垂直采样。
采样码流为:(4:2:0和4:0:2交替进行)
Y0 U0 Y1 Y2 U2 Y3 (两个Y,一个U)
Y5 V5 Y6 Y7 V7 Y8(两个Y,一个V)
映射出的图像为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
U和V各减少3/4,可比RGB节省一半空间
YUV4:1:1
与YUV4:2:0相似,只是采样方式不同,采用4:1水平采样,垂直完全采样。
采样码流为:
Y0 U0 Y1 Y2 V2 Y3
Y5 U5 Y6 Y7 V7 Y8
映射出的的图像为:
[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
[Y5 U5 V7] [Y6 U5 V7] [Y7 U5 V7] [Y8 U5 V7]
存储格式
平面格式(planar format)
先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的V,即:YYYYUUUUVVVV
打包格式(packed format)
每个像素点的 Y、U、V 是连续交错存储,即YUVYUVYUVYUV
格式类型
YUYV、YUY2、YUNV
这几个是相同的格式(Oencv里COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2 = COLOR_YUV2RGB_YUYV)
属于YUV422,packed,数据格式为:Y0 U0 Y1 V0 Y2 U2 Y3 V2
UYVY
(Opencv里Y422默认是这种格式COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY)
属于YUV422,packed,与YUYV排列格式相反:U0 Y0 V0 Y1 U2 Y2 V2 Y3
YUV422P
属于YUV422,planer,数据格式为:Y0 Y1 Y2 Y3 U0 U1 V0 V1
YUV420P
属于YUV420,planer,其中按照U和V的不同先后顺序,可分为YU12和YV12:
YU12
属于YUV420,planer,先存储U,再存储V:Y0 … Y7 U0 U1 V0 V1
YV12
属于YUV420,planer,先存储V,再存储U:Y0 … Y7 V0 V1 U0 U1
YUV420SP
属于YUV420,基于planer,但U、V分量交替排列,按照UV的先后不同,可分为NV12和NV21:
NV12(IOS中的模式)
属于YUV420,基于planer,UV交替排列,先存U,再存V:Y0 … Y7 U0 V0 U1 V1
NV21(Android中的模式)
属于YUV420,基于planer,UV交替排列,先存V,再存U:Y0 … Y7 V0 U0 V1 U1
IYUV、I420
即YUV420P,YU12格式
YUV与YCbCr、YPbPr
YPbPr是YUV基于缩放(scaled)和偏移(shift)所产生,而YCbCr是基于YPbPr信号进行量化得到。
YUV、YPbPr用于模拟系统,如彩电,YCbCr用于数字系统,如数字视频
YCbCr中的Y与YUV中的Y含义一致,Cb、Cr同样都指色彩,只是在表示方法上不同。
YCbCr是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG中用的YUV实际上是YCbCr。一般人们所讲的YUV大多是指YCbCr。
YCbCr中的Y指亮度,Cb指蓝色色度分量,Cr指红色色度分量。
RGB与YUV转换公式
YUV是由RGB推导计算而来的。基本公式为:
Y’ = kr R’ + (1-kb-kr)G’ + kb B’
U’ = B’-Y’ = -kr R’ - (1-kb-kr)G’ + (1 - kb)B’ //亮度与蓝色分量的差值
V’ = R’-Y’ = (1-kr)R’ - (1-kb-kr)G’ - kb B’ //亮度与红色分量的差值
其中kr,kb的取值大小取决于色彩空间标准
逆转换:
R’ = Y’ + (1-kr)/0.5 * V’
G’ = Y’ - 2kb(1-kb)/(1-kb-kr) * U’ - 2kr(1-kr)/(1-kb-kr) * V’
B’ = Y’ + (1-kb)/0.5 * U’
为了限制值域范围,需要对U和V的值进行缩放,于是:
Y’ = kr R’ + (1-kb-kr)G’ + kb B’
Pb = (Umax / (1 - kb)) * (B’ - Y’)
Pr = (Vmax / (1 - kr)) * (R’ - Y’)
其中Y~ [0, 1],U~ [-Umax, Umax], V~ [-Vmax, Vmax]
不同的色差空间标准,所规定的kb、kr权值不同
常用的标准有BT.601, BT.709(网络视频使用最多), BT.2020(用于HDR等广色域)等。根据值域范围,每个标准下面还可能有Full Range和Limited Range格式,如Full Range值域为[0, 255], Limited Range为Y ~ [16, 235], UV ~ [16, 240]。
BT.601标准
kr = 0.229
kb = 0.114
kg = 1 - kr - kb = 0.587
Umax = 0.5
Vmax = 0.5
RGB to YCrCb
将上述参数代入计算后:
Y = 0.299R + 0.587G + 0.114B
Pb = 0.564 * (B - Y) = -0.168736R - 0.331264G + 0.5B
Pr = 0.713 * (R - Y) = 0.5R - 0.418688G - 0.081312*B
(JPEG使用的标准为601 Full Range,即上面的公式)
其中Y~ [0,1]; U,V~[-0.5,0.5]; R, G, B ~ [0, 1]
为了解决浮点精度问题,Y、Cb、Cr分量被scaled为8bit整数(uint8),其中Y~[0, 255], Cb/Cr ~[-128, 128]。但为了解决滤波后的过冲现象,Y分量被scale到[16, 235],Cb/Cr分量被scale到[16, 240]。并根据值域进行平移,保证各个分量为正数(8bit系统里一般是按照这个值域设置)。
于是:
Y = (235 - 16) * (0.299R + 0.587G + 0.114B) + 16
Cb = (240 - 16) * ( -0.168736R - 0.331264G + 0.5B)+ 128
Cr = (240 - 16) * ( 0.5R - 0.418688G - 0.081312*B) + 128
化简后即为:
Y = 65.481 * R + 128.553 * G + 24.966 * B + 16
Cb = -37.797 * R - 74.203 * G + 112.0 * B + 128
Cr = 112.0 * R - 93.786 * G - 18.214 * B + 128
其中,上面公式的RGB~[0, 1]
若RGB ~[0, 255],需进行缩放,即RGB需除以255:(以Y为例)
Y = 65.481 * R / 255 + 128.553 * G / 255 + 24.966 * B / 255 + 16
为了方便计算,通常将分母设成256,并将系数乘以256 / 255,即:
Y = (65.481 * 256 / 255) * R / 256 + (128.553 * 256 / 255) * G / 256 + (24.966 * 256 / 255)* B / 256 + 16
于是各分量计算公式为:
Y = (65.738 * R + 129.057 * G + 25.064 * B) / 256
Cb = ((-37.945 * R - 74.494 * G + 112.439 * B) / 256) + 128
Cr = ((112.439 * R - 94.154 * G - 18.285 * B) / 256) + 128
以上即为 ITU-R BT.601中的转换公式
其中YUV的值域范围分别为[16, 235], [16, 240], [16, 240]
(Opencv 中的cvtColor使用的是上面的公式,一般渲染器里面也是使用的上述公式?)
YCrCb to RGB
根据上面的公式,对应的逆转公式为:
R = (298.082 * Y + 408.583 * Cr) / 256 - 222.921
G = (298.082 * Y - 100.291 * Cb - 208.120 * Cr) / 256 + 135.576
B = (298.082 * Y + 516.412 * Cb) / 256 - 276.836
BT.709
kb = 0.0722
kr = 0.2126
kg = 0.7152
RGB to YUV
Full Range:
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
Cb = - 0.114572 * R - 0.385428 * G + 0.5 * B
Cr = 0.5 * R - 0.454153 * G - 0.045847 * B
其中RGB~[0, 1],YUV ~ [0, 1]
Limite Range:
Y = 46.559 * R + 156.629 * G + 15.812 * B + 16(乘(235-16),加16)
Cb = - 25.664 * R - 86.336 * G + 112 * B + 128(乘224,加128)
Cr = 112 * R - 101.730 * G - 10.270 * B + 128(乘224,加128)
其中RGB~[0, 1],Y ~ [16, 235], UV ~ [16, 240]
YUV to RGB
Full Range:
R = Y + 1.5748 * V
G = Y - 0.187324 * U - 0.468124 * V
B = Y + 1.8556
其中RGB~[0, 1],YUV ~ [0, 1]
BT.2020
kb = 0.0593
kr = 0.2627