2020-11-27

总结各种RGB转YUV的转换公式

如果数据位宽都以8位来说.
ITU709:允许 0~255之间所有数据
ITU601:只允许 16~235之间数据,

601是SDTV的数据结构; 656是SDTV的interface
709是HDTV的数据结构 ;1120是HDTV的interface

最近在学习视频的颜色空间转换,由于摄像机拍出来的视频很多都是用YUV格式保存的,而颜色空间的转换必须在RGB颜色模型上才能完成,所以第一步自然就是将YUV颜色模型转成RGB颜色模型。在网上查到了许多的YUV与RGB互转的公式,但是总觉得有些杂乱,没有系统的总结。

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

1.模拟YUV->模拟RGB

  1) BT601(标清国际定义)

1

2

3

4

5

6

7

8

//*********************BT601***********************************//

//  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.792* Pr                 //

//  B = Y + 1.772 * Pb                                 //

//*********************BT601***********************************//

  2)BT709(高清)

1

2

3

4

5

6

7

8

//*********************BT601***********************************//

//  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.402* Cr                                 //

//  G = Y - 0.344 * Cb  - 0.792* Cr                 //

//  B = Y + 1.772 * Cb                                 //

//*********************BT601***********************************//

2 数字YUV->数字RGB

  1)BT601

1

2

3

4

5

6

7

8

//*********************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)                    //

//*********************BT601***********************************//

  2)BT709

1

2

3

4

5

6

7

8

//*********************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)                    //

//*********************BT709***********************************//

至于超清幅面的计算公式,大家可以按照下面的推导方式自己推导一下。

模拟RGB转YUV的推导公式 : 

1

2

3

4

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);

  

数字RGB转YUV的推导公式:

1

2

3

4

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

上一篇:Vue纯前端表格导出excel


下一篇:使用DIR函数合并多个文件的数据——Excel之VBA(10)