嵌入式 RGB和YUV之比较

原创 2013年12月02日 14:43:49

RGB原理

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

  有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在软件中设定颜色就容易理解了。 

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

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

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

      对一种颜色进行编码的方法统称为 “ 颜色空间 ” 或 “ 色域 ” 。用最简单的话说,世界上任何一种颜色的 “ 颜色空间 ”都可定义成一个固定的数字或变量。 RGB (红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示 -红色绿色以及蓝色的强度。记录及显示彩色图像时, R GB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,件多电子电器厂商普遍采用的做法是,将 RGB 转换成 YUV颜色空同,以维持兼容,再根据需要换回 RGB 格式,以便在电脑显示器上显示彩色图形。 

RGB24 是指 R , G , B三个分量各占 8 位

RGB32 是指 R , G , B, A 四个分量各占 8 位

在 Windows桌面属性外观中编辑颜色时,有 YUV 和 RGB 两种编辑 方法。

  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 格式有 RGB1 、 RGB4 、 RGB8 、 RGB565 、 RGB555 、 RGB24 、 RGB32、 ARGB32 等;常见的 YUV 格式有 YUY2 、 YUYV 、 YVYU 、 UYVY 、 AYUV 、 Y41P 、Y411 、 Y211 、 IF09 、 IYUV 、 YV12 、 YVU9 、 YUV411 、 YUV420等。

主要的采样格式有 YCbCr4: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 ) YUV4:4:4

   YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常 8 比特),经过 8比特量化之后,未经压缩的每个像素占用 3 个字节。

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

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

  ( 2 ) YUV4:2:2

  每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是 4:4:4 的一半。对非压缩的 8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用 4 字节内存。

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

  存放的码流为: Y0 U0 Y1V1 Y2 U2 Y3 V3

  映射出像素点为: [Y0 U0V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

  ( 3 ) YUV4:1:1

   4:1:1的色度抽样,是在水平方向上对色度进行 4:1 抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的 8比特量化的视频来说,每个由 4 个水平方向相邻的像素组成的宏像素需要占用 6 字节内存。

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

  存放的码流为 : Y0 U0Y1 Y2 V2 Y3

  映射出像素点为: [Y0 U0V2] [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 U0V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

   [Y5 U5 V5] [Y6U6 V6] [Y7U7 V7] [Y8 U8 V8]

  存放的码流为: Y0 U0 Y1Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8

  映射出的像素点为: [Y0 U0V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]

   [Y5 U0 V5] [Y6U0 V5] [Y7U2 V7] [Y8 U2 V7]

关于YUV和RGB之间的转换公式

转载地址:http://blog.sina.com.cn/s/blog_5713096b0100059i.html 总结了一下网上关于YUV的一些东西 先区分一下YUV和YCbCr YUV色彩模...
  • lvwx369
  • lvwx369
  • 2014年12月15日 11:38
  • 1670

YUV和RGB的相互转换实验报告

1、彩色空间转换的公式及分析;2、实验流程分析;3、关键代码及分析;4、实验结果及分析;5、结论...
  • qq_37650889
  • qq_37650889
  • 2017年03月10日 14:20
  • 547

【OpenGL】用OpenGL shader实现将YUV转RGB-(直接调用GPU实现,纯硬件方式,效率高)

这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV格式转RGB格式转换成功了。下面就来介绍一下: 由于我的工程是在vs2008中的,其中包含一些相关头文件和库,所以下面只是列出部分核心...
  • xiaoguaihai
  • xiaoguaihai
  • 2013年03月14日 13:42
  • 19140

Android视频渲染: YUV转RGB

原创文章,转载请注明:转载自ian的个人博客[http://www.icodelogic.com] 本文链接地址: http://www.icodelogic.com/?p=6 Android S...
  • panda1234lee
  • panda1234lee
  • 2013年01月24日 15:09
  • 4545

RGB TO YUV转换原理及代码示例

RGB TO YUV转换原理及代码示例 由于H.264等压缩算法都是在YUV的颜色空间上进行的,所有在进行压缩前,首先要进行颜色空间的转换。如果摄像头采集的资源是RG...
  • Allyli0022
  • Allyli0022
  • 2016年10月11日 10:02
  • 1580

YUV 格式与 RGB 格式的相互转换公式及C++ 代码

YUV 格式与 RGB 格式的相互转换公式最近在用的一个工业相机,输出的图像格式是 YUY2 格式。而在电脑上显示时需要 RGB 格式,所以就花了些时间在网上查了些相关的资料。说实话,网上关于 YUV...
  • liyuanbhu
  • liyuanbhu
  • 2017年04月02日 13:00
  • 3897

24位BMP图像RGB与YUV转换

关于BMP图像格式的部分这里就不讲了,网上有很多资料可以查阅,详细可以看下面的代码。 在读取了BMP图像以后,开始把RGB转化为YUV(有关YUV可以查阅wiki)。 本次使用的YUV标准是8-bit...
  • frozenshore
  • frozenshore
  • 2015年11月22日 10:46
  • 935

常用YUV转RGB代码

常用YUV转RGB [java] view plaincopyprint?public class YuvToRGB {      private static int R = 0;      pri...
  • mao0514
  • mao0514
  • 2016年01月19日 19:14
  • 1835

YUV转RGB汇总

/* YUV, http://zh.wikipedia.org/wiki/YUV#.E5.B8.B8.E7.94.A8.E7.9A.84YUV.E6.A0.BC.E5.BC.8F *...
  • mt122
  • mt122
  • 2014年08月09日 20:36
  • 1185

RGB-YUV转换公式

YUV色彩空间:        Y是亮度值,也就是说8位的灰度值即可组成一幅黑白图像,黑白电视机就是这样的.        UV是色彩值,是给Y上色用的.U是Cb也就是RGB中的蓝色分量,...
  • uselym
  • uselym
  • 2015年11月26日 23:05
  • 1205
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 RGB和YUV之比较
举报原因:
原因补充:

(最多只允许输入30个字)