YUV分析

先区分一下YUV和YCbCr

YUV色彩模型来源于RGB模型,

该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。

应用:模拟领域

Y'= 0.299*R' + 0.587*G' + 0.114*B'

U'= -0.147*R' - 0.289*G' + 0.436*B' =0.492*(B'- Y')

V'= 0.615*R' - 0.515*G' - 0.100*B' =0.877*(R'- Y')

R' = Y' + 1.140*V'

G' = Y' - 0.394*U' - 0.581*V'

B' = Y' + 2.032*U'

YCbCr模型来源于YUV模型。YCbCr是 YUV 颜色空间的偏移版本.

应用:数字视频,ITU-R BT.601建议

Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16

Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128

Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128

R' = 1.164*(Y’-16) + 1.596*(Cr'-128)

G' = 1.164*(Y’-16) - 0.813*(Cr'-128) -0.392*(Cb'-128)

B' = 1.164*(Y’-16) + 2.017*(Cb'-128)

PS: 上面各个符号都带了一撇,表示该符号在原值基础上进行了伽马校正,伽马校正有助于弥补在抗锯齿的过程中,线性分配伽马值所带来的细节损失,使图像细节更加丰富。在没有采用伽马校正的情况下,暗部细节不容易显现出来,而采用了这一图像增强技术以后,图像的层次更加明晰了。

所以说H264里面的YUV应属于YCbCr 

下面在仔细谈谈YUV格式, YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。

我们常说得YUV420属于planar格式的YUV, 颜色比例如下:

Y0U0V0            Y1                Y2U2V2                         Y3

Y4                      Y5                Y6                                  Y7

Y8U8V8             Y9                 Y10U10V10                   Y11

Y12           Y13         Y14                  Y15

 在常见H264测试的YUV序列中,例如CIF图像大小的YUV序列(352*288),在文件开始并没有文件头,直接就是YUV数据,先存第一帧的Y信息,长度为352*288个byte, 然后是第一帧U信息长度是352*288/4个byte, 最后是第一帧的V信息,长度是352*288/4个byte, 因此可以算出第一帧数据总长度是352*288*1.5,即152064个byte, 如果这个序列是300帧的话, 那么序列总长度即为152064*300=44550KB,这也就是为什么常见的300帧CIF序列总是44M的原因.

 

 

 

 

 

在摄像头之类编程经常是会碰到YUV格式,而非大家比较熟悉的RGB格式. 我们可以把YUV看成是一个RGB的变种来理解.

 

   YUV的原理是把亮度与色度分离,研究证明,人眼对亮度的敏感超过色度。利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点。

 

  YUV三个字母中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰阶值;而"U"和"V"表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。用这个三个字母好象就是通道命令。

 

 

 使用YUV的优点有两个:

   一.彩色YUV图像转黑白YUV图像转换非常简单,这一特性用在于电视信号上。

 

   二.YUV是数据总尺寸小于RGB格式

 

关于描述YUV格式,写得比较好是这一篇文件

   <<Video Rendering with 8-Bit YUVFormats>>

   http://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx

 

 

.YUV格式与RGB格式的换算

 

 

关于YUV与RGB转换

 

可以参见  http://www.fourcc.org/fccyvrgb.php

 

以下是标准公式

1.     RGB 转换成 YUV 

2.      

3.     Y = (0.257 * R) +(0.504 * G) + (0.098 * B) + 16

4.      

5.     Cr = V = (0.439 * R) -(0.368 * G) - (0.071 * B) + 128

6.      

7.     Cb = U = -( 0.148 * R)- (0.291 * G) + (0.439 * B) + 128

8.      

9.     YUV 转换成 RGB 

10.   

11.  B = 1.164(Y - 16) +2.018(U - 128)

12.   

13.  G = 1.164(Y - 16) -0.813(V - 128) - 0.391(U - 128)

14.   

15.  R = 1.164(Y - 16) +1.596(V - 128)


RGB取值范围均为0~255,Y=0~255,U=-122~+122,V=-157~+157
以下是经过简化的公式,运算量比上述公式要小一些。

 

1. RGB转YUV

2.  

3. Y = 0.299R + 0.587G +0.114B

4.  

5. U'= (BY)*0.565

6.  

7. V'= (RY)*0.713

8.  

9. YUV转RGB

10.        

11.       R = Y + 1.403V'

12.        

13.       G = Y - 0.344U' - 0.714V'

14.        

15.       B = Y + 1.770U'

 

   如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。因此用YUV格式由彩色转

黑白信号相当简单.  

   在技术文档里,YUV经常有另外的名字, YCbCr ,其中Y与YUV 中的Y含义一致,Cb , Cr 同样都指色彩,,只是在表示方法上不同而已,Cb Cr 就是本来理论上的“分量/色差”的标识。C代表分量(是component的缩写)Cr、Cb分别对应r(红)、b(蓝)分量信号,Y除了g(绿)分量信号,还叠加了亮度信号。

 

   还有一种格式是YPbPr格式,它与YCbPr格式的区别在于,其中YCbCr是隔行信号,YPbPr是逐行信号。

数字信号都是YCbCr ,其应用领域很广泛,JPEG、MPEG均采用此格式。在后文中,如无特别指明,讲的YUV都是指YCbCr格式。

 

  而YPbPr一般是模拟信号,我引用两段来说明两者区别

   

1.     什么是YCbCr?

2.     YCbCr表示隔行分量端子,是属于YUV经过缩放和偏移的翻版,常说的YUV也称作YCbCr。其中Y与YUV 中的Y含义一致,Cb , Cr 同样都指色彩,,只是在表示方法上不同而已,Cb Cr 就是本来理论上的“分量/色差”的标识。C代表分量(是component的缩写)Cr、Cb分别对应r(红)、b(蓝)分量信号,Y除了g(绿)分量信号,还叠加了亮度信号。

3.     其中YCbCr是隔行信号,YPbPr是逐行信号。YCbCr 是在计算机系统中应用最多的一种信号,其应用领域很广泛,JPEG、MPEG均采用此格式。

4.     什么是YPbPr?

5.     Y'CbCr 在模拟分量视频(analogcomponent video)中也常被称为YPbPr,YPbPr是将模拟的Y、PB、PR信号分开,使用三条线缆来独立传输,保障了色彩还原的准确性,YPbPr表示逐行扫描色差输出.YPbPr接口可以看做是S端子的扩展,与S端子相比,要多传输PB、PR两种信号,避免了两路色差混合解码并再次分离的过程,也保持了色度通道的最大带宽,只需要经过反矩阵解码电路就可以还原为RGB三原色信号而成像,这就最大限度地缩短了视频源到显示器成像之间的视频信号通道,避免了因繁琐的传输过程所带来的图像失真,保障了色彩还原的准确,目前几乎所有大屏幕电视都支持色差输入。

 

.YUV的存储格式

  

  RGB格式中,一个24bpp像素要占用4字节空间。在YUV格式中,可以对于UV分量的数据压缩,但是对图像整体质量影响不大,这样YUV所占的空间就比RGB要小一些

 不过RGB中 16bpp的 565格式每一个点只占2个字节,从这一点看也没有省多少。不过视频应用都是清一色的YUV应用。因此YUV的处理还是一个比较重要课题。

 

  YUV的存储中与RGB格式最大不同在于,RGB格式每个点的数据是连继保存在一起的。即R,G,B是前后不间隔的保存在2-4byte空间中。而YUV的数据中为了节约空间,U,V分量空间会减小。每一个点的Y分量独立保存,但连续几个点的U,V分量是保存在一起的,(反正人眼一般也看不出区别).这几个点合起来称

为macro-pixel, 这种存储格式称为Packed格式。

  另外一种存储格式是把一幅图像中Y,U,V分别用三个独立的数组表示。这种模式称为planar模式。

 

  这里我们主要使用第一种Packed格式。

 

 2.1 采样格式

   表示YUV格式,一般用Y,U,V三者的比率来表示不同格式,比如YUV420 表示三者是比值此是 4:4:4

   即一个点数据点,Y,U,V的空间都是一样大小。目前主要有如下比例,注意所有格式中Y比值都是4,占一个字节,表示没有减少采样。不同格式中,减小只是UV的采样值.

 

   

·         4:4:4表示色度值(UV)没有减少采样。即Y,U,V各占一个字节,加上Alpha通道一个字节,总共占4字节.这个格式其实就是24bpp的RGB格式了。 

·        4:2:2表示UV分量采样减半,比如第一个像素采样Y,U,第二个像素采样Y,V,依次类推,这样每个点占用2个字节.二个像素组成一个宏像素.

·        4:2:0 这种采样并不意味着只有Y,Cb而没有Cr分量,这里的0说的U,V分量隔行才采样一次。比如第一行采样4:2:0 ,第二行采样 4:0:2 ,依次类推...在这种采样方式下,每一个像素占用16bits或10bits空间.

·        4:1:1可以参考4:2:2分量,是进一步压缩,每隔四个点才采一次U和V分量。一般是第0点采Y,U,第1点采Y,第3点采YV,第四点采Y,依次类推。

 

   除了4:4:4采样,其余采样后信号重新还原显示后,会丢失部分UV数据,只能用相临的数据补齐,但人眼对UV不敏感,因此总体感觉损失不大。

