zoukankan      html  css  js  c++  java
  • 多媒体编程基础之RGB和YUV

    一、概念

      1.什么是RGB

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

      2.什么是YUV

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

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

      由此可见,RGB和YUV都属于颜色空间(或者叫“色彩空间”),如果不清楚色彩空间的概念,可以访问我的另一篇博客:http://www.cnblogs.com/1992monkey/p/5911332.html

    二、RGBYUV的优缺点

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

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

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

    三、YUVRGB的实现原理

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

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

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

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

      2.YUV中,“Y”表示明亮度LuminanceLuma),也就是灰阶值;而“U”和“V” 表示的则是色度ChrominanceChroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用CrCb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

    四、RGBYUV的格式

      1.RGB的格式

      ①网页格式

      ②RGB555

      ③RGB565

      ④RGB24

      ⑤RGB32

      2.YUV格式

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

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

      ⑨YUV411YUV420格式多见于DV数据中,前者用于NTSC制,后者用于PAL制。YUV411为每个像素都提取Y分量,而UV分量在水平方向上每4个像素采样一次。YUV420并非V分量采样为0,而是跟YUV411相比,在水平方向上提高一倍色差采样频率,在垂直方向上以U/V间隔的方式减小一半色差采样。

      3.DirectShow中,常见的RGB格式有RGB1RGB4RGB8RGB565RGB555RGB24RGB32ARGB32等;常见的YUV格式有YUY2YUYVYVYUUYVYAYUVY41PY411Y211IF09IYUVYV12YVU9YUV411YUV420等。

    五、RGBYUV转换

      对于数字视频,定义了从 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*(LZ)/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 为黑电平变量。对于计算机RGBZ 等于 0。对于 studio视频RGBZ 等于 16*2,其中 N 为每个 RGB样例的位数 (N >= 8)S 为缩放变量。对于计算机RGBS 等于 255。对于 studio视频RGBS 等于 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:0YCbCr 4:2:2YCbCr 4:1:1YCbCr 4:4:4

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

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

      (1YUV 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

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

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

      (4YUV4:2:0

      4:2:0并不意味着只有YCb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x222列相邻的像素组成的宏像素需要占用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]

     

    参考文献:

    1.http://baike.baidu.com/link?url=6Okoc5knsvqD4bsz4IwMSsztUBvTL7zZVNhrgsTVP_88765AMQQTRtovwMli1eCVvs2oucw_o9SDT3rc5McSY_

    2.http://baike.baidu.com/link?url=ZD5ltSW0yQyFgdWRlx0uwbmlTRLSmYgoROA893gJSIGV6MwoKJtFVLaprKXzhINvGOKO_Qb3RSnV7Btc898jMa#3

    本文内容完全摘自以上文章,整理出来是为了梳理出关键信息,便于更好的理解。更多信息请访问以上链接。

     

  • 相关阅读:
    ECS内网穿透
    设置服务器ssh会话时间
    VScode插件
    Linux拷贝U盘文件(命令行)
    打开IDM下载视频时弹出防火墙阻止下载,解决方案
    如何将jmeter.bat命令文件固定到任务栏
    jmeter安装教程
    安装JDK8.0(JDK1.8) & 环境变量配置 & idea中配置java路径
    教你不用任何第三方软件实现任务栏居中
    [Unity优化]gc03:代码优化
  • 原文地址:https://www.cnblogs.com/1992monkey/p/5912072.html
Copyright © 2011-2022 走看看