轉載自:http://blog.csdn.net/skdev/article/details/65830281
簡介
YUV是種顏色編碼方法,是彩色電視為了兼容黑白電視而發展起來的。在現代彩色電視系統中,通常采用三管彩色攝影機或彩色CCD攝影機進行取像,然后把取得的彩色圖像信號經分色、分別放大校正后得到RGB,再經過矩陣變換電路得到亮度信號Y和兩個色差信號R-Y(即U)、B-Y(即V),然后對這三個信號分別進行編碼。Y就是所謂的流明(luminance),表示光的濃度且為非線性,使用伽馬修正(gamma correction)編碼處理,而CB和CR則為藍色和紅色的濃度偏移量成份。

2 YUV采樣格式
(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 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。
下面八個像素為:[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]
3 YUV 存儲格式
YUV格式分為packed格式和planar格式,packed格式會將YUV數據按順序放進數組里,planar則分將YUV的數據分為三部分放進數組里,即先放Y部分的數據,再放U,接著是V的數據。
3.1 Packed YUV Formats
Label |
Bits per pixel |
Description |
AYUV |
32 |
Combined YUV and alpha |
CLJR |
8 |
Cirrus Logic format with 4 pixels packed into a u_int32. A form of YUV 4:1:1 wiht less than 8 bits per Y, U and V sample. |
cyuv |
16 |
Essentially a copy of UYVY except that the sense of the height is reversed - the image is upside down with respect to the UYVY version. |
GREY |
8 |
Apparently a duplicate of Y800 (and also, presumably, "Y8 ") |
IRAW |
? |
Intel uncompressed YUV. I have no information on this format - can you help? |
IUYV |
16 |
Interlaced version of UYVY (line order 0, 2, 4,....,1, 3, 5....) registered by Silviu Brinzei of LEAD Technologies. |
IY41 |
12 |
Interlaced version of Y41P (line order 0, 2, 4,....,1, 3, 5....) registered by Silviu Brinzei of LEAD Technologies. |
IYU1 |
12 |
12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec. This is equivalent to Y411 |
IYU2 |
24 |
24 bit format used in mode 0 of the IEEE 1394 Digital Camera 1.04 spec |
HDYC |
16 |
YUV 4:2:2 (Y sample at every pixel, U and V sampled at every second pixel horizontally on each line). A macropixel contains 2 pixels in 1 u_int32. This is a suplicate of UYVY except that the color components use the BT709 color space (as used in HD video). |
UYNV |
16 |
A direct copy of UYVY registered by NVidia to work around problems in some old codecs which did not like hardware which offered more than 2 UYVY surfaces. |
UYVP |
24? |
YCbCr 4:2:2 extended precision 10-bits per component in U0Y0V0Y1 order. Registered by Rich Ehlers of Evans & Sutherland. (Awaiting confirmation of component packing structure) |
UYVY |
16 |
YUV 4:2:2 (Y sample at every pixel, U and V sampled at every second pixel horizontally on each line). A macropixel contains 2 pixels in 1 u_int32. |
V210 |
32 |
10-bit 4:2:2 YCrCb equivalent to the Quicktime format of the same name. |
V422 |
16 |
I am told that this is an upside down version of UYVY. |
V655 |
16? |
16 bit YUV 4:2:2 format registered by Vitec Multimedia. I have no information on the component ordering or packing. |
VYUY |
? |
ATI Packed YUV Data (format unknown but you can get hold of a codec supporting ithere) |
Y422 |
16 |
Direct copy of UYVY as used by ADS Technologies Pyro WebCam firewire camera. |
YUY2 |
16 |
YUV 4:2:2 as for UYVY but with different component ordering within the u_int32 macropixel. |
YUYV |
16 |
Duplicate of YUY2 |
YUNV |
16 |
A direct copy of YUY2 registered by NVidia to work around problems in some old codecs which did not like hardware which offered more than 2 YUY2 surfaces. |
YVYU |
16 |
YUV 4:2:2 as for UYVY but with different component ordering within the u_int32 macropixel. |
Y41P |
12 |
YUV 4:1:1 (Y sample at every pixel, U and V sampled at every fourth pixel horizontally on each line). A macropixel contains 8 pixels in 3 u_int32s. |
Y411 |
12 |
YUV 4:1:1 with a packed, 6 byte/4 pixel macroblock structure. |
Y211 |
8 |
Packed YUV format with Y sampled at every second pixel across each line and U and V sampled at every fourth pixel. |
Y41T |
12 |
Format as for Y41P but the lsb of each Y component is used to signal pixel transparency . |
Y42T |
16 |
Format as for UYVY but the lsb of each Y component is used to signal pixel transparency . |
YUVP |
24? |
YCbCr 4:2:2 extended precision 10-bits per component in Y0U0Y1V0 order. Registered by Rich Ehlers of Evans & Sutherland. |
Y800 |
8 |
Simple, single Y plane for monochrome images. |
Y8 |
8 |
Duplicate of Y800 as far as I can see. |
Y16 |
16 |
16-bit uncompressed greyscale image. |
UYVY存儲結構
UYVY 是一種最常用的 YUV 4:2:2 格式,其數據排列如下:

3.2 Planar YUV Formats
Label |
Bits per pixel |
Description |
YVU9 |
9 |
8 bit Y plane followed by 8 bit 4x4 subsampled V and U planes. Registered by Intel. |
YUV9 |
9? |
Registered by Intel., this is the format used internally by Indeo video code |
IF09 |
9.5 |
As YVU9 but an additional 4x4 subsampled plane is appended containing delta information relative to the last frame. (Bpp is reported as 9) |
YV16 |
16 |
8 bit Y plane followed by 8 bit 2x1 subsampled V and U planes. |
YV12 |
12 |
8 bit Y plane followed by 8 bit 2x2 subsampled V and U planes. |
I420 |
12 |
8 bit Y plane followed by 8 bit 2x2 subsampled U and V planes. |
IYUV |
12 |
Duplicate FOURCC, identical to I420. |
NV12 |
12 |
8-bit Y plane followed by an interleaved U/V plane with 2x2 subsampling |
NV21 |
12 |
As NV12 with U and V reversed in the interleaved plane |
IMC1 |
12 |
As YV12 except the U and V planes each have the same stride as the Y plane |
IMC2 |
12 |
Similar to IMC1 except that the U and V lines are interleaved at half stride boundaries |
IMC3 |
12 |
As IMC1 except that U and V are swapped |
IMC4 |
12 |
As IMC2 except that U and V are swapped |
CLPL |
12 |
Format similar to YV12 but including a level of indirection. |
Y41B |
12? |
Weitek format listed as "YUV 4:1:1 planar". I have no other information on this format. |
Y42B |
16? |
Weitek format listed as "YUV 4:2:2 planar". I have no other information on this format. |
Y800 |
8 |
Simple, single Y plane for monochrome images. |
Y8 |
8 |
Duplicate of Y800 as far as I can see. |
CXY1 |
12 |
Awaiting clarification of format. |
CXY2 |
16 |
Awaiting clarification of format. |
Y42B存儲結構
YCbCr 4:2:2 的方式存儲

4 YUV與RGB的轉換關系
yuv422 planar to rgb565
轉換公式:
R=Y+1.4075*(V-128)
G=Y-0.3455*(U-128) - 0.7169*(V-128)
B=Y+1.779*(U-128)
為了加快運算速度,采用下面的整形計算法:
u = YUVdata[UPOS] - 128;
v = YUVdata[VPOS] - 128;
rdif = v + ((v * 103) >> 8);
invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
bdif = u +( (u*198) >> 8);
r = YUVdata[YPOS] + rdif;
g = YUVdata[YPOS] - invgdif;
b = YUVdata[YPOS] + bdif;
r=r>255?:255:(r<0:?0:r);
g=g>255?:255:(g<0:?0:g);
b=b>255?:255:(b<0:?0:b);
以上得到的是rgb888的數據,再將rgb888轉為rgb555
RGBdata[1] =( (r & 0xF8) | ( g >> 5) );
RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
YUV422 Planar FORMAT size:
size=width*height*2;
YSIZE = size/2;
USIZE = size/4;
VSIZE = size/4;
YPOS=0;
UPOS=YPOS + size/2;
VPOS=UPOS + size/4;