什么是YUV(原文链接)
YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间。
在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号B-Y(即U)、R-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。
由此可见,RGB和YUV都属于颜色空间(或者叫“色彩空间”),如果不清楚色彩空间的概念。
分量意义
Y:表示明亮度(Luminance或者Luma),也被叫做“灰阶值”;
UV:表示为色度(Chrominance或者Chroma),作用是描述的是色彩和饱和度,用于指定像素的颜色。
格式:
yuv格式主要分成两种,一种为planar(棋盘格式)和packed
planer:存储格式为先存储所有的Y分量,再存储U分量,再存储V分量。yuv444存储格式如下图所示
packed:每一个像素都是由yuv存储,例如YUV YUV,具体的yuv444如下图所示:
yuv 存储格式中,又可以分为多种存储格式,主要分成以下三种:
yuv444: 表示每一个像素中的Y分量都对应的有一个U分量和V分量;
yuv422:表示每一个像素中的相邻的两个Y分量公用一个U分量和V分量,按照颜色进行区分;
yuv420:表示每一个像素中的相邻的4个Y分量共用一组U分量和V分量,Y1Y2Y9Y10共用U1和V1如yuv444存储格式如下图所示。
注:同一种存储类型内部排列顺序不一样,也会导致显示不正常,比如花屏,和绿屏的现象。比如yuv420 分为yuv420sp和yuv420p等的排列方式。yuv420p格式的 yyyyyyyyuuvv。yuv420sp则uv为交错存储,为方便理解如下图所示:
格式
yuv分成很多格式,例如yuv420p,yuv420sp等等,那么常见的yuv planar格式分成哪些呢?目前常见的格式如下所列。
yuv420p:又被称为I420,YU12,IYUV,UV平面的stride,width和height都是Y平面的1/2,注意:stride 不一定和width相等。
YV12:名字和YU12只有一个U、V之差。这个格式也是yuv420的一种,唯一不一样的地方是在存储过程中,U平面和V平面的顺序相反,也就是说先存储Y接着存储V最后存储U
J420:和I420存储方式上完全一样,不同的地方是y分量有取值范围(0-255)而不是有限范围(16-240,limited range,在 iOS 上也叫做 video range)
IMC1:与I420在存储方式上一样,但是在存储中,会把没有用到的空间留出来,保持和Y一样,也就是说UV分量的stride和Y一样。存储如下图所示:
IMC3:和IMC1一样,只是再存储的时候改变了uv的存储顺序。
I422:UV分量的stride、width和Y分量的1/2,但是height是Y分量的一样
J422: 与I422的差别与J420与J420差别一样,这里不再描述。
NV12:只有2个平面分别是Y平面和UV平面,因此Y的width,stride和UV平面的width,stride一样长,但是height只有Y平面的1/2,它是属于YUV420SP格式,因此在后面的uv存储为u0v0u1v1,内存可以理解为
y0 | y1 | y2 | y3 | y4 | y5 | y6 | y7 |
u0 | v0 | u1 | v1 | u2 | v2 | u3 | v3 |
注:NV12
是 iOS 相机(AVCaptureOutput
)可直接输出的两种视频帧格式之一,另外一种是 BGRA32
(kCVPixelFormatType_32BGRA
)。
在 iOS 上,NV12
还分为 Full Range (0-255, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
) 和 Video Range (16-240, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
),区别仅为亮度(Y)分量的取值范围,一般而言,Full Range 适用于静态图像(拍照),Video Range 适用于视频采集(摄像)。
NV21:和NV12一样也是属于yuv420sp的格式的一种,和NV12的区别是先存储v再存储u,因此这里不再进行描述。
AYUV:
是 Packed 打包格式,其中每个像素编码为四个连续字节,每个像素在内存中按照 V, U, Y, A 的顺序排列(A 指 alpha 通道),如下图所示:
YUYV:也经常被称作为V422
、YUY2
、YUNV,是两个y分量共用一组uv,从内存的布局上为YUYV,
y0u0y1v0 | y2u1y3v1 |
UYVY:也经常被称作为 Y422
、UYNV,和YUYV差不多,只是uv的顺序相反而已,不再描述。
RGB和YUV420P格式大小计算
和RGB比较,计算一帧的数据大小,假设分辨率为1280X720:
yuv420p:1280x720x1.5 = 1.318M 由于uv的with和height都只有1/2,所以y的数据量为width x 1 x height x 1 + u 的 width x 1/2 x height x 1/2+ v的stride x 1/2 x height x 1/2 因此 最后得出 stride x height x 1.5
RGB : width x height x 3
相比之下,yuv420p比rgb还是要小很多的。
参考资料