?? !精![color]深入學習ycbcr色彩模型.txt
字號:
學習色彩模型
[Color]深入學習YCbCr色彩模型
最近突然又對圖形學有了興趣,翻出了多年前學習圖形學的筆記,感觸良多。于是將它們整理好發了上來。
一、基礎
RGB轉YCbCr的轉換是這樣的:
[Y ] = [ 0.299 0.587 0.114 ] [R] [ 0]
[Cb] = [-0.1687 -0.3313 0.5 ] * [G] + [128]
[Cr] = [ 0.5 -0.4187 -0.0813] [B] [128]
YCbCr轉RGB的轉換是這樣的:
[R] = [1 0 1.402 ] [ Y ]
[G] = [1 -0.34414 -0.71414] * [Cb-128]
[B] = [1 1.772 0 ] [Cr-128]
二、那些變換系數是如何推導出來的?
看到“YCbCr轉RGB”中計算R、B的那些零沒有,把它們精簡掉:
R = Y + 1.402*(Cr-128) //這里的1.402和1.772先不管怎么回事。下邊再看。
B = Y + 1.772*(Cb-128)
利用“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.402*(Cr-128)] - 0.114*[Y + 1.772*(Cb-128)]} / 0.587
= {Y - [0.299*Y + 0.299*1.402*(Cr-128)] - [0.114*Y + 0.114*1.772*(Cb-128)]} / 0.587
= [(1 - 0.299 - 0.114)*Y - 0.299*1.402*(Cr-128) - 0.114*1.772*(Cb-128)] / 0.587
= Y - (0.299*1.402 / 0.587)*(Cr-128) - (0.114*1.772 / 0.587)*(Cb-128)
= Y - 0.714136*(Cr-128) - 0.344136*(Cb-128)
●現在只是不明白神奇的1.772、1.402了,將它們代入“RGB轉YCbCr”看看:●
Cb: 1.772 * [-0.1687 -0.3313 0.5 ] = [-0.2989364 -0.5870636 0.886 ] ≈ [ -0.299 -0.587 1-0.114]
Cr: 1.402 * [ 0.5 -0.4187 -0.0813] = [ 0.701 -0.5870174 -0.1139826] ≈ [1-0.299 -0.587 -0.114]
0.5看起來很明了,我們用 0.5 與 0.299、0.587、0.114 可以推導出那兩個常數:
Cb2b * 0.5 = 1-0.114
Cr2R * 0.5 = 1-0.299
Cb2b = 2*(1-0.114) = 1.772
Cr2R = 2*(1-0.299) = 1.402
用矩陣計算“RGB轉YCbCr”很慢,我們可根據“YCbCr轉RGB”逆推:
Cb = (1 / 1.772)*(B - Y) + 128 = [1 / (2*(1-0.114))]*(B - Y) + 128 = (1/2)*[1 / (1-0.114)]*(B - Y) + 128
Cr = (1 / 1.402)*(R - Y) + 128 = [1 / (2*(1-0.299))]*(R - Y) + 128 = (1/2)*[1 / (1-0.299)]*(R - Y) + 128
啊哈!現在理解 1-0.114、1-0.299 的由來了吧:當 B為1、R和G為0 時,(B-Y) 為 (1-0.114) = 0.886;當 B為0、R和G為1 時,(B-Y) 為 (0-0.886) = -0.886。所以需要除以(1-0.114)將結果縮放。
但是,我們一般需要結果在 0~255 這樣的字節范圍內,所以需要乘以(1/2),再加上128
所以YCbCr完全是根據 0.299、0.587、0.114 這幾個常數推導出來的。
三、整數算法
先將前面的成果列出來。
RGB轉YCbCr:
Y = 0.299*R + 0.587*G + 0.114*B
Cb = (1 / 1.772)*(B - Y) + 128
Cr = (1 / 1.402)*(R - Y) + 128
YCbCr轉RGB:
R = Y + 1.402*(Cr-128)
B = Y + 1.772*(Cb-128)
G = Y - (0.299*1.402 / 0.587)*(Cr-128) - (0.114*1.772 / 0.587)*(Cb-128)
可以看出,Cb、Cr、R、B 的計算就是用乘法縮放數值,完全可以數組查表,甚至那個加減128可以在查表時優化掉。
至于Y的計算,請參考《彩色轉灰度算法徹底學習》。
唯一麻煩一點的是G,因為它有兩個乘法,直接整數查表恐怕不精確。所以可以考慮將數值縮放65536倍(16位精度)。
大概是這樣:
Y = (R*19595 + G*38469 + B*7472) >> 16
Cb = YCbCr_B2Cb[0x100 + B - Y]
Cr = YCbCr_R2Cr[0x100 + R - Y]
R = Y + YCbCr_Cr2R[Cr]
B = Y + YCbCr_Cb2B[Cb]
G = Y - ((YCbCr_Cr2G[Cr] + YCbCr_Cb2G[Cb]) >> 16)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -