YUV格式详解
What is YUV
YUV,是一種顏色編碼方法。
YUV是編譯true-color顏色空間(color space)的種類,Y'UV, YUV, YCbCr,YPbPr等專有名詞都可以稱為YUV,彼此有重疊。“Y”表示明亮度(Luminance、Luma),“U”和“V”則是色度、濃度(Chrominance、Chroma),Y'UV, YUV, YCbCr, YPbPr常常有些混用的情況,其中YUV和Y'UV通常用來描述模擬信號,而相反的YCbCr與YPbPr則是用來描述數位的影像信號,例如在一些壓縮格式內MPEG、JPEG中,但在現今,YUV通常已經在電腦系統上廣泛使用。
采樣和存儲方式
采樣方式
YUV碼流的存儲格式其實與其采樣的方式密切相關,主流的采樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0,關于其詳細原理,可以通過網上其它文章了解,這里我想強調的是如何根據其采樣格式來從碼流中還原每個像素點的YUV值,因為只有正確地還原了每個像素點的YUV值,才能通過YUV與RGB的轉換公式提取出每個像素點的RGB值,然后顯示出來。
用三個圖來直觀地表示采集的方式吧,以黑點表示采樣該像素點的Y分量,以空心圓圈表示采用該像素點的UV分量
先記住下面這段話,以后提取每個像素的YUV分量會用到
YUV4:4:4采樣,每一個Y對應一組UV分量。
YUV4:2:2采樣,每兩個Y共用一組UV分量。
YUV4:2:0采樣,每四個Y共用一組UV分量。
2.存儲方式
下面我用圖的形式給出常見的YUV碼流的存儲方式,并在存儲方式后面附有取樣每個像素點的YUV數據的方法,其中,Cb、Cr的含義等同于U、V。
(1) YUVY 格式 (屬于YUV422)
YUYV為YUV422采樣的存儲格式中的一種,相鄰的兩個Y共用其相鄰的兩個Cb、Cr,分析,對于像素點Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00,其他的像素點的YUV取值依次類推。
(2) UYVY 格式 (屬于YUV422)
UYVY格式也是YUV422采樣的存儲格式中的一種,只不過與YUYV不同的是UV的排列順序不一樣而已,還原其每個像素點的YUV值的方法與上面一樣。
(3) YUV422P(屬于YUV422)
YUV422P也屬于YUV422的一種,它是一種Plane模式,即打包模式,并不是將YUV數據交錯存儲,而是先存放所有的Y分量,然后存儲所有的U(Cb)分量,最后存儲所有的V(Cr)分量,如上圖所示。其每一個像素點的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即兩個Y共用一個UV。比如,對于像素點Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00。
(4)YV12,YU12格式(屬于YUV420)
YU12和YV12屬于YUV420格式,也是一種Plane模式,將Y、U、V分量分別打包,依次存儲。其每一個像素點的YUV數據提取遵循YUV420格式的提取方式,即4個Y分量共用一組UV。注意,上圖中,Y'00、Y'01、Y'10、Y'11共用Cr00
(5)NV12、NV21(屬于YUV420)
NV12和NV21屬于YUV420格式,是一種two-plane模式,即Y和UV分為兩個Plane,但是UV(CbCr)為交錯存儲,而不是分為三個plane。其提取方式與上一種類似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
內存中如何組織
為了方便后面敘述,圖片的大小定義為:w * h,寬高分別為w和h
一、YUV420格式
先Y,后V,中間是U。其中的Y是w * h,U和V是w/2 * (h/2)
如果w = 4,h = 2,則:
yyyy yyyy uu vv
內存則是:yyyyyyyyuuvv
需要占用的內存:w * h * 3 / 2
采樣規律是:每個像素點都采樣Y,寄數行采樣1/2個U,不采樣V,偶數行采樣1/2個V,不采樣U
二、YUV422格式
本格式使用較為廣泛
每兩個點為一組,共占用4個字節
YUYVYUYV…
對于每一組YUYV,前面一個Y和本組中的UV組成第一個點,第二個Y和本組中的UV組成第二個點
所以,在內存中,寬高分別為w * 2、h。
如果w = 4,h = 2,則:
YUYVYUYV YUYVYUYV
需要占用的內存:w * h * 2
三、UYUY422格式
本格式和YUYV422一樣,只是YUV的位置不一樣罷了
每組中YUV的排列順序為:UYUV
需要占用的內存:w * h * 2
總結
- 上一篇: POJ 1743 (后缀数组+不重叠最长
- 下一篇: 【转载】VS工具使用—&md