• YUV图像基础知识


    概念

    YUV和RGB的功能类似,都是用来表示图像色彩的。但是对于 YUV 所表示的图像,Y 和 UV 分量是分离的。如果只有 Y 分量而没有 UV 分离,那么图像表示的就是黑白图像。彩色电视机采用的就是 YUV 图像,解决与和黑白电视机的兼容问题,使黑白电视机也能接受彩色电视信号。 YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。因此RGB用于渲染,YUV用于传输。

    因为人眼对色度的敏感程度低于对亮度的敏感程度。主要原因是视网膜杆细胞多于视网膜锥细胞,其中视网膜杆细胞的作用就是识别亮度,视网膜锥细胞的作用就是识别色度。所以,眼睛对于亮度的分辨要比对颜色的分辨精细一些。利用这个原理,可以把色度信息减少一点,人眼也无法察觉这一点。 这也是视频压缩的原理之一。

    我们重温一下这张图:视频文件播放流程图

    视频文件播放流程图

    img

    视频通过解码器解码出来得到YUV数据,YUV再转换成RGB交给GPU渲染就能在显示器上看到画面了。

    YUV的储存方式

    YUV格式有两大类:planar和packed。

    对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。

    对于packed的YUV格式,每个像素点的Y,U,V是连续交替存储的。

    YUV的采样

    主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0

    YUV4:4:4 表示完全取样,每一个Y对应一组UV分量。 一个YUV占 8+8+8 = 24bits,3个字节。

    YUV4:2:2 表示2:1的水平取样,垂直完全采样,,每两个Y共用一组UV分量。 一个YUV占 8+4+4 = 16bits 2个字节。

    YUV4:2:0 表示2:1的水平取样,垂直2:1采样,每四个Y共用一组UV分量。 一个YUV占 8+2+2 = 12bits 1.5个字节

    注意:YUV 4:2:0这并不意味着只有Y、U,没有V分量,只是说U分量和V分类交替采样。 一个字节是8位

    直接上图:

    [图片上传失败...(image-9da4c9-1582641374506)]

    为什么这张图是8X4的图,因为我们假设这是一张宽是8像素,高是4个像素的图,当然你也可以用4X4的。

    YUV与RGB转换

    RGB转成YUV:

    Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

    YUV转成RGB: B = 1.164(Y - 16) + 2.018(U - 128) G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) R = 1.164(Y - 16) + 1.596(V - 128)

    YUV420p和YUV420sp具体分类和详情

    YUV420也是目前最主流的采样方式,因为这样的采样最省空间,而又不会大幅度影响人类肉眼的观赏性。

    CSDN后台私信或文末卡片加入免费领取最新最全C++/音视频开发学习提升资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

    YUV420p:又叫planer平面模式,Y ,U,V分别在不同平面,也就是有三个平面。

    YUV420p又分为YU12 和 YU21(又叫I420):他们的区别只是存储UV的顺序不一样而已。

    YU12:安卓的模式。存储顺序是先存Y,再存U,最后存V。YYYYUUUVVV

    YV12:存储顺序是先存Y,再存V,最后存U。YYYVVVUUU

    YUV420SP是packed类型的。它是先存储了 Y 分量,但接下来并不是再存储所有的 U 或者 V 分量,而是把 UV 分量交替连续存储。

    NV12 和 NV21 格式都属于YUV420SP类型。

    NV12 是 IOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储。

    NV21 是 安卓 中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储。

    YUV的内存大小计算

    内存大小 = 一个YUV的字节大小 * 宽 * 高 以YUV420为例,总大小=宽1.5 Y分量 = 宽 * 高 U分量 = 总大小 / 4 V分量 = 总大小 / 4

    结语

    对于YUV基本的认识今天先了解到这里,如果你也想深入学习音视频开发,请关注共同进步。

  • 相关阅读:
    项目上线就炸,这谁受得了
    读取pdf、docx、doc、ppt、pptx并转为txt
    【14】c++11新特性 —>共享智能指针
    8-13外部排序-败者树
    基于springboot实现职称评审管理系统演示【项目源码+论文说明】分享
    ETCD快速入门-03 常用命令
    GoLang协程与通道---下
    linux 0.11内核源码(1)之开机启动过程
    Linux 权限
    大数据【列举RDF序列化的主要方式、将N-Triples数据用Turtle表示】
  • 原文地址:https://blog.csdn.net/yinshipin007/article/details/127973249