1. 程式人生 > >YUV 與 RGB 顏色格式

YUV 與 RGB 顏色格式

最近在學習視訊的顏色空間轉換,由於攝像機拍出來的視訊很多都是用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