欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RGB和YUV 多媒体编程基础详细介绍

程序员文章站 2022-07-22 21:32:44
rgb和yuv 多媒体编程 一、概念   1.什么是rgb?   对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间...

rgb和yuv 多媒体编程

一、概念

  1.什么是rgb?

  对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。rgb(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,rgb是最常见的一种方案。

  2.什么是yuv?

  yuv是被欧洲电视系统所采用的一种颜色编码方法(属于pal),是pal和secam模拟彩色电视制式采用的颜色空间

  在现代彩色电视系统中,通常采用三管彩色摄影机或彩色ccd摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到rgb,再经过矩阵变换电路得到亮度信号y和两个色差信号b-y(即u)、r-y(即v),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的yuv色彩空间表示。

  由此可见,rgb和yuv都属于颜色空间(或者叫“色彩空间”),如果不清楚色彩空间的概念。

二、rgb和yuv的优缺点

  1.rgb缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将rgb转换成yuv颜色空间,以维持兼容,再根据需要换回rgb格式,以便在电脑显示器上显示彩色图形。

  2.yuv主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与rgb视频信号传输相比,它最大的优点在于只需占用极少的频宽(rgb要求三个独立的视频信号同时传输)。

  3.采用yuv色彩空间的重要性是它的亮度信号y和色度信号u、v是分离的。如果只有y信号分量而没有u、v分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用yuv空间正是为了用亮度信号y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

三、yuv和rgb的实现原理

  1.rgb是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。

红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。

红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。

rgb 颜色称为加成色,因为您通过将 r、g 和 b 添加在一起(即所有光线反射回眼睛)可产生白色。加成色用于照明光、电视和计算机显示器。例如,显示器通过红色、绿色和蓝色荧光粉发射光线产生颜色。绝大多数可视光谱都可表示为红、绿、蓝 (rgb) 三色光在不同比例和强度上的混合。这些颜色若发生重叠,则产生青、洋红和黄。

  2.在yuv中,“y”表示明亮度(luminance或luma),也就是灰阶值;而“u”和“v” 表示的则是色度(chrominance或chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过rgb输入信号来建立的,方法是将rgb信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用cr和cb来表示。其中,cr反映了rgb输入信号红色部分与rgb信号亮度值之间的差异。而cb反映的是rgb输入信号蓝色部分与rgb信号亮度值之间的差异。

四、rgb和yuv的格式

  1.rgb的格式

  ①网页格式

  ②rgb555

  ③rgb565

  ④rgb24

  ⑤rgb32

  2.yuv格式

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

  ①yuy2(和yuyv)格式为每个像素保留y分量,而uv分量在水平方向上每两个像素采样一次。一个宏像素为4个字节,实际表示2个像素。(4:2:2的意思实际上是一个宏像素中有2个y分量、1个u分量和1个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类似。

  ⑨yuv411、yuv420格式多见于dv数据中,前者用于ntsc制,后者用于pal制。yuv411为每个像素都提取y分量,而uv分量在水平方向上每4个像素采样一次。yuv420并非v分量采样为0,而是跟yuv411相比,在水平方向上提高一倍色差采样频率,在垂直方向上以u/v间隔的方式减小一半色差采样。

  3.在directshow中,常见的rgb格式有rgb1、rgb4、rgb8、rgb565、rgb555、rgb24、rgb32、argb32等;常见的yuv格式有yuy2、yuyv、yvyu、uyvy、ayuv、y41p、y411、y211、if09、iyuv、yv12、yvu9、yuv411、yuv420等。

五、rgb和yuv转换

  对于数字视频,定义了从 rgb 到两个主要 yuv 的转换。这两个转换都基于称为 itu-r recommendation bt.709 的规范。

  第一个转换是 bt.709 中定义用于 50-hz 的较早的 yuv 格式。它与在 itu-r recommendation bt.601 中指定的关系相同, itu-r recommendation bt.601 也被称为它的旧名称 ccir 601。这种格式应该被视为用于标准定义 tv分辨率(720 x 576) 和更低分辨率视频的首选 yuv 格式。它的特征由下面两个常量 kr 和 kb 的值来定义:

  kr = 0.299

  kb = 0.114

  第二个转换为 bt.709 中定义用于 60-hz 的较新 yuv 格式,应该被视为用于高于 sdtv 的视频分辨率的首选格式。它的特征由下面两个不同的常量值来定义:

  kr = 0.2126

  kb = 0.0722

  从 rgb 到 yuv 转换的定义以下列内容开始:l = kr * r + kb * b + (1 – kr – kb) * g然后,按照下列方式获得 yuv 值:

  y = floor(2^(m-8) * (219*(l–z)/s + 16) + 0.5)

  u = clip3(0, 2^m-1, floor(2^(m-8) * (112*(b-l) / ((1-kb)*s) + 128) + 0.5))

  v = clip3(0, 2^m-1, floor(2^(m-8) * (112*(r-l) / ((1-kr)*s) + 128) + 0.5))

  其中,m 为每个 yuv 样例的位数 (m >= 8)。

  z 为黑电平变量。对于计算机rgb,z 等于 0。对于 studio视频rgb,z 等于 16*2,其中 n 为每个 rgb样例的位数 (n >= 8)。s 为缩放变量。对于计算机rgb,s 等于 255。对于 studio视频rgb,s 等于 219*2。

  函数floor(x) 返回大于或等于 x 的最大整数。函数clip3(x, y, z) 的定义如下所示:

  clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))y 样例表示亮度,u 和 v 样例分别表示偏向蓝色和红色的颜色偏差。y 的标称范围为 16*2 到 235*2 。黑色表示为 16*2 ,白色表示为 235*2 。u 和 v 的标称范围为 16*2 到 240*2 ,值 128*2 表示中性色度。但是,实际的值可能不在这些范围之内。

  对于 studio 视频 rgb 形式的输入数据,要使得 u 和 v 值保持在 0 到 2m-1 范围之内,必需进行剪辑操作。如果输入为计算机rgb,则不需要剪辑操作,这是因为转换公式不会生成超出此范围的值。

  这些都是精确的公式,没有近似值。

六、yuv的采样格式

  yuv的主要采样格式有ycbcr 4:2:0、ycbcr 4:2:2、ycbcr 4:1:1和 ycbcr 4:4:4。

  其中ycbcr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是y值),每 2x2 个点保存一个 cr 和cb 值,图像在肉眼中的感觉不会起太大的变化。所以, 原来用 rgb(r,g,b 都是 8bit unsigned) 模型, 1个点需要 8x3=24 bits(如下图第一个图),(全采样后,yuv仍各占8bit)。按4:1:1采样后,而现在平均仅需要 8+(8/4)+(8/4)=12bits(4个点,8*4(y)+8(u)+8(v)=48bits), 平均每个点占12bits(如下图第二个图)。这样就把图像的数据压缩了一半。

  上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式:

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

       完!

       感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!