RGB、YUV和YCbCr三種顏色空間

[轉載] http://blog.sina.com.cn/s/blog_a85e142101010h8n.html
[轉載] http://blog.sina.com.cn/s/blog_5713096b0100059i.html
[轉載] http://www.fourcc.org/fccyvrgb.php
[參考] 數字圖像處理 Java語言算法描述清華大學出版社(美)伯格
————-12.2.4 電視顏色空間-YUV、YIQ和YCbCr

1、RGB、YUV和YCbCr三種顏色空間

首先要說明,RGB、YUV和YCbCr都是人爲規定的彩色模型或顏色空間(有時也叫彩色系統或彩色空間)。它的用途是在某些標準下用通常可接受的方式對彩色加以說明。本質上,彩色模型是座標系統和子空間的闡述。

1.1、RGB

RGB(紅綠藍)是依據人眼識別的顏色定義出的空間,可表示大部分顏色。但在科學研究一般不採用RGB顏色空間,因爲它的細節難以進行數字化的調整。它將色調,亮度,飽和度三個量放在一起表示,很難分開。它是最通用的面向硬件的彩色模型。該模型用於彩色監視器和一大類彩色視頻攝像

1.2、YUV

YUV是北美NTSC系統和歐洲PAL系統中模擬電視信號編碼的基礎。
在 YUV 空間中,每一個顏色有一個亮度信號 Y,和兩個色度信號 U 和 V。亮度信號是強度的感覺,它和色度信號斷開,這樣的話強度就可以在不影響顏色的情況下改變。
YUV 使用RGB的信息,但它從全綵色圖像中產生一個黑白圖像,然後提取出三個主要的顏色變成兩個額外的信號來描述顏色。把這三個信號組合回來就可以產生一個全綵色圖像。
Y 通道描述 Luma 信號,它與亮度信號有一點點不同,值的範圍介於亮和暗之間。 Luma 是黑白電視可以看到的信號。U (Cb) 和 V (Cr) 通道從紅 (U) 和藍 (V) 中提取亮度值來減少顏色信息量。這些值可以從新組合來決定紅,綠和藍的混合信號。

1.3、YCbCr

YCbCr 顏色空間是YUV的國際標準化變種,在數字電視和圖像壓縮(比如JPEG)方面都有應用。
YCbCr 是在世界數字組織視頻標準研製過程中作爲ITU - R BT1601 建議的一部分, 其實是YUV經過縮放和偏移的翻版。其中Y與YUV 中的Y含義一致, Cb , Cr 同樣都指色彩, 只是在表示方法上不同而已。在YUV 家族中, YCbCr 是在計算機系統中應用最多的成員, 其應用領域很廣泛,JPEG、MPEG均採用此格式。一般人們所講的YUV大多是指YCbCr

補充、YUV(YCbCr)採樣格式

主要的採樣格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比較常用,其含義爲:每個點保存一個 8bit 的亮度值(也就是Y值), 每 2 x 2 個點保存一個 Cr和Cb值, 圖像在肉眼中的感覺不會起太大的變化。所以, 原來用 RGB(R,G,B 都是 8bit unsigned) 模型, 每個點需要 8x3=24 bits, 而現在僅需要 8+(8/4)+(8/4)=12bits, 平均每個點佔12bits。這樣就把圖像的數據壓縮了一半。
上邊僅給出了理論上的示例,在實際數據存儲中是有可能是不同的,下面給出幾種具體的存儲形式:

(1)、 YUV 4:4:4

  YUV三個信道的抽樣率相同,因此在生成的圖像裏,每個象素的三個分量信息完整(每個分量通常8比特),經過8比特量化之後,未經壓縮的每個像素佔用3個字節。
  下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  存放的碼流爲: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

