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.168736
R - 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.168736
R - 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值