RGB和YUV 多媒体编程基础详细介绍
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]
完!
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!