前言
在上一篇文章中,总结了移动平台摄像头获取视频预览数据的各种格式,包括32BGRA
,NV21
,还有Android5.0之后统一的YUV_420_888
,那么其实对于RGB格式的数据,我们还是比较容易理解的,对于YUV格式的数据,可能不是太清楚,这里就简单总结一下!
简介
这里参考wikipedia的内容。
YUV是一种颜色编码系统,通常用作彩色图像流水线的一部分。它编码一个彩色图像或视频拍摄人类感知考虑在内,从而允许减少的带宽用于色度分量,从而使通常的传输错误或压缩伪像被更有效地由人类感知。
术语Y’UV,YUV,YCbCr,YPbPr等的范围有时是模糊和重叠的。历史上,术语YUV和Y’UV用于电视系统中的颜色信息的特定模拟编码,而YCbCr用于适合于视频和静止图像压缩和传输的颜色信息的数字编码,例如MPEG和JPEG。今天,术语YUV通常用于计算机行业,以描述使用YCbCr编码的文件格式。
Y’代表luma分量(亮度),U和V代表chrominance(颜色)分量; luminance用Y表示,luma用Y’表示 - 素数符号(’)表示伽马压缩,“luminance”表示物理线性空间亮度,而“luma”表示(非线性)感知亮度。
下图为UV颜色平面的示例,Y’值= 0.5,在RGB色域内表示
如果单独输出各个分量,如下图所示(从上往下为原图,Y’分量,U分量,V分量):
还有一点需要注意它和Y’CrCb还是有一些区别的:
Y’UV通常用作YCbCr的术语。然而,虽然相关,但它们是具有不同比例因子的不同格式。最主要的区别在于Y’CbCr用于数字图像领域,YUV用于模拟信号领域。
Y’为亮度,Cb、Cr分量代表当前颜色对蓝色和红色的偏移程度。
下图为恒定亮度的CbCr平面示例,Y’= 0.5
上边就是一些概念上的东西了,YUV和YCbCr虽然有些区别,但是对于在前边博客中说到的,比如iOS中的kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
,Android中的ImageFormat.NV21
或者ImageFormat.YUV_420_888
,其实说白了是一样的,我们在这里不用过于纠结这个!或者说这里YUV就是特指的YCbCr。
YUV的存储方式和采样方式
存储方式
YUV存储方式有两种:planar
和packed
。
- 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
- 对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。类似RGB。
采样方式
YUV格式的编码,Y是全量采样,根据U和V采样数目的不同,分为YUV444
,YUV422
和YUV420
等。其中YUV420
是移动端中最常用的一种采样。
关于采样方式:这篇文章里写的很好:YUV颜色编码解析,这里引用一下!
色度抽样方式用J:A:B表示
J:最小水平抽样的的宽度,一般为4
A:最小水平抽样区域第一行的色度抽样
B:最小水平抽样区域第二行的色度抽样
这里说的是什么意思呢?就是说每4个像素,Y采样几次,U采样几次,V采样几次,不过这里4:2:0需要注意,这里并不是只抽取U,而不抽取V,而是U和V间隔抽取,比如第一行抽取U,第二行抽取V,第三行抽取U,第四行抽取V…,所以:
YUV 4:4:4采样,每一个Y对应一组UV分量,一个YUV(像素)占8+8+8 = 24bits = 3bytes。
YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV(像素)占8+4+4 = 16bits = 2bytes。
YUV 4:2:0采样,每四个Y共用一组UV分量,一个YUV(像素)占8+2+2 = 12bits = 1.5bytes。
移动端的YUV420
那么知道了上边YUV的存储和采样,我们下边来详细了解一下移动端中最常用的YUV420格式。
iOS
在前边一章节中,我们知道iOS可以设置的格式有kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
和kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
,这两种统称为NV12
格式!
又因为它是BiPlanar
,所以是半平面semi-planar
,属于YUV420SP
的一种,即分为Y和UV两个planar。
它的存储顺序是先存Y值,再UV交替存储,所以它的存储数组序列为:YYYYYYYYUVUV
Android
-
NV21
对于Camera
预览回调的默认为NV21
格式,同样的属于YUV420SP
,只不过它和NV12
相反,它的存储顺序是先存Y值,再VU交替存储,所以它的存储数组序列为:YYYYYYYYVUVU
-
YV12,YU12
两者都属于YUV420P
,其中YU12
又称为I420
。Y , U , V分别在不同平面,也就是有三个平面。①对于YU12,首先是所有Y值,然后是所有U值,最后是所有V值。所以它的存储数组序列为
YYYYYYYYUUVV
。②对于YV12,首先是所有Y值,然后是所有V值,最后是所有U值。所以它的存储数组序列为
YYYYYYYYVVUU
。
参考文章
YUV颜色编码解析
对颜色空间YUV、RGB的理解
图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
YUV格式详解