图像存储格式YUV444 YUV422 YUV420叫法的原因

最近决定开始学习音视频开发,在看教程视频的时候产生了很多疑问,可惜视频里的老师并没有讲解到,后面我去查了些资料,为了防止忘记,更为了整理刚学到知识,进行以下记录,也是对自我的鞭策,如有错误,欢迎指正!

什么是YUV?

在开始分析YUV格式前,我们应该知道什么是YUV:Y表示明亮度,U和V表示色度分量
在这里插入图片描述
明亮度很好理解,可是为什么有两个色度分量呢?

受过9年义务教育的应该都知道,三原色几乎可以组成任何颜色的,其中V值就是从绿到红,V值越大,颜色越红,V值越小,颜色则越偏向绿色;U是从蓝到黄,U值越小,越蓝,U值越大,越黄。

说到这里,兄弟们可能有疑惑了,为什么是蓝色和黄色呢?经过我的查找,据说在颜色空间中,蓝色和黄色被认为是两种对比强烈的颜色,它们位于视觉系统感知的对立方位,说人话就是对比度最大。

上面我们说了它的含义,众所周知的至理:存在即合理,为什么要用YUV呢?目前我是觉得从两个方面来说觉得这玩意还是挺有必要的。

1、兼容黑白屏和彩屏:以前我们的黑白电视就是只有Y,而不会显示UV,彩色电视则能显示YUV,使用YUV就能用一套规则兼容黑白电视和彩电了。
2、减少数据量:这个就跟下面要说的格式有关系了,在这里我们长话短说,短话先不说,直接看下面吧,嘿嘿…

YUV格式

YUV有两种存储格式:planar和packed。
planar:如下图所示,先存储所有的Y,再存储U,最后存储V
在这里插入图片描述

packed:顾名思义,packed就是打包嘛,就是一个像素一个像素的打包好存储,如图所示
在这里插入图片描述

YUV444

这种格式是最简单的,跟我们最熟悉的RGB很相似,我们知道在rgb存储格式中一个像素的占位是24bit(因为red、green、blue的精度是8bit即 0~255),此处的yuv444也是如此,为了方便解释,后面所有的存储方式都是以packed为例的。
YUV444存储:
Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3
Y4U4V4 Y5U5V5 Y6U6V6 Y7U7V7
可以看出这种存储方式所存储的信息是很全的,播放视频的时候色彩还原度也会更好。但是,我们需要考虑数据量的问题,我们可以计算下:

一段时长60秒,分辨率为1280x720的电影视频(即一秒24帧)为例(当然前提是这些数据没有经过编码处理),一帧的字节数:1280x720x24/8=2764800 Byte,那么一秒的数据量应就是2764800x24=66355200 Byte,60秒就是:66355200x60=3981312000 Byte = 3.7078857421875GB,可以看出这数据量是非常庞大的,要是看60秒视频要这么多流量,那一个月得多少话费呀,当然,在实际传输中是不会这样传输的,肯定是要经过编码压缩再进行传输的,编码部分待老夫学成之后会再另写博客进行说明。

关于YUV444为什么叫YUV444,而不是YUV888 YUV999或者别的名字的问题,从存储 Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3 中可以看出这四个像素点里面一共有 4个Y,4个U,4个V,所以就叫YUV444,这样是不是就理解了,嘿嘿

YUV422

经过上面YUV444的说明,再看YUV422的名字,阁下肯定联想到了这玩意在存储时肯定丢弃的一部分数据,也就是说相邻的四个像素里肯定是只有4个Y 2个U 2个V,不得不说,阁下果真聪明‘绝顶’。

四个正常的像素点 Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3
在YUV422存储时:Y0U0 Y1V1 Y2U2 Y3V3

还是以刚刚例子举例,正常情况下我们60秒是需要3.7078857421875GB的存储空间的,我们来计算下 YUV422的,在计算之前我们应该知道这种存储方式,一个像素点里应该有几个字节,从上方我们就能看出一个像素点里应当是2个字节,由此可得存储数据应当是YUV444的2/3,即2.471923828125GB,不信?那咱再来计算一下:一帧的字节数:1280x720x16/8=1843200 Byte,那么一秒的数据量应就是1843200 x24=44236800 Byte,60秒就是:44236800x60=2654208000 Byte = 2.471923828125GB

