rgb轉YCrCb

YCrCb

    YCrCb在視頻壓縮和一些數字圖像處理中使用得比較多,是一種基於人眼感知的顏色空間。

  在OpenCV中,從RGB空間轉換到YCrCb空間的公式如下:

  

  注意從RGB到YcrCb的公式並不是唯一的,

    例如一般使用的公式如下:

    // Y  = 0.2990R + 0.5870G + 0.1140B
    // Cb = -0.1687R - 0.3313G + 0.5000B + 128
    // Cr = 0.5000R - 0.4187G - 0.0813B + 128

  其中的delta的取值爲:

   

  這裏我們以RGB三通道都爲8bit來舉例說明,即delta取128。通過上面的公式推導,可以求出Y的取值範圍爲(0, 255),Cr的取值範圍爲(0.54768, 255.452315),Cb的取值範圍爲(0.57548, 255.42452)。因此我們有很大的理由近似認爲Y,Cr,Cb的取值範圍都近似爲(0, 255)。

  從上面的公式可以看出,如果圖像是全黑的,即R=G=B=0,則可以算出Y=0,Cr=Cb=128,特別要注意的是此時的Cr,Cb並不爲0。

 

YUV色彩空間:
       Y是亮度值,也就是說8位的灰度值即可組成一幅黑白圖像,黑白電視機就是這樣的.
       UV是色彩值,是給Y上色用的.U是Cb也就是RGB中的藍色分量,V是Cr也就是RGB中的紅色分量.
       YUV444 指的是每四個像素採樣中每個亮度Y分量都有一個色彩UV分量上色.
       YUV422 指的是每四個像素採樣中兩個亮度Y分量都有一個色彩UV分量上色.
       YUV420 指的是每四個像素採樣中四個亮度Y分量都有一個色彩UV分量上色.

ITU-R BT.601 建議書裏面記載了五種色彩變換式,分別是:

1. 模擬 RGB 訊號轉爲模擬 Y, (B-Y), (R-Y)
2. 模擬 (B-Y), (R-Y) 轉爲模擬 Cb, Cr
3. 模擬 YCbCr 數字化(取樣、量化)成爲數字 YCbCr
4. 模擬 RGB 數字化(取樣、量化)成爲數字 RGB
5. 數字 RGB 轉爲數字 YCbCr

1. 的變換式是

Y = 0.299 * R + 0.587 * G + 0.114 * B 

(R - Y) = R - 0.299 * R - 0.587 * G - 0.114 * B 
= 0.701 * R - 0.587 * G - 0.114 * B 

(B - Y) = B - 0.299 * R - 0.587 * G - 0.114 * B 
  = - 0.299 * R - 0.587 * G + 886 * B 

2. 的變換式是

Cr = 0.713 * (R - Y) 
  = 0.500 * R - 0.419 * G - 0.081 * B 

Cb = 0.564 * (B - Y) 
  = - 0.169 * R - 0.331 * G + 0.500 * B 

就是你寫的那個變換式。
上式 Y, R, G, B 的範圍是 0.0~1.0,Cb, Cr 的範圍是 0.5~-0.5。

模擬的 CbCr 通常表記爲 PbPr。

由於這些表記的方法很亂,常有人會混合着用,所以寫的時候最好註明是模擬還是數字,例如
3. 的模擬 YCbCr 數字化轉換式
Y(d) = 219 * Y(a) + 16 
Cb(d) = 224 * Cb(a) + 128 
Cr(d) = 224 * Cr(a) + 128 

Y(a) 代表 analog,Y(d) 代表 digital。

4. 的模擬 RGB 數字化轉換式
R(d) = 219 * R(a) + 16 
G(d) = 219 * G(a) + 16 
B(d) = 219 * B(a) + 16 

R(a), G(a), B(a) 的範圍是 0.0~1.0,R(d), G(d), B(d) 的範圍是 16~235。

加上 (a), (d),這樣表記就清楚多了。

5. 的數字 RGB 轉爲數字 YCbCr
Y = (77 * R(d) / 256) + (150 * G(d) / 256) + (29 * B(d) / 256) 
Cb = - (44 * R(d) / 256) - (87 * G(d) / 256) + (131 * B(d) / 256) + 128 
Cr = (131 * R(d) / 256) - (110 * G(d) / 256) - (21 * B(d) / 256) + 128 

YCbCr: 16~235, RGB: 16~235

這個轉換式是 straight 變換,沒有 YC 伸張(Full-range,擴展 RGB: 0~255),有 YC 伸張的算式就是你提出的我以前寫的那個算式。

這個表記法有點複雜,有的教科書在介紹亮度和色差的時候前面就先花了很多篇幅在定義表記的用法,例如我上面寫的還是不及格,因爲 BT.601 的 RGB 都要先經過 gamma correction,是 gamma 校正後的 RGB,要表記爲 R'G'B' ^^;
還有那個 Y,是 BT.601 的 Y,所以 Y 的右下角要加上一個底字寫 601,或者左上角要寫 601,這樣人家才知道你是 BT.601 定義的 Y,不是 BT.709 定義的 Y ^^;;

由於名詞太多有點亂,許多人會混合着用,同樣一個 YUV,有時候我們搞不清楚作者指的到底是數字的 YCbCr,還是模擬的 YPbPr,是 NTSC 的 YIQ,還是 PAL 的 YUV,是 601 的 YUV,還是 709 的 YUV,或者是 SMPTE 240M 的 YUV .... XD

有的時候作者在表記上沒有明寫,不過根據上下文意,我們可以猜出他說的是哪一個。
您看的那本書 ;) 有註明列的是 ITU-R recommendation BT.601 [1] 的 YCbCr 轉換式,所以是模擬轉換式,不是 BT.601-5。
當然用比較通用的 PbPr 來表示模擬色差是比較清楚的寫法。

ITU 的建議書(recommendation)只要登記成爲會員,每年都可以免費下載三本,601, 709, H.263 ..等等都可以免費下載 :D
http://www.itu.int/publications/bookshop/index.html

 

由 source code 可以得知,XviD 和大部分的軟件一樣是遵照這本書的標準轉換式作的
http://www.video-demystified.com/book1/index.htm
算式爲

Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16

Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128

Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

這個算式是模擬 YCbCr 和模擬 RGB 的轉換式,這是很多人會被弄迷糊的地方。


轉自http://hi.baidu.com/xiaojian009/blog/item/6d03930c203a9fc67bcbe19e.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章