转载自: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;