计算完之后,我们发现这种存储方式确实大大减少了数据量,不知道各位有没有发现一个事情,YUV422每个像素点丢了一个色度分量,这个在显示的时候怎么办勒,莫急莫急,此事山人自有妙计,回答这个问题前我先从rgb开始说。不知道各位有没有做过图片的缩放,也就是获取图片的像素点,再将相应的像素点复制粘贴或者删除就能达到视觉上的缩放效果,如下:
正常像素点 :
RGB00 RGB01 RGB02 RGB03
RGB10 RGB11 RGB12 RGB13
RGB20 RGB21 RGB22 RGB23
RGB30 RGB31 RGB32 RGB33
此时如果我们需要将长宽都缩小到原来的一半,自然就是要减少长、宽上的像素点到原来的一半,即:
RGB00 RGB02
RGB20 RGB22
如果此时又需要将这个缩小后的图片放大一倍,即:
RGB00 RGB00 RGB02 RGB02
RGB00 RGB00 RGB02 RGB02
RGB20 RGB20 RGB22 RGB22
RGB20 RGB20 RGB22 RGB22
当然这种缩放肯定也是会让图片失真一些,但是整体的图形是不会变化的,甚至如果你的图片像素点足够多的话,肉眼是看不出变化的,在这个例子里我们是删除或者添加相邻的像素点来达到缩小放大的效果的,也就是说相邻的像素点其实是相似的

回归到YUV,我们在YUV422存储时,每个像素点只是丢弃了一个色度分量,亮度和另外一个色度分量是不变的,简而言之如果我们从相邻的像素点上取我们需要的色度分量,其影响会比RGB更小,那么结论也就出来了,缺什么就直接从相邻的像素点上要呗。
Y0U0 Y1V1 Y2U2 Y3V3还原后就是 Y0U0V1 Y1U0V1 Y2U2V3 Y3U2V3

YUV420

专家们进一步研究表示,每一行的相邻两个像素与下一行同位置的两个像素数据差异不大,可以进一步的丢数据。那咱说丢就丢:
正常的像素点:
Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3
Y4U4V4 Y5U5V5 Y6U6V6 Y7U7V7

在YUV420存储时:
Y0U0 Y1 Y2U2 Y3
Y4V4 Y5 Y6V6 Y7

YUV420还原显示时:
Y0U0V4 Y1U0V4 Y2U2V6 Y3U2V6
Y4U0V4 Y5U0V4 Y6U2V6 Y7U2V6

这里咱就直接说YUV420的由来吧,看第一行的是YUV,比例是不是就是4:2:0

我想看到这个地方的读者可能疑惑的就是 :每个像素点到底是存了几个字节? 对于这个我通过ffmpeg -pix_fmts得到了这个
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/283bd5f65a62479d846dd1201cf9aad0.png

先解释下这个什么意思,我们只看第一行 yuv420p 他的成分是3 一个像素点占位12bit 精度是8。成分3就是Y、U、V三个量了;精度8和rgb一样就是Y、U、V这三个值的范围都是0~255,也就是一个字节;问题来了,既然是精度8,成分3,怎么会占位是12bit也就是1.5字节呢?我们看上面420的存储:Y0U0 Y1 Y2U2 Y3 相邻的两个像素点加起来不就是3字节吗,平均一下可不就是1.5Byte了…后面的存储数据量什么的我就不计算了,有兴趣的可以自己计算下。

最后留个联系方式寻找同道:trw807160386(微信),如果有学习环境好的音视频开发群希望能拉下我(僵尸群就算了),大家一起讨论进步。

补充

YUV是PAL制式采用的颜色编码方法,另一种NTSC制式采用的颜色编码方法是YIQ。
NTSC:是一种在北美、中美洲和南美洲部分地区使用的模拟电视色彩系统。
PAL :是在欧洲、澳大利亚、亚洲部分地区、非洲部分地区和南美洲部分地区使用的模拟电视色彩系统。
这些系统非常相似,主要区别在于电力消耗。在北美,电力以 60 Hz 的频率产生。在其他大陆,标准是 50 Hz。当然,并不是电力标准频率就决定了他们所使用的电视信号标准,比如日本,虽然电力是50Hz频率产生的,但由于早期就采用NTSC,所以一直沿用了下来。

YIQ:Y是亮度(Luminance),I是橙色到青色,Q是紫色到黄绿色

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值