作视频采集与处理,天然少不了要学会分析YUV数据。由于从采集的角度来讲,通常的视频采集芯片输出的码流通常都是YUV数据流的形式,而从视频处理(例如H.26四、MPEG视频编解码)的角度来讲,也是在原始YUV码流进行编码和解析,因此,了解如何分析YUV数据流对于作视频领域的人而言,相当重要。本文就是根据个人学习和了解,简单地介绍如何分析YUV数据流。html
YUV,分为三个份量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),做用是描述影像色彩及饱和度,用于指定像素的颜色。数组
与咱们熟知的RGB相似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息同样能够显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。而且,YUV不像RGB那样要求三个独立的视频信号同时传输,因此用YUV方式传送占用极少的频宽。ide
好了,言归正传,谈谈如何分析YUV码流吧。YUV码流有多种不一样的格式,要分析YUV码流,就必须搞清楚你面对的究竟是哪种格式,而且必须搞清楚这种格式的YUV采样和分布状况。下面我将介绍几种经常使用的YUV码流格式,供你们参考。学习
1. 采样方式 优化
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,能够经过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每一个像素点的YUV值,由于只有正确地还原了每一个像素点的YUV值,才能经过YUV与RGB的转换公式提取出每一个像素点的RGB值,而后显示出来。编码
用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y份量,以空心圆圈表示采用该像素点的UV份量。spa

先记住下面这段话,之后提取每一个像素的YUV份量会用到。设计
- YUV 4:4:4采样,每个Y对应一组UV份量。
-
- YUV 4:2:2采样,每两个Y共用一组UV份量。
- YUV 4:2:0采样,每四个Y共用一组UV份量。
2. 存储方式orm
下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每一个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于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'0一、Y'十、Y'11共用Cr00、Cb00,其余依次类推。
(5)NV十二、NV21(属于YUV420)

NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,可是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种相似,即Y'00、Y'0一、Y'十、Y'11共用Cr00、Cb00
3. 总结
几种常见的YUV码流格式就简单地列在上面了,你们在处理YUV码流前,先了解清楚本身的码流到底属于哪种,而后对应进行处理。
最后,再回答一个疑问,即分析清楚YUV码流格式了,咱们能够作什么?最经常使用的一点就是,提取出全部的Y份量,而后利用vc或者matlab把你采集的图像的灰度值(Y份量)显示处理,这样你就能够很快地知道你采集的图像是否有问题了。后面我将继续写一些文章讲述如何提取、转换、显示这些YUV原始码流,有兴趣能够继续关注,欢迎留言讨论。
from:http://ticktick.blog.51cto.com/823160/555791
=====================================================================================================
YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间。其中的Y,U,V几个字母不是英文单词的组合词,Y表明亮度,uv表明色差,u和v是构成彩色的两个份量。在现代彩色电视系统中,一般采用三管彩色摄影机或彩色CCD摄影机进行取像,而后把取得的彩色图像信号经分色、分别放大校订后获得RGB,再通过矩阵变换电路获得亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。若是只有 Y信号份量而没有U、V信号份量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的相容问题,使黑白电视机也能接收彩色电视信号。
YUV主要用于优化彩色
视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优势在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),做用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一块儿。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了GB输入信号红色部分与RGB信号亮度值之间的差别。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差别。
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。若是只有Y信号份量而没有U、V份量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
YUV与RGB相互转换的公式以下(RGB取值范围均为0-255)︰
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
在DirectShow中,常见的RGB格式有RGB一、RGB四、RGB八、RGB56五、RGB55五、RGB2四、RGB3二、ARGB32等;常见的YUV格式有YUY二、YUYV、YVYU、UYVY、AYUV、Y41P、Y4十一、Y2十一、IF0九、IYUV、YV十二、YVU九、YUV4十一、YUV420等。
主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:二、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较经常使用,其含义为:每一个点保存一个 8bit 的亮度值(也就是Y值),每 2x2 个点保存一个 Cr 和Cb 值, 图像在肉眼中的感受不会起太大的变化。因此, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 4 个点须要 8x3=24 bites(以下图第一个图)。而如今仅须要 8+(8/4)+(8/4)=12bites, 平均每一个点占12bites(以下图第二个图)。这样就把图像的数据压缩了一半。
上边仅给出了理论上的示例,在实际数据存储中是有多是不一样的,下面给出几种具体的存储形式:
(1) YUV 4:4:4
YUV三个信道的抽样率相同,所以在生成的图像里,每一个象素的三个份量信息完整(每一个份量一般8比特),通过8比特量化以后,未经压缩的每一个像素占用3个字节。
下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
(2) YUV 4:2:2
每一个色差信道的抽样率是亮度信道的一半,因此水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来讲,每一个由两个水平方向相邻的像素组成的宏像素须要占用4字节内存。
下面的四个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3
映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
(3) YUV 4:1:1
4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是能够接受的。对非压缩的8比特量化的视频来讲,每一个由4个水平方向相邻的像素组成的宏像素须要占用6字节内存。
下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为: Y0 U0 Y1 Y2 V2 Y3
映射出像素点为:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
(4)YUV4:2:0
4:2:0并不意味着只有Y,Cb而没有Cr份量。它指得是对每行扫描线来讲,只有一种色度份量以2:1的抽样率存储。相邻的扫描行存储不一样的色度份量,也就是说,若是一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每一个色度份量来讲,水平方向和竖直方向的抽样率都是2:1,因此能够说色度的抽样率是4:1。对非压缩的8比特量化的视频来讲,每一个由2x2个2行2列相邻的像素组成的宏像素须要占用6字节内存。
下面八个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
[Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]
存放的码流为:Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 V7 Y8
映射出的像素点为:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]
YUV格式一般有两大类:打包(packed)格式和平面(planar)格式。前者将YUV份量存放在同一个数组中,一般是几个相邻的像素组成一个宏像素(macro-pixel);然后者使用三个数组分开存放YUV三个份量,就像是一个三维平面同样。表2.3中的YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。(注意:在介绍各类具体格式时,YUV各份量都会带有下标,如Y0、U0、V0表示第一个像素的YUV份量,Y一、U一、V1表示第二个像素的YUV份量,以此类推。)
¨ YUY2(和YUYV)格式为每一个像素保留Y份量,而UV份量在水平方向上每两个像素采样一次。一个宏像素为4个字节,实际表示2个像素。(4:2:2的意思为一个宏像素中有4个Y份量、2个U份量和2个V份量。)图像数据中YUV份量排列顺序以下:
Y0 U0 Y1 V0 Y2 U2 Y3 V2 …
¨ YVYU格式跟YUY2相似,只是图像数据中YUV份量的排列顺序有所不一样:
Y0 V0 Y1 U0 Y2 V2 Y3 U2 …
¨ UYVY格式跟YUY2相似,只是图像数据中YUV份量的排列顺序有所不一样:
U0 Y0 V0 Y1 U2 Y2 V2 Y3 …
¨ AYUV格式带有一个Alpha通道,而且为每一个像素都提取YUV份量,图像数据格式以下:
A0 Y0 U0 V0 A1 Y1 U1 V1 …
¨ Y41P(和Y411)格式为每一个像素保留Y份量,而UV份量在水平方向上每4个像素采样一次。一个宏像素为12个字节,实际表示8个像素。图像数据中YUV份量排列顺序以下:
U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y8 …
¨ Y211格式在水平方向上Y份量每2个像素采样一次,而UV份量每4个像素采样一次。一个宏像素为4个字节,实际表示4个像素。图像数据中YUV份量排列顺序以下:
Y0 U0 Y2 V0 Y4 U4 Y6 V4 …
¨ YVU9格式为每一个像素都提取Y份量,而在UV份量的提取时,首先将图像分红若干个4 x 4的宏块,而后每一个宏块提取一个U份量和一个V份量。图像数据存储时,首先是整幅图像的Y份量数组,而后就跟着U份量数组,以及V份量数组。IF09格式与YVU9相似。
¨ IYUV格式为每一个像素都提取Y份量,而在UV份量的提取时,首先将图像分红若干个2 x 2的宏块,而后每一个宏块提取一个U份量和一个V份量。YV12格式与IYUV相似。
¨ YUV4十一、YUV420格式多见于DV数据中,前者用于NTSC制,后者用于PAL制。YUV411为每一个像素都提取Y份量,而UV份量在水平方向上每4个像素采样一次。YUV420并不是V份量采样为0,而是跟YUV411相比,在水平方向上提升一倍色差采样频率,在垂直方向上以U/V间隔的方式减少一半色差采样,如上图所示。
转载:http://hi.baidu.com/yrworld/blog/item/e6e0a9120a6ca3cbc2fd78e2.html/cmtid/21fa09d8d7a32a3b32fa1cf8