前言:
眼前兄弟们对“yuv叠加算法”大概比较看重,小伙伴们都想要学习一些“yuv叠加算法”的相关知识。那么小编在网摘上汇集了一些关于“yuv叠加算法””的相关文章,希望兄弟们能喜欢,姐妹们快快来学习一下吧!0.引言
本篇文章主要讲解YUV格式和内存排列,看完本篇文章,能够快速对YUV格式有个更清楚的认识。
从下图就可以看出,YUV4:1:1,YUV4:2:0,就压缩的最厉害。通常在网络传输时,一般在送到编码之前,都转换成为这2种格式。
1.YUV简述
yuv是欧洲电视系统采用的颜色编码方法之一,包含一个亮度信号Y和两个色差信号U、V。yuv格式能够优化彩色视频信号数据的存储方式。与RGB格式相比,最大的优势在于只需占用极少的数据存储空间,使得数据传输更为简易。
yuv中,“Y”表示明亮度,也就是灰阶值;而“U”和“V”表示的则是色度,色度的作用是记录图像色彩及饱和度。“亮度”是透过输入信号来建立的,方法是将信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
采用yuv色彩空间的重要性是它的亮度信号y和色度信号u、v是分离的。如果只有y信号分量而没有u、v分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用yuv空间正是为了用亮度信号y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
2.YUV采样格式
主要的采样格式有YCbCr:4:4:4、YCbCr:4:2:2、YCbCr:4:2:0、以及YCbCr:4:2:1,举例说明中YCbCr:4:1:1为常用的采样格式,其含义为:每个点保存一个8bit的亮度值(也就是Y值),每4个点保存一个Cr和Cb值,Cr和Cb像素点在肉眼中的感觉不会起太大的变化。所以,原来用RGB(R,G,B都是8bit unsigned)模型,即1个点需要24bits。如果按YCbCr:4:1:1采样后,平均每个点仅需要8+8/4+8/4=12bits。这样就把图像的数据压缩了一半。下面对这几种格式做详细介绍。
(1)YUV 4:4:4
YUV三个采样数据完整存储,不存在任何数据损失与压缩,当然数据存储大小不变,与格式相同。如下图:
每一个交叉表示一个Y值数据,每一个圆圈表示一个U值与V值数据,图中为每个Y值对应一个U值与V值,整体为一个像素点,该像素点数据保存完整。
交错格式存储如下:
YUV数据在内存中的存储方式,每3个为一组,为方便32位计算机的按位直接读取,通常在每组YUV值后会填充一个A值,使得每次读取数值为32位,增加读取速度。
(2)YUV 4:2:2
灰度值数据Y完整读取,色度U与V仅保留原本的一半,取每行像素点的奇数位的UV值进行保存。此处UV数据压缩百分之五十,Y数据不变,压缩比为1-(4+2+2)/(4+4+4)*100%=33.33%)。因像素点在屏幕显示后,图像颜色的失真对于观察者来说并不会影响图像的质量与观赏度,所以能够按此法进行压缩。如下图所示:
交错格式存储如下:
每一个交叉表示一个Y值数据,每一个圆圈表示一个U值与V值数据,图中为每两个Y值对应一个U值与V值,整体为两个像素点,两像素点共用一个相同的色度差,利用物体颜色在两个像素的距离内不会变化过大的原理,合理压缩图像数据。
为YUV数据在内存中的存储方式,每4个为一组,其中奇数位为Y值,偶数位为U值与V值,32位计算机在读取时能够一次恰好读取一组YUV数据,其中包括两个Y值与其共用的一个U值与V值。
(3)YUV 4:1:1
灰度值数据Y依旧完整读取,而色度U与V仅保留原本的四分之一,取每两行像素点的左上位置的UV值进行保存。此处数据压缩百分之七十五,Y数据不变,压缩比为1-(4+1+1)/(4+4+4)*100%=50%)。同样利用因像素点在屏幕显示后,图像颜色的失真对于观察者来说并不会影响图像的质量与观赏度,既然YUV4:2:2能够横向压缩,所以YUV 4:1:1能够增加纵向压缩,达到更加高的压缩比例,但需要付出数据较难处理的代价。如下图所示:
每一个交叉表示一个Y值数据,每一个圆圈表示一个U值与V值数据,图中为每四个Y值对应一个U值与V值,整体为四个像素点,四个像素点共用一个相同的色度差,同样利用物体颜色在两个像素的距离内不会变化过大的原理,合理压缩图像数据。内存排列如下图所示:
上图中,为YUV 4:1:1数据在内存中的存储方式,与YUV 4:4:4、YUV 4:2:2不同的是,虽然YUV 4:1:1压缩比最大,需要存储的数据最少,但是其存储方式是最为复杂的,需要使用三个Buffer依次存取Y,U,V,三值,此存储方式节约了存储内存空间与数据进行传送时的网络传输带宽,增加了编程人员对数据还原显示处理的难度。
确定图像的存储方式关系到数据在内存中的存储方式,当进行图像合并时,需要对内存中的数据进行修改,以达到合并图像的效果,所以了解图像存储方式至关重要。
注意:尽管上面列举出了一些常用的格式,但是还是有很多格式也是有用到的,实际遇到采集与编码格式不同,或解码与播放格式不同,就需要进行格式转换。理解清楚这些格式转换就知道怎么去转换了,当然如果搞不清这种数据关系,也有库可以用。
3.其它
如WebRTC库中源码对于图像类的命名为I420,初步猜测为YUV4:2:0格式。但在interface文件I420videoframe.h中观察创建图像的方法与其参数:
int CreateFrame(int size_y,const uint8_t & buffer_y,int size_U,const uint8_t & buffer_U, int size_V,const uint8_t & buffer_V,int width,int heigth, int stride_y,int stride_u,int stride_v)
推断其实际存储方式为YUV4:1:1,因为参数中包含三个Buffer,分别为bufferY,bufferU以及bufferV,以及他们对应的大小。
事实上,WebRTC作为视频通话的开发库,其考虑最优先的必然是最大化压缩数据,减少需要网络传输的数据,减少视频通话与现实中的延迟,在使得视频通话顺畅的基础上,再进行画质的改善。因此WebRTC选择YUV4:1:1为合理选择,但此图像格式处理的方式较为困难,后面文章再介绍下怎么转换的算法。
4.总结
本文用一篇非常简短的文章,再次讲述了YUV格式和内存排列,后面有机会再继续讲讲一些转换算法和RGB格式。欢迎关注,收藏,转发,分享。
后期关于项目知识,也会更新在微信公众号“记录世界 from antonio”,欢迎关注
标签: #yuv叠加算法