YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
在存储时YUV各占一个字节Byte,如果4:4:4方式,那一个256X256分辨率的图片要占用256×256×3=196608Byte,4:2:2方式要占用256×256×2=131072Byte,4:2:0方式要占用256×256×2/3=43690.7Byte,可以看到采用4:2:0方式存储空间整整减少了一半。
以YUV420为例说明:
图像像素数据:[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
采样的码流: Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 U7 Y8
映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
YU12/I420,YV12格式(属于YUV420)(planar方式存储,简称420p)
NV12,NV21 (属于YUV420) (planar和packed混合存储,简称420sp)
```java
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP //安卓Camera默认格式
```
YUV422P(属于YUV422)(planar方式存储)
YUYV/YUY2, YVYU,UYVY(属于YUV422)(packed方式存储)
灰度处理
//读取YUV文件(格式是NV12或NV21)
bool read_yuv_one(const string path_in,const string path_out) {
//读取YUV文件
FILE *in, *out;
in = fopen(path_in.c_str(), "rb");
out = fopen(path_out.c_str(), "rb");
//获取YUV文件的大小
fseek(in, 0L, SEEK_END);
int len = ftell(in);
fseek(in, 0L, SEEK_SET);
//创建缓存YUV文件的Buffer
char* buff = new char[len];
//读取YUV文件到Buffer
fread(buff, sizeof(char), len, in);
memset(buff + len * 2 / 3, 128, len / 3);
fwrite(buff, sizeof(char), len, out);
fclose(in);
fclose(out);
return true;
}
亮度减半
https://www.cnblogs.com/daner1257/p/10767570.html
https://blog.csdn.net/qingkongyeyue/article/details/52801396
https://blog.csdn.net/leixiaohua1020/article/details/50534150