(2)、YUV 4:2:2

  每個色差信道的抽樣率是亮度信道的一半,所以水平方向的色度抽樣率只是4:4:4的一半。對非壓縮的8比特量化的圖像來說,每個由兩個水平方向相鄰的像素組成的宏像素需要佔用4字節內存(例如下面映射出的前兩個像素點只需要Y0、Y1、U0、V1四個字節)。
  下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  存放的碼流爲: Y0 U0 Y1 V1 Y2 U2 Y3 V3
  映射出像素點爲:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

(3)、 YUV 4:1:1

  4:1:1的色度抽樣,是在水平方向上對色度進行4:1抽樣。對於低端用戶和消費類產品這仍然是可以接受的。對非壓縮的8比特量化的視頻來說,每個由4個水平方向相鄰的像素組成的宏像素需要佔用6字節內存
  下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  存放的碼流爲: Y0 U0 Y1 Y2 V2 Y3
  映射出像素點爲:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

(4)、 YUV4:2:0

  4:2:0並不意味着只有Y,Cb而沒有Cr分量。它指得是對每行掃描線來說,只有一種色度分量以2:1的抽樣率存儲。相鄰的掃描行存儲不同的色度分量,也就是說,如果一行是4:2:0的話,下一行就是4:0:2,再下一行是4:2:0…以此類推。對每個色度分量來說,水平方向和豎直方向的抽樣率都是2:1,所以可以說色度的抽樣率是4:1。對非壓縮的8比特量化的視頻來說,每個由2x2個2行2列相鄰的像素組成的宏像素需要佔用6字節內存。
下面八個像素爲:
[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  [Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]
存放的碼流爲:
Y0 U0 Y1 Y2 U2 Y3
  Y5 V5 Y6 Y7 V7 Y8
映射出的像素點爲:
[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]

2、格式轉換

2.1、常用的小技巧

(1)、 RGB三個色值,如果都是0則顯示黑色;如果都是255則得到白色;如果是在0-255範圍內的等值的時候是沒有色相,是灰色的

(2)、 YCbCr422要將 Cb = 0x80 Cr = 0x80才能看到灰度圖。(有人會寫成YUV422,其實是YCbCr422)

這些小技巧,是可以通過下邊2.2.1節的轉換公式證明。

2.2、轉換公式

2.2.1、YCbCr與RGB的轉換

轉換公式一定要依據ITU的標準,常看到的是ITU.BT-601和ITU.BT-709。
這裏重點介紹ITU.BT-601[50]。
這裏寫圖片描述
這裏寫圖片描述

把上述矩陣展開成方程式,如下所示

   Y = 0.299 R + 0.587 G + 0.114 B
   Cb = -0.1687 R - 0.3313 G + 0.5 B + 128
   Cr = 0.5 R - 0.4187 G - 0.0813 B + 128

   R = Y + 1.402 (Cr-128)
   G= Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
   B= Y + 1.772 (Cb-128)

下邊的各個符號都帶了一撇,表示該符號在原值基礎上進行了伽馬校正,伽馬校正有助於彌補在抗鋸齒的過程中,線性分配伽馬值所帶來的細節損失,使圖像細節更加豐富。在沒有采用伽馬校正的情況下,暗部細節不容易顯現出來,而採用了這一圖像增強技術以後,圖像的層次更加明晰了。

    Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16
    Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128
    Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128
    R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
    G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)
    B' = 1.164*(Y’-16) + 2.017*(Cb'-128)

H264裏面的YUV應屬於YCbCr

2.2.2、YUV與RGB的轉換

假設已經經過伽馬校正,下邊的都是帶了一撇(包括圖片裏的)。
這裏寫圖片描述
這裏寫圖片描述
把上述矩陣展開成方程式,如下所示

    Y'= 0.299*R' + 0.587*G' + 0.114*B'
    U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y')
    V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')
    R' = Y' + 1.140*V'
    G' = Y' - 0.394*U' - 0.581*V'
    B' = Y' + 2.032*U'

是否上YUV與RGB轉換公式需要加上128偏移,保證正值,我還沒有相關的證據。

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