對一種顔色進行編碼的方法統稱為"顔色空間"或"色域",RGB和YUV,都是顔色空間的種類,
Y'UV, YUV, YCbCr,YPbPr等專有名詞都可以稱為YUV,彼此有重疊
分量視訊信号(色差信号),通常采用YCbCr和YPbPr兩種辨別,
YUV(YCbCr)是525i/625i(480i/576i)隔行分量輸入接口
YPbPr是從480i到720p的分量輸入接口标準(不區分隔行和逐行),隔行分量端子和逐行分量端子共用,端子辨別為YPbPr,無論隔行還是逐行分量信号都從這個端口輸入。
Y'PbPr是為了滿足高品質視訊傳輸而設計的色彩分量形式及接口形式,采用并行傳輸的方式。PbPr也是由B'-Y'及R'-Y'經過限幅得到的,目前,這種接口多見于模拟分量錄像機、高清攝錄一體機及DVD播放機等。模拟分量傳輸繞過了PAL編碼與解碼,減輕了亮/色串擾等編解碼對圖像的損失,但傳輸距離受到限制。
Y'CbCr是數字電視标準化時,為了相容亮度、色差這種色彩編碼方式而采用的一種類似于Y'PbPr的分量形式。
YUV(亦稱YCrCb)是被歐洲電視系統所采用的一種顔色編碼方法(屬于PAL)。YUV主要用于優化彩色視訊信号的傳輸,使其向後相容老式黑白電視。主要用于電視系統以及模拟視訊領域,它将亮度資訊(Y)與色彩資訊(UV)分離,沒有UV資訊一樣可以顯示完整的圖像,隻不過是黑白的,這樣的設計很好地解決了彩色電視機與黑白電視的相容問題。與RGB視訊信号傳輸相比,它最大的優點在于隻需占用極少的帶寬(RGB要求三個獨立的視訊信号同時傳輸)。
其中“Y”表示明亮度(Luminance或Luma),也就是灰階值;
而“U”和“V”表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顔色。
“亮度”是通過RGB輸入信号來建立的,方法是将RGB信号的特定部分疊加到一起。“色度”則定義了顔色的兩個方面—色調與飽和度,分别用Cr和CB來表示。其中,Cr反映了GB輸入信号紅色部分與RGB信号亮度值之間的差異。而CB反映的是RGB輸入信号藍色部分與RGB信号亮度值之同的差異; YUV經常有另外的名字,YCbCr ,其中Y與YUV 中的Y含義一緻,Cb , Cr同樣都指色彩,,隻是在表示方法上不同而已,Cb Cr 就是本來理論上的“分量/色差”的辨別。C代表分量(是component的縮寫)Cr、Cb分别對應r(紅)、b(藍)分量信号,Y除了g(綠)分量信号,還疊加了亮度信号。
以下是标準公式
RGB 轉換成 YUV
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
YUV 轉換成 RGB
B =1.164(Y - 16) + 2.018(U - 128)
G =1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R =1.164(Y - 16) + 1.596(V - 128)
RGB取值範圍均為0~255,Y=0~255,U=-122~+122,V=-157~+157
以下是經過簡化的公式,運算量比上述公式要小一些。
RGB轉YUV
Y =0.299R + 0.587G + 0.114B
U'=(BY)*0.565
V'=(RY)*0.713
YUV轉RGB
R = Y+ 1.403V'
G = Y- 0.344U' - 0.714V'
B = Y+ 1.770U'
YUV碼流的存儲格式其實與其采樣的方式密切相關,主流的采樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0;
用三個圖來直覺地表示采集的方式吧,以黑點表示采樣該像素點的Y分量,以空心圓圈表示采用該像素點的UV分量。
先記住下面這段話,以後提取每個像素的YUV分量會用到。
YUV4:4:4采樣,每一個Y對應一組UV分量
YUV4:2:2采樣,每兩個Y共用一組UV分量
YUV4:2:0采樣,每四個Y共用一組UV分量
4:4:4 表示色度值(UV)沒有減少采樣。即Y,U,V各占一個位元組,加上Alpha通道一個位元組,總共占4位元組.這個格式其實就是24bpp的RGB格式了。
4:2:2 表示UV分量采樣減半,比如第一個像素采樣Y,U,第二個像素采樣Y,V,依次類推,這樣每個點占用2個位元組.二個像素組成一個宏像素.
4:2:0 這種采樣并不意味着隻有Y,Cb而沒有Cr分量,這裡的0說的U,V分量隔行才采樣一次。比如第一行采樣 4:2:0 ,第二行采樣 4:0:2 ,依次類推...在這種采樣方式下,每一個像素占用16bits或10bits空間.
4:1:1 可以參考4:2:2分量,是進一步壓縮,每隔四個點才采一次U和V分量。一般是第0點采Y,U,第1點采Y,第3點采YV,第四點采Y,依次類推。
下面我用圖的形式給出常見的YUV碼流的存儲方式,并在存儲方式後面附有取樣每個像素點的YUV資料的方法,其中,Cb、Cr的含義等同于U、V。
YUYV格式
YUYV為YUV422采樣的存儲格式中的一種,相鄰的兩個Y共用其相鄰的兩個Cb、Cr,分析,對于像素點Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00,其他的像素點的YUV取值依次類推。
UYVY格式
UYVY格式也是YUV422采樣的存儲格式中的一種,隻不過與YUYV不同的是UV的排列順序不一樣而已,還原其每個像素點的YUV值的方法與上面一樣。
YUV422P格式
YUV422P也屬于YUV422的一種,它是一種Plane模式,即打包模式,并不是将YUV資料交錯存儲,而是先存放所有的Y分量,然後存儲所有的U(Cb)分量,最後存儲所有的V(Cr)分量,如上圖所示。其每一個像素點的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即兩個Y共用一個UV。比如,對于像素點Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00。
YV12,YU12 格式
YU12和YV12屬于YUV420格式,也是一種Plane模式,将Y、U、V分量分别打包,依次存儲。其每一個像素點的YUV資料提取遵循YUV420格式的提取方式,即4個Y分量共用一組UV。注意,上圖中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次類推。
NV12,NV21格式
NV12和NV21屬于YUV420格式,是一種two-plane模式,即Y和UV分為兩個Plane,但是UV(CbCr)為交錯存儲,而不是分為三個plane。其提取方式與上一種類似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
I420格式
I420就是YUV420P格式;存儲方式參考YUV422P;
一般來說,直接采集到的視訊資料是RGB24的格式,RGB24一幀的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,如果是I420(即YUV标準格式4:2:0)的資料量是 size=width×heigth×1.5 Bit。
在采集到RGB24資料後,需要對這個格式的資料進行第一次壓縮。即将圖像的顔色空間由RGB2YUV。因為,X264在進行編碼的時候需要标準的YUV(4:2:0)。但是這裡需要注意的是,雖然YV12也是(4:2:0),但是YV12和I420的卻是不同的,在存儲空間上面有些差別。如下:
YV12:亮度(行×列)+U(行×列/4) +V(行×列/4)
I420:亮度(行×列)+V(行×列/4) +U(行×列/4)
可以看出,YV12和I420基本上是一樣的,就是UV的順序不同。
YUV420 planar資料,以720×488大小圖象YUV420 planar為例,其存儲格式是:共大小為(720×480×3>>1)位元組,
分為三個部分:Y,U和V
Y分量: (720×480)個位元組
U(Cb)分量:(720×480>>2)個位元組
V(Cr)分量:(720×480>>2)個位元組
三個部分内部均是行優先存儲,三個部分之間是Y,U,V 順序存儲。即YUV資料的
0 - 720×480位元組是Y分量值,
720×480 - 720×480×5/4位元組是U分量
720×480×5/4 - 720×480×3/2位元組是V分量。
4:2:2 和4:2:0 轉換:
最簡單的方式:
YUV4:2:2 --->YUV4:2:0 Y不變,将U和V信号值在行(垂直方向)在進行一次隔行抽樣。 YUV4:2:0 --->YUV4:2:2 Y不變,将U和V信号值的每一行分别拷貝一份形成連續兩行資料。