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分量排列顺序如下:
Y0U0Y1V0Y2U2Y3V2…
②YVYU格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
Y0V0Y1U0Y2V2Y3U2…
③UYVY格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
U0Y0V0Y1U2Y2V2Y3…
④AYUV格式带有一个Alpha通道,并且为每个像素都提取YUV分量,图像数据格式如下:
A0Y0U0V0A1Y1U1V1…
⑤Y41P(和Y411)格式为每个像素保留Y分量,而UV分量在水平方向上每4个像素采样一次。一个宏像素为12个字节,实际表示8个像素。图像数据中YUV分量排列顺序如下:
U0Y0V0Y1U4Y2V4Y3Y4Y5Y6Y8…
⑥Y211格式在水平方向上Y分量每2个像素采样一次,而UV分量每4个像素采样一次。一个宏像素为4个字节,实际表示4个像素。图像数据中YUV分量排列顺序如下:
Y0U0Y2V0Y4U4Y6V4…
⑦YVU9格式为每个像素都提取Y分量,而在UV分量的提取时,首先将图像分成若干个4x4的宏块,然后每个宏块提取一个U分量和一个V分量。图像数据存储时,首先是整幅图像的Y分量数组,然后就跟着U分量数组,以及V分量数组。IF09格式与YVU9类似。
⑧IYUV格式为每个像素都提取Y分量,而在UV分量的提取时,首先将图像分成若干个2x2的宏块,然后每个宏块提取一个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-RRecommendationBT.709的规范。
第一个转换是BT.709中定义用于50-Hz的较早的YUV格式。它与在ITU-RRecommendationBT.601中指定的关系相同,ITU-RRecommendationBT.601也被称为它的旧名称CCIR601。这种格式应该被视为用于标准定义TV分辨率(720x576)和更低分辨率视频的首选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的主要采样格式有YCbCr4:2:0、YCbCr4:2:2、YCbCr4:1:1和YCbCr4:4:4。
其中YCbCr4:1:1比较常用,其含义为:每个点保存一个8bit的亮度值(也就是Y值),每2x2个点保存一个Cr和Cb值,图像在肉眼中的感觉不会起太大的变化。所以,原来用RGB(R,G,B都是8bitunsigned)模型,1个点需要8x3=24bits(如下图第一个图),(全采样后,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个字节。
下面的四个像素为:[Y0U0V0][Y1U1V1][Y2U2V2][Y3U3V3]
存放的码流为:Y0U0V0Y1U1V1Y2U2V2Y3U3V3
(2)YUV4:2:2
每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存。
下面的四个像素为:[Y0U0V0][Y1U1V1][Y2U2V2][Y3U3V3]
存放的码流为:Y0U0Y1V1Y2U2Y3V3
映射出像素点为:[Y0U0V1][Y1U0V1][Y2U2V3][Y3U2V3]
(3)YUV4:1:1
4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存。
下面的四个像素为:[Y0U0V0][Y1U1V1][Y2U2V2][Y3U3V3]
存放的码流为:Y0U0Y1Y2V2Y3
映射出像素点为:[Y0U0V2][Y1U0V2][Y2U0V2][Y3U0V2]
(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字节内存。
下面八个像素为:[Y0U0V0][Y1U1V1][Y2U2V2][Y3U3V3]
[Y5U5V5][Y6U6V6][Y7U7V7][Y8U8V8]
存放的码流为:Y0U0Y1Y2U2Y3
Y5V5Y6Y7V7Y8
映射出的像素点为:[Y0U0V5][Y1U0V5][Y2U2V7][Y3U2V7]
[Y5U0V5][Y6U0V5][Y7U2V7][Y8U2V7]
完!
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!