YUV格式

2019-09-27  本文已影响0人  一半浮沉

1,YUV420P

若视频帧的宽和高分别为w和h
1,一帧YUV420P像素数据一共占用w*h*3/2 Byte的数据;
2,其中前w*h Byte存储Y;
3,接着的w*h*1/4 Byte存储U;
4,最后w*h*1/4 Byte存储V。

eg:
先有一张分辨率为256x256图片,其中:
1,纯Y数据,分辨率为256x256;
2,纯U数据,分辨率为128x128;
3,纯V数据,分辨率为128x128;

如果想把YUV格式像素数据变成灰度图像,只需要将U、V分量设置成128即可。
这是因为U、V是图像中的经过偏置处理的色度分量。色度分量在偏置处理前的取值范围是-128至127,这时候的无色对应的是“0”值。经过偏置后色度分量取值变成了0至255,因而此时的无色对应的就是128了。

2,YUV444P

若视频帧的宽和高分别为w和h
1,一帧YUV444P像素数据一共占用w*h*3 Byte的数据;
2,前w*h Byte存储Y;
3,接着的w*h Byte存储U;
4,最后w*h Byte存储V;

eg:
先有一张分辨率为256x256图片,其中
1,Y,U,V各数据,分辨率为256x256

3,BMP格式:BMP采用的是小端(Little Endian)存储方式。这种存储方式中“RGB24”格式的像素的分量存储的先后顺序为B、G、R。由于RGB24格式存储的顺序是R、G、B,所以需要将“R”和“B”顺序作一个调换再进行存储。

BMP组成 |
---|---
BITMAPFILEHEADER |
BITMAPINFOHEADER |
RGB像素数据 |

typedef  struct  tagBITMAPFILEHEADER
{ 
unsigned short int  bfType;       //位图文件的类型,必须为BM 
unsigned long       bfSize;       //文件大小,以字节为单位
unsigned short int  bfReserverd1; //位图文件保留字,必须为0 
unsigned short int  bfReserverd2; //位图文件保留字,必须为0 
unsigned long       bfbfOffBits;  //位图文件头到数据的偏移量,以字节为单位
}BITMAPFILEHEADER; 
typedef  struct  tagBITMAPINFOHEADER 
{ 
long biSize;                        //该结构大小,字节为单位
long  biWidth;                     //图形宽度以象素为单位
long  biHeight;                     //图形高度以象素为单位
short int  biPlanes;               //目标设备的级别,必须为1 
short int  biBitcount;             //颜色深度,每个象素所需要的位数
short int  biCompression;        //位图的压缩类型
long  biSizeImage;              //位图的大小,以字节为单位
long  biXPelsPermeter;       //位图水平分辨率,每米像素数
long  biYPelsPermeter;       //位图垂直分辨率,每米像素数
long  biClrUsed;            //位图实际使用的颜色表中的颜色数
long  biClrImportant;       //位图显示过程中重要的颜色数
}BITMAPINFOHEADER;

4,RGB转YUV

Y= 0.299*R+0.587*G+0.114*B
U=-0.147*R-0.289*G+0.463*B
V= 0.615*R-0.515*G-0.100*B

**注意公式的由来,参考前两节

在转换的过程中有以下几点需要注意:

1) RGB24存储方式是Packed,YUV420P存储方式是Packed。
2) U,V在水平和垂直方向的取样数是Y的一半。

参考链接

上一篇 下一篇

猜你喜欢

热点阅读