1簡介
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;