4:2:2示例

   如果原始数据三个像素是 Y0 U0 V0 ,Y1 U1 V1,Y2 U2 V2,Y3 U3 V3

   经过4:2:2采样后,数据变成了 Y0 U0 ,Y1 V1 ,Y2 U2,Y3 V3

   如果还原后,因为某一些数据丢失就补成 Y0 U0 V1,Y1 U0 V1,Y2U2 V3 ,Y3 U3 Y2

 

  4:1:1示例

   原来四个像素为: [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:2:0示例

 下面八个像素为:[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 4:4:4格式内存布局,每一个像素拥有完整的YUV,加上A(Alpha)

   

 

YUV 4:2:2 小端字节序排列

  

 

2.2 Four CC

  关于YUV444,YUV422,YUV420的名称还有别外一种命名方式,FOURCC ,上文中用就是这个命令,Four CC使用四个字母的命名,

  FourCC全称Four-CharacterCodes,是由4个字符(4 bytes)组成,是一种独立标示视频数据流格式的四字节,在wavavi档案之中会有一段FourCC来描述这个AVI档案,是利用何种codec来编码的。因此wavavi大量存在等于“IDP3”FourCC

  http://zh.wikipedia.org/wiki/FourCC

 

按fourcc的命名.

  http://www.fourcc.org/yuv.php

 

 

YUV444 的FourCC 称为 AYUV

YUV422 FourcCC 按字节序分为 YUY2 UYVY

YUV420 FourcCC 按字节序分为 IMC1 IMC2

 

2.3 V4L2 采用编码

  我们一般是在V4L驱动里使用这一些编码,而且V4L2也有一类对应的编码.参见vedio2dev.h,在编程中要与实际排列对应上.它后面的定义值实际就是FourCC 码.

 

  #define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y', 'V', '1', '2') /* 12  YVU 4:2:0     */

#define V4L2_PIX_FMT_YUYV    v4l2_fourcc('Y','U', 'Y', 'V') /* 16  YUV 4:2:2     */

#define V4L2_PIX_FMT_UYVY    v4l2_fourcc('U','Y', 'V', 'Y') /* 16  YUV 4:2:2     */

#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2','P') /* 16  YVU422 planar */

#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1','P') /* 16  YVU411 planar */

#define V4L2_PIX_FMT_Y41P    v4l2_fourcc('Y','4', '1', 'P') /* 12  YUV 4:1:1     */

#define V4L2_PIX_FMT_YUV444  v4l2_fourcc('Y', '4','4', '4') /* 16  xxxxyyyy uuuuvvvv */

#define V4L2_PIX_FMT_YUV555  v4l2_fourcc('Y', 'U','V', 'O')

 

比如在CMOS摄像头里 支持

  V4L2_PIX_FMT_YVU420 ,它对应的是YV12 格式,查相应文档,它是Plane格式,即Y,U,V分三个区排列

  

YV12

0x32315659

12

8 bit Y plane followed by 8 bit 2x2 subsampled V and U planes.



This is the format of choice for many software MPEG codecs. It comprisesan NxM Y plane followed by (N/2)x(M/2) V and U planes.

 

Horizontal

Vertical

Y Sample Period

1

1

V Sample Period

2

2

U Sample Period

2

2

    

Positive biHeight implies top-down image (top line first)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UVTools are a set of software utilities to play, convert and analyze YUV or RGB video data in their raw formats. The main features of YUVTools are: It accepts (plays, converts, edits and analyzes) the combination of following formats: YUV in 4:4:4, 4:2:2 or 4:2:0 sample format, RGB in 4:4:4 sampling format; in different component order, like YUV, YVU, UYV, RGB, BGR, etc. in progressive (one single frame) or interlaced (two fields) format; in planar (YYY...UUU...VVV...) or packed (YUV, YUV....) pixel format; in predefined or arbitrary resolutions; Support FOURCC ( refer to: http://www.fourcc.org/). An image preview function to help guess the video format interactively. YUV Player can open multiple player dialogs and play different files in each dialog separately, or play multiple video files in one player dialog one by one sequentially. The detailed format of any opened or generated files will be logged, and the user can directly select any file to play back from the history list. YUV Converter can convert any combination of the format to another format, or convert to (or from) a sequence of BMP files. Other conversion functions include: scaling, join, crop, flip, padding, merge and separation of color components. YUV Analyzer can be used to calculate PSNR between two YUV files, or compare pixel by pixel to check the difference between the corresponding frames of two files, or overlay block type or motion vectors on top of each frame. Another useful feature is to help check the motion between two adjacent frames. YUV Editor can be used to edit the images pixel by pixel, or overlay one YUV image on top of another YUV image file. Convert YUV file to AVI format or vice versa; Setting options include grid display, different YUV to RGB conversion formula, etc. Many of above functions can also be performed in command line mode, which are useful for batch process or scripting.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值