YUV存储格式
YUV的存储格式
YUV的格式有两大类:planar和packed。
planar(中文翻译:平面的;二维的;平坦的)
对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
packed (中文翻译:挤满塞满)
对于packed的YUV格式,每个像素点的Y、U、V都是连续交叉存储的。
YUV的采样方式
YUV 4:4:4采样,每一个Y对应一组UV分量,一个YUV占8+8+8 = 24bits 3个字节。
YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。
YUV 4:2:0采样,每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。
我们最常见的YUV420P和YUV420SP都是基于4:2:0采样的
YUV码流的存储格式与其采样方式有密切的关系,主流的采样方式有三种:YUV4:4:4、YUV4:2:2、YUV4:2:0。
下面三个图比较直观的显示了三种采样方式。其中黑点表示采样像素点的Y分量,空心圆表示采样像素点的UV分量。
YUV上图来源
存储方式
YV12在内存中存储
NV12在内存中存储
W即图像的宽度,H即图像的高度,Stride表示图像行的跨度,超出W部分为填充数据,主要目的是为了字节对齐,一般以16字节或者或者32字节对齐居多。
从左侧数据存储结构图看出高度(H)是分层次的,YV12三层和NV12两层,这个层次结构称为 Plane,即YV12在代码中用
Plane[0]表示Y数据的起始地址,Plane[1]表示V数据的起始地址,Plane[1]表示U数据的起始地址。而NV12的UV是在一个Plane中交错存放,因此用两个Plane表示即可。从右侧的数据排布图可见YV12和NV12都是YUV
4:2:0采样,每四个Y共用一组UV分量,已用颜色标明Y1、Y2、Y7、Y8共用U1、V1,并且在内存中连续排布。
YUYV
<1>YUYV格式(属于YUV422)请注意没有带P的,都是Y、U、V都是连续交叉存储
YUYV是YUV422采样的存储格式的一种,相邻的两个Y公用其相邻的两个Cb(U)、Cr(V)。对于像素点Y’00、Y’01而言,其Cb、Cr的值均为Cb00、Cr00,其他的像素点的YUV取值依次类推。
UYVY
<2>UYVY格式(属于YUV422)
YU422P
<3>YUV422P(属于YUV422)带P的先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V
YUV422P是一种Plane模式,即planar模式,并不是像上面YUV数据交错存储,而是先存储所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y’00、Y’01而言,其Cb、Cr的值均为Cb00、Cr00。
YUV420P YUV420SP
YUV420P(YU12和YV12)格式.
YUV420P又叫plane平面模式,Y , U , V分别在不同平面,也就是有三个平面,它是YUV标准格式4:2:0,主要分为:YU12和YV12
YUV模型是根据一个亮度(Y分量)和两个色度(UV分量)来定义颜色空间,常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等,其中比较常见的YUV420分为两种:YUV420P和YUV420SP。
YUV420SP
<4>YUV420sp
YUV420SP格式的图像阵列,首先是所有Y值,然后是UV或者VU交替存储,NV12和NV21属于YUV420SP格式,是一种two-plane模式,即Y和UV分为两个plane,但是UV(CbCr)为交错存储,而不是分为三个平面。
YUV420P
<5>YUV420p
YU12
<6>YV12、YU12格式(属于YUV420)
YU12(又称I420)和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其没一个像素点的YUV数据提取都遵循YUV420格式的提取方式,即4个Y分量共用一组UV。如上图中,Y’00、Y’01、Y’10、Y’11共用Cr00、Cb00,其他以此类推。
注意,YU12与YV12的区别在于是先存U还是先存V。对于YU12来说,存储顺序是YUV,即YCbCr;对于YV12来说,存储顺序是YVU,即YCrCb。所以上图就是YV12了。
YU12格式
在android平台下也叫作I420格式,首先是所有Y值,然后是所有U值,最后是所有V值。
YU12:亮度(行×列) + U(行×列/4) + V(行×列/4)
YV12
YV12格式与YU12基本相同,首先是所有Y值,然后是所有V值,最后是所有U值。只要注意从适当的位置提取U和V值,YU12和YV12都可以使用相同的算法进行处理。
YV12:亮度Y(行×列) + V(行×列/4) + U(行×列/4)
YU12: YYYYYYYY UUVV => YUV420P
YV12: YYYYYYYY VVUU => YUV420P
<7>NV12、NV21(属于YUV420)
NV21
NV21格式
android手机从摄像头采集的预览数据一般都是NV21,存储顺序是先存Y,再VU交替存储,NV21存储顺序是先存Y值,再VU交替存储:YYYYVUVUVU,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节
NV12
NV12格式
NV12与NV21类似,也属于YUV420SP格式,NV12存储顺序是先存Y值,再UV交替存储:YYYYUVUVUV,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节
NV21、NV12都属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上面一种类似,即Y’00、Y’01、Y’10、Y’11共用Cr00、Cb00。
注意,NV21与NV12的区别在于,在UV交替的存储中,NV12是UV(CbCr)交替存储,NV21是VU(CrCb)交替存储,所以上图显示的是NV21。而且NV12是IOS的模式,NV21是Android的模式。
reference
1.YUV格式详解
2.图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
3.sheldon_blogs 图像基础知识之YUV
第3位对图像在内存中存储研究的比较好
4.YUV420数据格式详解