YUV 转换

https://blog.csdn.net/liyuanbhu/article/details/68951683

在 Keith Jack’s 的书 “Video Demystified” (ISBN 1-878707-09-4) 给出的公式是这样的。

RGB to YUV 

YCr=VCb=U===0.257R+0.504G+0.098B+160.439R−0.368G−0.071B+128−0.148R−0.291G+0.439B+128Y=0.257R+0.504G+0.098B+16Cr=V=0.439R−0.368G−0.071B+128Cb=U=−0.148R−0.291G+0.439B+128

YUV to RGB 

BGR===1.164(Y−16)+2.018(U−128)1.164(Y−16)−0.813(V−128)−0.391(U−128)1.164(Y−16)+1.596(V−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)

注意在上面的式子中,RGB 的范围是 [0,255][0,255],Y 的范围是 [16,235][16,235] ,UV 的范围是 [16,239][16,239]。 如果计算结果超出这个范围就截断处理。

CCIR 601 定义的转换公式是:

YCr=VCb=U===0.299R+0.587G+0.114B0.713(R−Y)=0.500R−0.419G−0.081B0.564(B−Y)=−0.169R−0.331G+0.500BY=0.299R+0.587G+0.114BCr=V=0.713(R−Y)=0.500R−0.419G−0.081BCb=U=0.564(B−Y)=−0.169R−0.331G+0.500B

RGB===Y+1.403VY−0.344U−0.714VY+1.770UR=Y+1.403VG=Y−0.344U−0.714VB=Y+1.770U

这里 RGB 的取值范围是 [0,1][0,1]。 Y 的范围是 [0,1][0,1], Cr 和 Cb 的范围是 [−0.5,0.5][−0.5,0.5]。

大家仔细看,这两个来源给出的公式系数有些细微的差别,如果将公式中的 YUV 和 RGB 的取值范围统一成相同的,计算出的结果也略有不同,但是差异很小,基本上眼睛看不出区别来。所以大家不用计较这两个公式的区别。

如果把 RGB 和YUV 的范围都放缩到 [0,255][0,255],那么常用的转换公式是这样的。 

RGB===Y+1.403×(V−128)Y–0.343×(U–128)–0.714×(V–128)Y+1.770×(U–128)R=Y+1.403×(V−128)G=Y–0.343×(U–128)–0.714×(V–128)B=Y+1.770×(U–128)

RGB 到 YUV 的转换公式变化很小,只是VU 的值做了个平移。 

YCr=VCb=U===0.299R+0.587G+0.114B0.500R−0.419G−0.081B+128−0.169R−0.331G+0.500B+128Y=0.299R+0.587G+0.114BCr=V=0.500R−0.419G−0.081B+128Cb=U=−0.169R−0.331G+0.500B+128

上面的公式涉及到浮点运算,可以转换成整数运算来加速:

u = U - 128; 
v = V - 128;
R = qRound(0, Y + v + (v * 103) >> 8, 255);
G = qRound(0, Y – (u * 88) >> 8 – (v * 183) >> 8, 255);
B = qRound(0, Y + u + (u * 198) >> 8, 255);

猜你喜欢

转载自blog.csdn.net/funkidd/article/details/81699516
YUV