视频图像格式YUV详解
Posted 未央浮沉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频图像格式YUV详解相关的知识,希望对你有一定的参考价值。
一 简介
YUV 是一种表示颜色的模型。基于人类眼睛对亮度高度敏感、对颜色敏感度低于亮度的生理特征 YUV在对照片或视频编码时完整保存像素的亮度分量(Y),根据不同要求采样保存UV分量。
根据历史的演进,YUV的发明是由于彩色电视与黑白电视的过渡时期。黑白视频只有Y(Luma,Luminance)视频,也就是灰阶值。到了彩色电视规格的制定,是以YUV/YIQ的格式来处理彩色电视图像。
YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。
YUV和Y'UV通常用来编码电视的模拟信号,而YCbCr则是用来描述视频的数字信号,适合视频与图片压缩以及传输,例如MPEG、JPEG。但在现今,YUV通常已经在电脑系统上广泛使用。
二 理解亮度敏感
什么是亮度敏感?只有理解了亮度敏感,我们才能更好的理解YUV。先看如下图:
上图是一张纯黑的图片,对于眼睛来说是没有亮度可言的。而下图:
可以明显看到图中白色的“二”字,因为“二”字的亮度明显高于周围,所以我们很清晰的看到这个字。 再看下图:
上图中可以很清晰的看到一个小人和一个三角形、正方形。 小人是白色的,三角形和正方形是浅灰色的,但是相对于小人,你是不是对三角形和正方形的颜色分辨的不太清晰,相信我稍微加重或者减轻浅灰色,你都不太能感觉出来,但你能明显的感觉的它们是什么形状,黑白电视也是由此受到启发的。
到这里我们就知道了什么是亮度,而且明白我们的眼睛确实是对亮度很敏感。而YUV中的Y就是指黑白的图画,UV就是颜色。一张色彩艳丽的图如果存储成YUV数据的话,Y就是这张图的黑白照,UV就是把它涂上颜色;因此我们完全可以抛弃掉UV,只保留Y,那样就是看这张图的黑白照而已~
三 YUV的采样和存储
由于人眼对 Y 的敏感度远超于对 U 和 V 的敏感,所以有时候可以多个 Y 分量共用一组 UV,这样既可以极大得节省空间,又可以不太损失质量。因此才会出现YUV 420,YUV 422,YUV 444的格式。
其实图像最开始是用到在电视上的,所以我们可以用电视做为想象和参考,电视以前都是电子仪扫描,所以我们首先要明白什么是扫描线,
什么是扫描线?这是关于电视显示的术语,用来描述电视是如何显示画面的。wiki中是这么解释的:
电视萤幕由电子枪射出的电子,经由磁场偏向后打在屏幕上而发光,因此每一个图框都由电子枪的扫描线画出来。
电子枪的扫描线从左上角像素点到右下角像素点顺序移动,喷射电子显像。
再来说回YUV,因为UV分别代表不同颜色信号,所以直接使用R与B信号表示色度的UV。 也就是说UV信号告诉了电视要偏移某象素的颜色,而不改变其亮度。 或者UV信号告诉了显示器使得某个颜色亮度依某个基准偏移。 UV的值越高,代表该像素会有更饱和的颜色。
彩色图像记录的格式,常见的有RGB、YUV、CMYK等。 彩色电视最早的构想是使用RGB三原色来同时传输。这种设计方式是原来黑白带宽的3倍,在当时并不是很好的设计。RGB诉求于人眼对色彩的感应,YUV则着重于视觉对于亮度的敏感程度,Y代表的是亮度,UV代表的是彩度(因此黑白电影可省略UV,相近于RGB),分别用Cr和Cb来表示,因此YUV的记录通常以Y:UV的格式呈现。
采样通常用3部分的比例表示J:a:b(例如4:2:2)。如果有alpha通道,也用4个数的比例(例如4:2:2:4)。
概念上来说,我们考虑的是J个像素宽,2个像素高的区域。
J: 水平采样的参考,也可以说是宽度,通常是4(因为最小宏像素是4个Y共享一个uv,所以取4)
a: 第一行J个像素的色度个数(Cr, Cb)
b: 第一行和第二行有差别的色度个数(Cr, Cb)。注意b的值通常为0或者等于a。
主流的采样方式有三种:YUV4:4:4,YUV4:2:2,YUV4:2:0
可以看到4:4:4格式的亮度、色度采样分布。就像图中所表示的,画面中每个象素都有与之对应的色度和亮度采样信息。
其次就是4:2:2,就是说,每4点Y采样,就有2点Cb和2点Cr。在这种格式中,色度信号的扫描线数量和亮度信号一样多,但是每条扫描线上的色度采样点 数却只有亮度信号的一半。当4:2:2信号被解码的时候,“缺失”的色度采样,通常由一定的内插补点算法通过它两侧的色度信息运算补充。
再看4:2:2格式亮度、色度采样的分布情况。在这里,每个象素都有与之对应的亮度采样,同时一半的色度采样被丢弃,所以我们看到,色度采样信号每隔 一个采样点才有一个。当着张画面显示的时候,缺少的色度信息会由两侧的颜色通过内插补点的方式运算得到。就像上面提到的那样,人眼对色度的敏感程度不如亮 度,大多数人并不能分辨出4:2:2和4:4:4颜色构成的画面之间的不同。
色度信号分辨率最低的格式,也就是DVD所使用的 格式,就是4:2:0了。事实上4:2:0是一个混乱的称呼,按照字面上理解,4:2:0应该是每4点Y采样,就有2点Cb和0点Cr,但事实上完全不是 这样。事实上,4:2:0的意思是,色度采样在每条横向扫描线上只有亮度采样的一半,扫描线的条数上,也只有亮度的一半!换句话说,无论是横向还是纵向, 色度信号的分辨率都只有亮度信号的一半。
YUV的格式
YUV格式有两大类:planar和packed。
- 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
- 对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。
(1) YUVY 格式 (属于YUV422)
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。
(2) UYVY 格式 (属于YUV422)
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。
(3) YUV422P(属于YUV422)
YUV422P也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。
(4)YV12,YU12格式(属于YUV420)
YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。
(5)NV12、NV21(属于YUV420)
NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)
参考技术A YUV ( Y'CbCr )是一种像素格式,常见于视频编码与静态图像。与 RGB 格式(红-绿-蓝)相反,YUV 分别由一个称为 Y (相当于灰度)的“亮度”分量(Luminance or Luma)和两个称为 U (蓝色投影 Cb )和 V (红色投影 Cr )的“色度”分量(Chrominance or Chroma)表示,由此得名。仅有 Y 分量而没有 UV 分量信息,一样可以显示完整的黑白(灰度)图像,解决了模拟信号电视黑白与彩色的兼容问题。
色度通道(UV)的采样率可以低于亮度通道(Y),而不会显着降低感知质量。一种称为 “A:B:C” 的表示法用于描述相对于 Y 采样, U 和 V 的频率:
下图显示了如何针对每个下采样率采样色度。亮度样本用十字表示,色度样本用圆圈表示。
YUV 在存储上通常分为平面格式( Planar ),半平面格式( Semi-Planar )以及打包格式( Packed )。
平面格式有时也称为三面格式( Triplanar ),即 Y, U, V 三个分量各自使用单独的数组保存,这种三平面分离的格式比较方便视频编码。
YU12 即 I420 ,也叫 IYUV ,属于 YUV420P 格式。三个平面,分别存储 Y U V 分量。每四个 Y 分量共享一组 UV 分量。U、V 平面的 strides, width 和 height 都是 Y 平面的一半,因此一个像素 12 bits,内存排列如下图所示:
从图中可看出,U、V 平面的每行字节数(strides)、高(height)都是 Y 平面的一半。
I420 是音视频开发中常用的一种格式。
YV12 与 I420 几乎一样,仅改变了 U, V 平面的顺序。内存排列如下图所示:
J420 与 I420 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,limited range,在 iOS 上也叫做 video range)。色度(UV)分量与 I420 中的完全相同。
IMC1 与 I420 类似,U, V 平面的宽(width)、高(height)是 Y 平面的一半,但是每行字节数(strides)与 Y 平面一致,因此 U, V 平面在内存上会有留空(padding),因此一个像素 16 bits,如图所示:
IMC3 与 IMC1 几乎一样,仅改变了 U, V 平面的顺序。内存排列如下图所示:
I422 属于 YUV422P 格式。三个平面,分别存储 Y U V 分量。每两个 Y 分量共享一组 UV 分量。U、V 平面的 strides, width 是 Y 平面的一半,但 height 与 Y 平面一致,因此一个像素 16 bits,内存排列如下图所示:
从图中可看出,U、V 平面的每行字节数(strides)是 Y 平面的一半,高(height)与 Y 平面一致。
J422 与 I422 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,limited range,在 iOS 上也叫做 video range)。色度(UV)分量与 I420 中的完全相同。
半平面格式具有两个平面而不是三个平面,一个平面存储亮度(Y)分量,另一个平面存储两个色度(UV)分量。有时也将它们称为双平面格式( BiPlanar )。
NV12 属于 YUV420SP 格式。两个平面,分别存储 Y 分量 和 UV 分量。其中 UV 分量共用一个平面并且以 U, V, U, V 的顺序交错排列。每四个 Y 分量共享一组 UV 分量。
UV 平面的 strides, width 与 Y 平面一样长,但 height 仅为 Y 平面的一半。因此一个像素 12 bits,内存排列如下图所示:
从图中可看出,UV 平面的每行字节数(strides)与 Y 平面一致,高(height)是 Y 平面的一半。
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 属于 YUV420SP ,与 NV12 几乎一致,区别是 UV 平面中 U 与 V 的排列顺序颠倒,以 V, U, V, U 的顺序交错排列,内存排列如图所示:
NV21 是 Android 相机( Camera )默认的输出格式。
打包格式通常只有一个平面,所有亮度(Y)和色度(UV)数据都交织在一起。有点类似于 RGB 格式,只是使用了不同的色彩空间。
打包格式在网络摄像头中较为常见。硬件设备使用多平面格式效率较低,因为每个像素需要多次内存访问。而打包格式由于仅一个平面,访问内存的开销较小。
AYUV 是 Packed 打包格式,其中每个像素编码为四个连续字节,每个像素在内存中按照 V, U, Y, A 的顺序排列(A 指 alpha 通道),如下图所示:
YUYV 通常也称作 V422 、 YUY2 、 YUNV
YUY2 是 Packed 打包格式,其中两个像素共用一组 UV 分量,内存中按照 Y U Y V 的顺序排列,如下图所示:
UYVY 通常也称作 Y422 、 UYNV
UYVY 与 YUYV 类似,只是亮度(Y)分量与色度(UV)分量排列顺序颠倒,如下图所示:
以上是关于视频图像格式YUV详解的主要内容,如果未能解决你的问题,请参考以下文章