YUV和RGB格式分析【转】

转自:http://www.cnblogs.com/silence-hust/p/4465354.html

做嵌入式项目的时候,涉及到YUV视频格式到RGB图像的转换,虽然之前有接触到RGB到都是基于opencv的处理,很多东西并不需要我们过多深入的去探讨,现在需要完全抛弃现有的算法程序,需要从内存中一个字节一个字节的处理,这就涉及到各个视频格式和图片格式是如何存储的。看了网上的很多资料,一下资料帮助蛮大。

YUV资料整理:

http://www.fourcc.org/yuv.php    YUV和RGB的分析

http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html  对YUV的分析

http://ticktick.blog.51cto.com/823160/568928  显示YUV数据

http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html

 YUV

  做视频采集与处理,自然少不了要学会分析YUV数据。因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264、MPEG视频编解码)的角度来说,也是在原始YUV码流进行编码和解析,所以,了解如何分析YUV数据流对于做视频领域的人而言,至关重要。YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。

      人眼对色度的敏感程度要低于对亮度的敏感程度。

      YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

      YUV码流有多种不同的格式,要分析YUV码流,就必须搞清楚你面对的到底是哪一种格式,并且必须搞清楚这种格式的YUV采样和分布情况。

  YUV格式有两大类:planar和packed。
  对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
  对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。

1.  采样方式   

   
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。

    用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。

先记住下面这段话,以后提取每个像素的YUV分量会用到。

  1. YUV 4:4:4采样,每一个Y对应一组UV分量,每像素32位
  2. YUV 4:2:2采样,每两个Y共用一组UV分量,每像素16位
  3. YUV 4:2:0采样,每四个Y共用一组UV分量,每像素16位 

平常所讲的YUV A:B:C的意思一般是指基于4个象素来讲,其中Y采样了A次,U采样了B次,V采样了C次. 

YUV
格式可以分为打包格式packed format和平面格式planar
format。打包格式将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而平面格使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。Packed
format和planner format的区别在于,packed
format中的YUV是混合在一起的,因此就有了UYVY、YUYV等等,他们在码流中排列的方式有所不同。而对于planner
format每一个Y分量,U分量和V分量都是以独立的平面组织的,也就是说所有的U分量都在Y分量之后出现,而V分量在所有的U分量之后。就像三个大色块一样。

2.  存储方式

    下面用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。因为我们在实验中芷使用到YUV422的格式,这里只介绍这个,其他的可以去其他博文了找。

(1) YUYV 格式 (属于YUV422)

 

YUYV(YUY2)为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb(U)、Cr(V),分析,对于像素点Y'00、Y'01
而言,其Cb、Cr的值均为
Cb00、Cr00,其他的像素点的YUV取值依次类推。YVYU(YVY2)也一样,只是UV的位置调换了一下,先V后U。

(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。

以YUV420 planar数据为例, 以720×480大小图象YUV420 planar为例,

其存储格式是: 共大小为(720×480×3>>1)字节,

分为三个部分:Y,U和V

Y分量:    (720×480)个字节  

U(Cb)分量:(720×480>>2)个字节

V(Cr)分量:(720×480>>2)个字节

三个部分内部均是行优先存储,三个部分之间是Y,U,V 顺序存储。

即YUV数据的0--720×480字节是Y分量值,         

720×480--720×480×5/4字节是U分量    

720×480×5/4 --720×480×3/2字节是V分量。

这里Y分量其实就是我们常说的灰度值,所以需要对图片进行灰度处理的话,可以直接提取出图片的Y分量。这点对我们后面的处理很重要。

YUV4:4:4  

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

映射出像素点保持原样

YUV4: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]

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] 

用6个YUV分量描述了原来的12个YUV分量,因此压缩比为1/2,平均来讲,就是用了12bit表示了一个象素点,原来YUV(8bit*3)是24bit。

 

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] 

 

RGB

  计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red)、G(Green)、B(Blue)相加混色的原理:通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。这种色彩的表示方法称为RGB色彩空间表示(它也是多媒体计算机技术中用得最

多的一种色彩空间表示方法)。根据色度学的介绍,不同波长的单色光会引起不同的彩色感觉,但相同的彩色感觉却可以来源于不同的光谱成分组合。自然界中几乎所有的颜色都能用三种基本彩色混合配出,在彩色电视技术中选择红色、绿色、和蓝色作为三基色。其他的颜色都可以用红色、绿色和蓝色按照不同的比例混合而成。所选取的红色、绿色和蓝色三基色空间。简称为RGB颜色空间。

RGB565    每个像素用16位表示,RGB分量分别使用5位、6位、5位

RGB555    每个像素用16位表示,RGB分量都使用5位(剩下1位不用)

RGB24    每个像素用24位表示,RGB分量各使用8位

RGB32    每个像素用32位表示,RGB分量各使用8位(剩下8位不用)

ARGB32    每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)

RGB565(我们使用的格式)

使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。

程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:      

高字节              低字节 

R R R R R G G G     G G G B B B B B 

可以组合使用屏蔽字和移位操作来得到RGB各分量的值:  

#define RGB565_MASK_RED    0xF800 

#define RGB565_MASK_GREEN  0x07E0 

#define RGB565_MASK_BLUE   0x001F 

R = (wPixel & RGB565_MASK_RED) >> 11;   // 取值范围0-31 

