YUV转RGB公式

一、转换公式:

Jack, Keith. Video Demystified: a Handbook for the Digital Engineer, LLH
Technology Publishing, 3rd Edition, 2001.
BT601:

Y' = 0.257R' + 0.504G' + 0.098B' + 16
Cb' = -0.148R' - 0.291G' + 0.439B' + 128
Cr' = 0.439R' - 0.368G' - 0.071B' + 128
R' = 1.164(Y' - 16) + 1.596*(Cr' - 128)
G' = 1.164*(Y' - 16) - 0.813*(Cr' - 128) - 0.392*(Cb' - 128)
B' = 1.164*(Y' - 16) + 2.017*(Cb' - 128)


BT709:

Y' = 0.183R' + 0.614G' + 0.062B' + 16
Cb' = -0.101R' - 0.338G' + 0.439B' + 128
Cr' = 0.439R' - 0.399G' - 0.040B' + 128
R' = 1.164(Y' - 16) + 1.793*(Cr' - 128)
G' = 1.164*(Y' - 16) - 0.534*(Cr' - 128) - 0.213*(Cb' - 128)
B' = 1.164*(Y' - 16) + 2.115*(Cb' - 128)

二、 BT601 和 BT709

一般来讲,我们把YUV、Y‘UV、YCbCr, YPbPr包含在YUV颜色模型的范围内,其中Y都表示亮度,UV表示两个色度分量,但是具体的颜色模型的用途又各不相同,当然,他们与RGB的互转公式也就不相同。在电视系统发展的早期,YUV和Y’UV都是颜色信息的模拟信号编码形式,虽然Y和Y’都表示亮度,但是两种亮度的意义却天差地别,Y用来代指luminance,表示的是自然颜色的亮度,而Y‘代指luma,表示的是经过伽马压缩之后电信号的强度。在现在的计算机系统中,YUV一般用来代指YCbCr,用来表示文件的编码格式,用于数字视频的编码,而YPbPr颜色模型常常用在模拟分量视频中。所以YUV颜色模型到RGB颜色模型的转换,应该对应两种方式,分别是模拟YUV->模拟RGB、数字YUV->数字RGB。不过因为标清、高清、以及超清幅面,YUV转RGB的权重值各不相同,需要将模拟信号和数字信号再做一次幅面划分,就出现了6种转换公式。

1.模拟YUV→模拟RGB
1) BT601(标清国际定义SDTV)
Y = 0.299 * R + 0.587 * G + 0.114 * B   
Pb =-0.169 * R - 0.331 * G + 0.500 * B
Pr = 0.500 * R - 0.439 * G - 0.081 * B
R = Y + 1.402* Pr             
G = Y - 0.344 * Pb - 0.714* Pr        
B = Y + 1.772 * Pb
2)BT709(高清HDTV)
Y = 0.213 * R + 0.715 * G + 0.072 * B     
Pb =-0.115 * R - 0.385 * G + 0.500 * B
Pr = 0.500 * R - 0.454 * G - 0.046 * B
R = Y + 1.574* Pr            
G = Y - 0.187* Pb -0.468* Pr       
B = Y + 1.856 * Pb

3)BT2020(超高清UDTV)

2. 数字YUV→数字RGB

RGB[0-255] ←→ Y[16-235],UV[16,240]

