File:      StudyYUV.txt
Name:      深入學習YUV色彩模型
Author:    zyl910
Version:   V1.1
Updata:    2006-5-28


http://blog.csdn.net/zyl910/archive/2006/05/25/753814.aspx
  最近突然又對圖形學有了興趣,翻出了多年前學習圖形學的筆記,感觸良多。於是將它們整理好發了上來。



一、基礎


  RGB轉YUV的轉換是這樣的︰
[Y] = [ 0.299  0.587  0.114]   [R]
[U] = [-0.148 -0.289  0.437] * [G]
[V] = [ 0.615 -0.515 -0.100]   [B]



  YUV轉RGB的轉換是這樣的︰
[R] = [1  0      1.140]   [Y]
[G] = [1 -0.395 -0.581] * [U]
[B] = [1  2.032  0    ]   [V]


 


二、那些變換系數是如何推匯出來的?


  最開始,我是想找一個RGB與YUV轉換的快速算法,於是開始研究它的系數。


2.1 YUV轉RGB


  最先以YUV轉RGB為突破口。注意在轉換矩陣中有兩個0,所以可以去掉一次乘法︰
B = Y + 2.032*U
R = Y + 1.140*V


  利用“Y = 0.299*R + 0.587*G + 0.114*B”這個事實來推導G︰
G = (Y - 0.299*R - 0.114*B) / 0.587


  將B、R的計算公式代入並化簡︰
G = [Y - 0.299*(Y + 1.140*V) - 0.114*(Y + 2.032*U)] / 0.587
  = [Y - (0.299*Y + 0.299*1.140*V) - (0.114*Y + 0.114*2.032*U)] / 0.587
  = [(Y - 0.299*Y - 0.114*Y)- 0.299*1.140*V - 0.114*2.032*U] / 0.587
  = [(1 - 0.299 - 0.114)*Y - 0.299*1.140*V - 0.114*2.032*U] / 0.587
  = (0.587*Y - 0.299*1.140*V - 0.114*2.032*U) / 0.587
  = Y + (-0.299*1.140*V - 0.114*2.032*U) / 0.587
  = Y - (0.299*1.140 / 0.587)*V - (0.114*2.032 / 0.587)*U
  = Y - (0.114*2.032 / 0.587)*U - (0.299*1.140 / 0.587)*V
  = Y - 0.394630*U - 0.580681*V


  正好與YUV轉RGB的系數符合。
  完整的轉換公式︰
B = Y + 2.032*U
R = Y + 1.140*V
G = Y - (0.114*2.032 / 0.587)*U - (0.299*1.140 / 0.587)*V



2.2 RGB轉YUV
  從分析YUV轉RGB時,我們發現了兩個關鍵系數──與U有關的2.032 和 與V有關的1.140。所以我們拿它們去乘RGB轉YUV轉換矩陣的系數試試︰
U: 2.032 * [-0.148 -0.289  0.437] = [-0.300736 -0.587248  0.887984]
V: 1.140 * [ 0.615 -0.515 -0.100] = [ 0.701100 -0.587100 -0.114000]


  觀察這些系數,發現有兩個特點︰
  1.那些負數系數與“彩色轉灰度”系數(0.299、0.587、0.114)很相似。
  2.那個正數系數 正好等於 兩個負數系數之和的絕對值。


  所以我們可以將U、V部分的轉換矩陣看成這個樣子︰
U: (1 / 2.032) * [ -0.299 -0.587 1-0.114]
V: (1 / 1.140) * [1-0.299 -0.587  -0.114]


  完整的轉換公式︰
[Y] = [   0.299          0.587           0.114       ]   [R]
[U] = [( -0.299)/2.032 (-0.587)/2.032 (1-0.114)/2.032] * [G]
[V] = [(1-0.299)/1.140 (-0.587)/1.140 ( -0.114)/1.140]   [B]



  用矩陣計算“RGB轉YUV”很慢,我們可根據“YUV轉RGB”逆推︰
Y = 0.299*R + 0.587*G + 0.114*B
U = (1 / 2.032)*(B-Y)
V = (1 / 1.140)*(R-Y)



2.3 小結


  所謂的YUV色彩模型是由0.299、0.587、0.114、2.032、1.140這五個數字定義出來的,非常簡潔、精巧。但是這還不是最精巧的,YCbCr完全是由0.299、0.587、0.114這三個數字定義出來的,詳見《深入學習Ycbcr色彩模型》。


 


三、整數算法


  先將前面的成果列出來。
  RGB轉YUV︰
Y = 0.299*R + 0.587*G + 0.114*B
U = (1 / 2.032)*(B-Y)
V = (1 / 1.140)*(R-Y)


  YUV轉RGB︰
B = Y + 2.032*U
R = Y + 1.140*V
G = Y - (0.114*2.032 / 0.587)*U - (0.299*1.140 / 0.587)*V


  可以看出,U、V、R、B 的計算就是用乘法縮放數值,完全可以數組查表。
  至於Y的計算,請參考《彩色轉灰度算法徹底學習》。
  唯一麻煩一點的是G,因為它有兩個乘法,直接整數查表恐怕不精確。所以可以考慮將數值縮放65536倍(16位精度)。
  大概是這樣︰
Y = (R*19595 + G*38469 + B*7472) >> 16
U = YUV_B2U[0x100 + B - Y]
V = YUV_R2V[0x100 + R - Y]


B = Y + YUV_U2B[0x100 + U]
R = Y + YUV_V2R[0x100 + V]
G = Y - ((YUV_U2G[0x100 + U] + YUV_V2G[0x100 + V]) >> 16)


 

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()