G = (wPixel & RGB565_MASK_GREEN) >> 5;  // 取值范围0-63 

B =  wPixel & RGB565_MASK_BLUE;         // 取值范围0-31

#define RGB(r,g,b) (unsigned int)( (r|0x08 << 11) | (g|0x08 << 6) | b|0x08 )

#define RGB(r,g,b) (unsigned int)( (r|0x08 << 10) | (g|0x08 << 5) | b|0x08 )

该代码可以解决24位与16位相互转换的问题

RGB555

是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。

使用一个字读出一个像素后,这个字的各个位意义如下:     

 高字节             低字节 

X R R R R G G       G G G B B B B B       (X表示不用,可以忽略)  

RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255 

RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位不用

RGB24

RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:

typedef struct tagRGBTRIPLE {

BYTE rgbtBlue; // 蓝色分量

BYTE rgbtGreen; // 绿色分量

BYTE rgbtRed; // 红色分量

} RGBTRIPLE;

RGB32

RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB24。)注意在内存中RGB各分量的排列顺序为:BGRA
BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:

typedef struct tagRGBQUAD {

BYTE rgbBlue; // 蓝色分量

BYTE rgbGreen; // 绿色分量

BYTE rgbRed; // 红色分量

BYTE rgbReserved; // 保留字节(用作Alpha通道或忽略)

} RGBQUAD。

时间: 2024-11-08 21:30:49

YUV和RGB格式分析【转】的相关文章

c语言-C语言解析JPG格式图片的到RGB值分析图片接近那种颜色

问题描述 C语言解析JPG格式图片的到RGB值分析图片接近那种颜色 有个课程设计需要解析jpg格式的图片得到RGB值然后判断这张图片接近那种颜色!本人C语言小白,请大神指点,在此不胜感激!邮箱dushigg@sina.cn.

常用YUV转RGB代码

常用YUV转RGB  [java] view plaincopyprint? public class YuvToRGB {       private static int R = 0;       private static int G = 1;       private static int B = 2;       //I420是yuv420格式,是3个plane,排列方式为(Y)(U)(V)       public static int[] I420ToRGB(byte[] sr

RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB

jackyhwei 发布于 2010-01-01 12:02 点击:3218次  来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB等等. TAG: YUV  YUV转RGB  RGB  BMP转JPG  文字叠加     /**************************************File: yuvrgb24.hDescription: header file for yuvrgb24.cDate

什么是YUV、RGB?

由来 通常我们用RGB表示一种彩色.计算机系统里的LCD显示的数据就是RGB来表示每个像素的颜色.而在我们生活里,有黑白电视机与彩色电视机两种,拍摄节目源时不可以用两种不同的摄像机来存放两种图像数据.所以为了兼容两种电视机,专家就引入YUV格式代替RGB,其中Y表示亮度, U和V表示色差. 黑白电视机只用Y信号, 而彩色电视机可由YUV转换成RGB再显示颜色.通常我们所用的YUV格式是 ITU-R 的标准 , 也叫YCbCr. YUV与RGB的换算规则 Y Y = 0.299 x R + 0.5

QQwry.dat格式分析和查询IP位置的PHP程序

程序 QQwry.dat格式分析和查询IP位置的PHP程序 By Strongc http://strongc.51.net/d2x/ 转载时不要去掉我的名字和我的主页链接,谢谢! 以前的追捕数据库太大,而且很久没有更新了. 所以我想到利用QQwry.dat这个文件查询IP所在位置,QQwry.dat 在很多地方都能找到,一般看IP地址的QQ压缩包中都有. 但是没有任何相关格式资料. 我分析了这个文件的格式,目前如下结论: 格式如下: A.文件头,共8字节 B.若干条记录的结束地址+国家和区域

UNIX/LINUX 平台可执行文件格式分析

可执行文件格式综述 相 对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者.可执行文件的大小.运行速度.资源占用情况以及可 扩展性.可移植性等与文件格式的定义和文件加载过程紧密相关.研究可执行文件的格式对编写高性能程序和一些黑客技术的运用都是非常有意义的. 不 管何种可执行文件格式,一些基本的要素是必须的,显而易见的,文件中应包含代码和数据.因为文件可能引用外部文件定义的符号(变量和函数),因此重定位信 息和符号信息也是需要的.一些辅助信息是可选的,

AAC 格式分析

一SADTS格式:        ADTS的全称是Audio Data Transport Stream.是AAC音频的传输流格式.        AAC音频格式在MPEG-2(ISO-13318-7 2003)中有定义.AAC后来又被采用到MPEG-4标准中.        1. adts_sequence()        {               while (nextbits() == syncword)               {                      a

HTTP POST请求报文格式分析与Java实现文件上传

(转载于:http://blog.csdn.net/bboyfeiyu/article/details/41863951?utm_source=tuicool) 在开发中,我们使用的比较多的HTTP请求方式基本上就是GET.POST.其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等.而我们在使用HTTP请求时中遇到的比较麻烦的事情就是构造文件上传的HTTP报文格式,这个格式虽说也比较简单,但也比较容易出错.今天我们就一起来学习HTTP POST的报文格式以

Converting Between YUV and RGB

It is frequently necessary to convert between YUV pixel formats (used by the JPEG and MPEG compression methods) and RGB format (used by many hardware manufacturers.) The following formulas show how to compute a pixel's value in one format from the pi