1)BT601
Y = 16 + 0.257 * R + 0.504 * G+ 0.098 * B
Cb = 128 - 0.148 * R - 0.291 * G+ 0.439 * B
Cr = 128 + 0.439 * R - 0.368 * G - 0.071 * B
R = 1.164 *(Y - 16) + 1.596 *(Cr - 128)
G = 1.164 *(Y - 16) - 0.392 *(Cb - 128) - 0.812 *(Cr - 128)
B = 1.164 *(Y - 16) + 2.016 *(Cb - 128)
即:
R = 1.164 * Y + 1.596 * Cr - 222.912
G = 1.164 * Y - 0.392 * Cb - 0.812 * Cr + 135.488
B = 1.164 * Y + 2.016 * Cb - 276.672
2)BT709
Y = 16 + 0.183 * R + 0.614 * G + 0.062 * B
Cb = 128 - 0.101 * R - 0.339 * G+ 0.439 * B
Cr = 128 + 0.439 * R - 0.399 * G- 0.040 * B
R = 1.164 *(Y - 16) + 1.792 *(Cr - 128)
G = 1.164 *(Y - 16) - 0.213 *(Cb - 128) - 0.534 *(Cr - 128)
B = 1.164 *(Y - 16) + 2.114 *(Cb - 128)
即:
R = 1.164 * Y + 1.792 * Cr - 248
G = 1.164 * Y - 0.213 * Cb - 0.534 * Cr + 114.24
B = 1.164 * Y + 2.144 * Cb - 289.216
3. 超清幅面的计算公式,可以按照下面的推导公式推导
1)模拟RGB转YUV的推导公式 :

Wr + Wg + Wb = 1; UMax = 0.5; VMax = 0.5
Y = Wr * R + Wg * G + Wb * B;
Pb = Umax * (B - Y) / (1 - Wb);
Pr = Vmax * (R - Y) / (1 - Wr);

2)数字RGB转YUV的推导公式:

Wr + Wg + Wb = 1; Umax = Vmax = 0.5;
Y = 16 + 219 * (Wr * R + Wg * G + Wb * B) / 255;
Cb = 128 + 224 * (Umax * (B - Y) / (1 - Wb)) / 255;
Cr = 128 + 224 * (Vmax * (R - Y) / (1 - Wr)) / 255;
其中:
BT601 Wr = 0.299 Wg = 0.587 Wb = 0.114
BT709 Wr = 0.2126 Wg = 0.7152 Wb = 0.0722
BT2020 Wr = 0.2627 Wg = 0.678 Wb = 0.0593
参考链接:总结各种RGB转YUV的转换公式_rgb转yuv公式-CSDN博客

=============================================================分割线

三、各种标准转换矩阵

r2y_limit_range_601 = np.array([
[ 0.257, 0.504, 0.098],
[-0.148, -0.291, 0.439],
[ 0.439, -0.368, -0.0714]])

y2r_limit_range_601 = np.array([
[1.1644, 0.0, 1.5958],
[1.1644, -0.3938, -0.8130],
[1.1644, 2.0172, -0.0]])

r2y_full_range_601 = np.array([
[ 0.299, 0.587, 0.114],
[-0.1687, -0.3313, 0.5],
[ 0.5, -0.4187, -0.0813]])

y2r_full_range_601 = np.array([
[1.0, -0.0, 1.402],
[1.0, -0.3441, -0.7141],
[1.0, 1.772, -0.0]])

r2y_limit_range_709 = np.array([
[ 0.1826, 0.6142, 0.0620],
[-0.1006, -0.3386, 0.4392],
[ 0.4392, -0.3989, -0.0403]])

y2r_limit_range_709 = np.array([
[1.1644, 0.0, 1.7927],
[1.1644, -0.2132, -0.5329],
[1.1644, 2.1124, -0.0]])

r2y_full_range_709 = np.array([
[ 0.2126, 0.7152, 0.0722],
[-0.1146, -0.3854, 0.500],
[ 0.500, -0.4542, -0.0458]])

y2r_full_range_709 = np.array([
[1.0, 0.0, 1.5748],
[1.0, -0.1873, -0.4681],
[1.0, 1.8556, 0.0]]
)

r2y_limit_range_2020 = np.array([
[0.2256, 0.5823, 0.0509],
[-0.1227, -0.3166, 0.4392],
[0.4392, -0.4039, -0.0353]
])

y2r_limit_range_2020 = np.array([
[1.1644, -0.0, 1.6787],
[1.1644, -0.1873, -0.6504],
[1.1644, 2.1418, 0.0]])

r2y_full_range_2020 = np.array([
[ 0.2627, 0.6780, 0.0593],
[-0.1396, -0.3604, 0.500],
[ 0.500, -0.4598, -0.0402]
])

y2r_full_range_2020 = np.array([
[1.0, -0.0, 1.4746],
[1.0, -0.1646, -0.5714],
[1.0, 1.8814, -0.0]]
)


四、Opencv

COLOR_YUV2BGR、COLOR_YUV2RGB: 就用BT.470标准

COLOR_YCrCb2BGR、COLOR_YCrCb2RGB: 使用BT.601 模拟转换

COLOR_YUV2BGRA_NV21、COLOR_YUV2RGBA_NV21、COLOR_YUV2BGRA_NV12、COLOR_YUV2RGBA_NV12:使用BT.0601数字转换。YUV[16~235]→RGB[0~255]

R = 1.164(Y - 16) + 1.596(V - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
B = 1.164(Y - 16)                  + 2.018(U - 128)

R = (1220542(Y - 16) + 1673527(V - 128)                  + (1 << 19)) >> 20
G = (1220542(Y - 16) - 852492(V - 128) - 409993(U - 128) + (1 << 19)) >> 20
B = (1220542(Y - 16)                  + 2116026(U - 128) + (1 << 19)) >> 20

【OpenCV】【YUV】OpenCV中YUV颜色空间变换到RGB颜色空间的转换公式_opencv yuv转rgb可以选709颜色空间吗-CSDN博客
深入探讨YUV图像处理:理论原理与OpenCV实践_基于yuv的图像处理-CSDN博客              

五、 其他参考信息

RGB to YUV Conversion

Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

B = 1.164(Y - 16) + 2.018(U – 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U – 128)
R = 1.164(Y - /16) + 1.596(V - 128)
参考链接:https://www.fourcc.orgfccyvrgb.php

=============================================================分割线

The RGB2YCrCb function uses the following equations when converting gamma-corrected RGB data to YCrCb data:

Y’ = 0.257R’ + 0.504G’ + 0.098B’ + 16
Cr = 0.439R’ – 0.368G’ – 0.071B’ + 128
Cb = –0.148R’ – 0.291G’ + 0.439B’ + 128
The YCrCb2RGB function uses the following equations when converting YCrCb data to RGB data:
R’ = 1.164(Y’– 16) + 1.596(Cr – 128)
G’ = 1.164(Y’– 16) – 0.813(Cr – 128) – 0.392(Cb – 128)
B’ = 1.164(Y’– 16) + 2.017(Cb – 128)
参考链接:https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ds/rgb.pdf?wapkw=color space

==================================================================分割线

1. (BT601) 下的YUV与RGB转换公式

名词解释:
量化后: 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
未量化: Y~ [0,1] U,V~[-0.5,0.5]
YUV :即 YCbCr 两者是等价的

1.小数形式,未量化( U~[-0.5-0.5] , R~[0,1] )

R = Y + 1.4075 * V;
G = Y - 0.3455 * U - 0.7169*V;
B = Y + 1.779 * U;

Y = 0.299R + 0.587G + 0.114*B;
U = (B-Y)/1.772;
V = (R-Y)/1.402;

或写为:
Y = 0.299R + 0.587G + 0.114B;
U = -0.169
R - 0.331*G + 0.5 B ;
V = 0.5 R - 0.419G – 0.081
B;

2.整数形式(减少计算量)未量, R,G,B~[0,255] U,V~[-128,128]

R= Y + ((360 * (V - 128))>>8) ;
G= Y - (( ( 88 * (U - 128) + 184 * (V - 128)) )>>8) ;
B= Y +((455 * (U - 128))>>8) ;

Y = (77R + 150G + 29B)>>8;
U = ((-44
R - 87G + 131B)>>8) + 128;
V = ((131R - 110G - 21*B)>>8) + 128 ;

3. 量化后的公式( Y~(16,235) U/V ~(16,240) ) 量化 ( I420 , YUV422 用该公式转换即可 )

[Y,U,V,1]T= M[R,G,B,1]T 其中 M =
[ 0.2568, 0.5041, 0.0979, 16
-0.1479, -0.2896, 0.4375, 128
0.4375, -0.3666, -0.0709, 128,
0, 0, 0, 1 ]
[R,G,B,1]T = M[Y,U,V,1]T  其中M =
1.1644 0 1.6019 -223.5521
1.1644 -0.3928 -0.8163 136.1381
1.1644 2.0253 0 -278.0291
0.0000 0.0000 0.0000 1.0000
由此可以得到红色的YUV分量 YUV = ( 81,91,240 )

4. 量化后的公式写成整数的形式(减小计算量) ( Y~(16,235) U/V ~(16,240) )

yuv --> rgb
R = (298Y + 411 * V - 57344)>>8
G= (298
Y - 101* U- 211* V+ 34739)>>8
B= (298Y + 519 U- 71117)>>8
rgb --> yuv
Y= ( 66R + 129G + 25B)>>8 + 16
U= (-38
R - 74G + 112B)>>8 +128
V= (112R - 94G - 18*B)>>8 + 128

5. YUV量化与非量化互转

YUV 量化转非量化
Y=(Y’-16 )*255/219 ;
U=(U’-128)*128/112;
V=(V’-128)*128/112;

YUV 非量化转量化 U~(-128-127) -----> U~(16-240)
Y’= ((219Y)>>8) + 16;
U’= ((219
U)>>8) + 128;
V’=((219*V)>>8) + 128;

2. Rec2020 (BT2020) 下的YUV与RGB转换公式
1. BT2020 文档上的公式

Y = 0.2627R + 0.6780G + 0.0593B;
U = -0.1396
R - 0.3604G + 0.5B;
V = 0.5R - 0.4598G -0.0402*B;
矩阵形式
量化前
[Y,U,V]T= M[R,G,B]T 其中 M =0.2627 0.6780 0.0593 , -0.1396 -0.3604 0.5000, 0.5000 -0.4598 -0.0402
[R,G,B]T= M[Y,U,V]T 其中 M =1.0000 -0.0000 1.4746 1.0000 -0.1645 -0.5713 1.0000 1.8814 -0.0001
量化后
[Y,U,V,1]T= M[R,G,B,1]T 其中 M = 0.2256, 0.5823, 0.05093, 16, -0.1222, -0.3154, 0.4375, 128 , 0.4375, -0.4023, -0.0352, 128, 0,0,0,1
[R,G,B,1]T =M[Y,U,V,1]T 其中 M =1.1644, 0, 1.6853, -234.3559, 1.1644, -0.1881, -0.6529, 89.0206, 1.1646, 2.1501, 0.0000, -293.8542, 0.0000, 0.0000, 0.0000, 1.0000
量化后的公式写成整数形式
[Y,U,V,1]T= (M[R,G,B,1]T)>>8其中 M = 58, 149, 13, 4096, -31, -81, 112, 32768, 112, -103, -9, 32768, 0, 0, 0, 256
[R,G,B,1]T = (M[Y,U,V,1]T)>>8其中 M = 298, 0, 431, -59995, 298, -48, -167, 22789, 298, 550, 0, -75227, 0, 0, 0, 256

2. BT601 转 BT2020

_Y = (256Y - 32U -30V+ 7826)>>8;
_U = (258
U +17V - 2208)>>8;
_V = (22
U + 264*V - 3369)>>8;

3. bt2020 转bt601

YUV_601 = M*[Y,U,V,1]T
M=[
1.0000 0.1157 0.1037 -28.0756
0.0000 0.9951 -0.0602 8.3197
-0.0000 -0.0835 0.9767 13.6686
0.0000 0.0000 0.0000 1.0000
]
参考链接:https://www.cnblogs.com/luoyinjie/p/7219319.html
另外参考链接:
BT601官方文档:BT.601 : Studio encoding parameters of digital television for standard 4:3 and wide screen 16:9 aspect ratios
BT709官方文档:BT.709 : Parameter values for the HDTV standards for production and international programme exchange
维基百科:https://en.wikipedia.org/wiki/YCbCr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值