音视频技术入门课 -01 如何从色彩格式、帧率等参数角度看视频图像?
本文将从视频 / 图像的原始数据格式、视频逐行 / 隔行扫描、帧率、图像分辨率、色域等几方面入手,对视频基础知识做一个整体性的了解。
视频、图像像素点数据格式
看视频时会看到很多图像,是由一个个像素点组成的线,又由一条条线组成面,这个面铺在屏幕上展现出来的就是我们看到的图像。
一些常见的色彩格式,分别是:
• GRAY 色彩空间
• YUV 色彩空间
• RGB 色彩空间
• HSL 和 HSV 色彩空间
GRAY 灰度模式表示
黑白电视的图像就是以 GRAY 的方式展现的图像,也就是 Gray 灰度模式。
这一模式为 8 位展示的灰度,取值 0 至 255,表示明暗程度,0 为最黑暗的模式,255 为最亮的模式,色彩表示范围如图所示:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901135040501-992438499.png)
图1 GARY灰度模式表示
由于每个像素点是用 8 位深展示的,所以一个像素点等于占用一个字节(B),一张图像占用的存储空间大小计算方式也比较简单:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901135358671-2061606893.png)
举个例子,如果图像为 352x288 的分辨率,那么一张图像占用的存储空间应该是 352x288,也就是 101376 个字节大小。
YUV 色彩表示
在视频领域,通常以 YUV 的格式来存储和显示图像。U,V通道分别是蓝色通道和红色通道,Y 通道表示亮度信息。U 通道数值越高,颜色就越接近蓝色,V 通道数值越高,颜色就越接近红色,Y 通道数值越高,图片则越亮。如果忽略 UV 值的话,我们看到的图像与前面提到的 GRAY 相同,为黑白灰阶形式的图像。
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901140559694-971060623.png)
图2 YUV图像示例
为节省带宽起见,大多数 YUV 格式平均使用的每像素位数都少于 24 位。主要的色彩采样格式有 YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1 和 YCbCr 4:4:4。YUV 的表示法也称为 A:B:C 表示法。
以 352x288 的图像大小为例,来详细介绍一下各个采样格式的区别:
• YUV 4:4:4 格式
yuv444 表示 4 比 4 比 4 的 yuv 取样,水平每 1 个像素(即 1x1 的 1 个像素)中 y 取样 1 个,u 取样 1 个,v 取样 1 个,所以每 1x1 个像素 y 占有 1 个字节,u 占有 1 个字节,v 占有 1 个字节,平均 yuv444 每个像素所占位数为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901152032622-698960079.png)
352x288 分辨率的一帧图像占用的存储空间为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901152057671-404892912.png)
• YUV 4:2:2 格式
yuv422 表示 4 比 2 比 2 的 yuv 取样,水平每 2 个像素(即 2x1 的 2 个像素)中 y 取样 2 个,u 取样 1 个,v 取样 1 个,所以每 2x1 个像素 y 占有 2 个字节,u 占有 1 个字节,v 占有 1 个字节,平均 yuv422 每个像素所占位数为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901152750362-1318215350.png)
那么 352x288 分辨率的一帧图像占用的存储空间为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901152845140-1360192924.png)
• yuv4:1:1 格式
yuv411 表示 4 比 1 比 1 的 yuv 取样,水平每 4 个像素(即 4x1 的 4 个像素)中 y 取样 4 个,u 取样 1 个,v 取样 1 个,所以每 4x1 个像素 y 占有 4 个字节,u 占有 1 个字节,v 占有 1 个字节,平均 yuv411 每个像素所占位数为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901154129480-1357087877.png)
那么 352x288 分辨率的一帧图像占用的存储空间为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901154440993-486202321.png)
• yuv4:2:0 格式
yuv420 表示 4 比 2 比 0 的 yuv 取样,水平每 2 个像素与垂直每 2 个像素(即 2x2 的 2 个像素)中 y 取样 4 个,u 取样 1 个,v 取样 1 个,所以每 2x2 个像素 y 占有 4 个字节,u 占有 1 个字节,v 占有 1 个字节,平均 yuv420 每个像素所占位数为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901154848852-837128071.png)
那么 352x288 分辨率的一帧图像占用的存储空间为:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901155211679-235493477.png)
以宽度为 6、高度为 4 的 yuv420 格式为例,一帧图像读取和存储在内存中的方式如图:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901160652608-294254515.png)
RGB 色彩表示
三原色光模式(RGB color model),又称 RGB 颜色模型或红绿蓝颜色模型,是一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光按照不同的比例相加,来合成各种色彩光。
每象素 24 位编码的 RGB 值:使用三个 8 位无符号整数(0 到 255)表示红色、绿色和蓝色的强度。这是当前主流的标准表示方法,用于交换真彩色和 JPEG 或者 TIFF 等图像文件格式里的通用颜色。它可以产生一千六百万种颜色组合,对人类的眼睛来说,其中有许多颜色已经无法确切地分辨了。
典型使用上,数字视频的 RGB 不是全值域的。视频 RGB 有比例和偏移量的约定,即 (16, 16, 16)是黑色,(235, 235, 235)是白色。例如,这种比例和偏移量就用在了 CCIR 601(https://en.wikipedia.org/wiki/Rec._601) 的数字 RGB 定义中。
RGB 常见的展现方式分为 16 位模式和 32 位模式(32 位模式中主要用其中 24 位来表示 RGB)。16 位模式(RGB565、BGR565、ARGB1555、ABGR1555)分配给每种原色各为 5 位,其中绿色为 6 位,因为人眼对绿色分辨的色调更敏感。但某些情况下每种原色各占 5 位,余下的 1 位不使用或者表示 Alpha 通道透明度。
32 位模式(ARGB8888),实际就是 24 位模式,余下的 8 位不分配到象素中,这种模式是为了提高数据处理的速度。同样在一些特殊情况下,在有些设备中或者图像色彩处理内存中,余下的 8 位用来表示象素的透明度(Alpha 通道透明度)。
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901164347675-1121513098.png)
图4 RGB色彩分布直方图
HSL 与 HSV 色彩表示
HSL 和 HSV 是将 RGB 色彩模型中的点放在圆柱坐标系中的表示法,在视觉上会比 RGB 模型更加直观。
HSL,就是色相(Hue)、饱和度( Saturation)、亮度( Lightness)。HSV 是色相(Hue)、饱和度( Saturation)和明度(Value)。
色相(H)是色彩的基本属性,就是平常我们所说的颜色名称,如红色、黄色等;饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取 0~100% 的数值;明度(V)和亮度(L),同样取 0~100% 的数值。
HSL 和 HSV 二者都把颜色描述在圆柱坐标系里的点内,这个圆柱的中心轴取值为自底部的黑色到顶部的白色,而在它们中间的是灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的高度对应于“亮度”、“色调”或“明度”。如图:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901195202048-493840556.png)
HSV 色彩空间还可以表示为类似于上述圆柱体的圆锥体,色相沿着圆柱体的外圆周变化,饱和度沿着从横截面的圆心的距离变化,明度沿着横截面到底面和顶面的距离而变化。这种用圆锥体来表示 HSV 色彩空间的方式可能更加精确,有些图像在 RGB 或者 YUV 的色彩模型中处理起来并不精准,我们可以将图像转换为 HSV 色彩空间,再进行处理,效果会更好。例如图像的抠像处理,用圆锥体表示在多数情况下更实用、更精准。如图:
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901195546190-543993833.png)
图像的色彩空间
用相同的数据格式,在不同的设备上显示会存在颜色差异。主要是因为图像受到了色彩空间参数的影响。我们这里说的色彩空间也叫色域,指某种表色模式用所能表达的颜色构成的范围区域。而这个范围,不同的标准支持的范围则不同。
色彩空间除了 BT.601、BT.709 和 BT.2020 以外,还有很多标准格式,在用到的时候,可以使用参考标准(可参考标准:H.273)进行对比。当有人反馈偏色的问题时可以优先考虑是色彩空间的差异导致的,需要调整视频格式(Video Format)、色彩原色(Colour primaries)、转换特性(Transfer characteristics)和矩阵系数(Matrix coefficients)等参数。
视频逐行、隔行扫描与帧率
隔行扫描与逐行扫描
当我们看到一些老电视剧、老电影或者一些 DV 机拍摄的视频时,会发现视频中物体在移动时会出现条纹,这些条纹的存在主要是因为视频采用了隔行扫描的刷新方式。
隔行扫描(Interlaced)是一种将图像隔行显示在扫描式显示设备上的方法,例如早期的 CRT 电脑显示器。非隔行扫描的扫描方法,即逐行扫描(Progressive),通常从上到下地扫描每帧图像,这个过程消耗的时间比较长,占用的频宽比较大,所以在频宽不够时,很容易因为阴极射线的荧光衰减在视觉上产生闪烁的效应。而相比逐行扫描,隔行扫描占用带宽比较小。扫描设备会交换扫描偶数行和奇数行,同一张图像要刷两次,所以就产生了我们前面说的条纹,如下图。
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901201037872-1566281841.png)
早期的显示器设备刷新率比较低,所以不太适合使用逐行扫描,一般都使用隔行扫描。在隔行扫描的时候,我们常见的分辨率描述是 720i、1080i,“i”就是 Interlaced。
在如今这个时代的显示器和电视中,由于逐行扫描显示的刷新率的提高,使用者已经不会感觉到屏幕闪烁了。因此,隔行扫描技术逐渐被取代,逐行扫描越来越常见,也就是我们经常见到的 720p、1080p。
当我们拿到隔行扫描 / 逐行扫描的数据后,总是会看到这样的参数:25fps、30fps、60fps 等等。里面的 fps 是什么呢?
帧率
就是我们平时提到的帧率(FrameRate),指一秒钟刷新的视频图像帧数(Frames Per Second),视频一秒钟可以刷新多少帧,取决于显示设备的刷新能力。不同时代的设备,不同场景的视频显示设备,刷新的能力也不同,所以针对不同的场景也出现了很多种标准,例如:
- NTSC 标准的帧率是 30000/1001,大约为 29.97 fps;
- PAL 标准的帧率是 25/1,为 25 fps;
- QNTSC 标准的帧率是 30000/1001,大约为 29.97 fps;
- QPAL 标准的帧率是 25/1,为 25 fps;SNTSC 标准的帧率是 30000/1001,大约为 29.97 fps;
- SPAL 标准的帧率是 25/1,为 25 fps;FILM 标准的帧率是 24/1,为 24 fps;
- NTSC-FILM 标准的帧率是 24000/1001,大约为 23.976 fps。
NTSC 制式的标准为了解决因为色度和亮度频率不同引起失真色差的问题,将频率降低千分之一,于是就看到了有零有整的帧率。我们在电影院看的电影的帧率,实际上标准的是 23.97 fps,所以我们可以看到给院线做视频后期制作的剪辑师们最终渲染视频的时候,大多数会选择 23.97 fps 的帧率导出。
图像分辨率与比例
当人们在谈论流畅、标清、高清、超高清等清晰度的时候,其实主要想表达的是分辨率。它是衡量图像细节表现力的重要的技术参数。
除了分辨率之外,我们还需要结合视频的类型、场景等设置适合的码率(单位时间内传递的数据量)。随着视频平台竞争越来越激烈,网络与存储的开销越来越高,有了各种定制的参数设置与算法,在分辨率相同的情况下做了更深层的优化,比如极速高清、极致高清、窄带高清等。但是目前人们对流畅、标清、高清、超高清等清晰度的理解,其实普遍还是指分辨率。
一般,分辨率越高代表图像质量越好,越能看到图像的更多细节,文件也就会越大。分辨率通常由宽、高与像素点占用的位数组成,计算方式为图像的宽乘以高。在提到显示分辨率的时候,人们还常常会提到宽高比,即 DAR。DAR 是显示宽高比率(display aspect ratio),表示不同分辨率的图像的差别。
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901202758965-979745740.png)
我们经常听到人们提到 1080p、4K,其实它们还有更标准的称呼或者叫法,例如 1080p 我们又叫 Full-HD,通常接近 4K 的分辨率我们叫 4K 也没太大问题,像有更标准的叫法,比如 3840x2160 的分辨率应该是 UHD-1。但是如果直接按标准叫法来叫的话,国内很多人可能不太习惯,为了便于区分,通常就直接说分辨率的宽乘以高的数值。因为 4k 的表述比较简洁,所以就可以模糊地说是 4K 了。
小结
![](https://img2022.cnblogs.com/blog/736424/202209/736424-20220901203019066-800071054.png)
本文介绍了 GARY、YUV、RGB、HSL/HSV 四种色彩表示模式。但如果想要做好视频技术,仅仅知道一些图像色彩知识是万万不行的。因为视频是连续的图像序列,所以关于视频逐行 / 隔行扫描、帧的刷新频率等相关知识也必不可少。
图像序列裸数据占用的存储和带宽极高,为了降低存储和传输带宽,我们就需要做图像的数据压缩,图像压缩以有损压缩为主,加上图像本身色彩格式多样,所以难免会有偏色等问题,你应该能想到这主要是色彩空间的差异导致的,这时候我们需要调整各项参数来解决问题。用户观看视频的时候还需要解码视频数据包,为图像色彩的像素点表示数据,所以我们就又需要用到图像与色彩技术了。
思考题
我们常说的 YUV 与 MP4、H.264、RTMP 之间是什么样的关系呢?
参考答案:
YUV 表示原始数据.
H.264 表示视频的编码格式.
MP4 表示封装格式,可以直接观看.
RTMP:常用的直播传输协议。
一般获取到裸数据后(YUV),需要先进行 codec 编码(H.264),然后进行 muxer 封装(mp4)。就可以在播放器中进行视频播放了。
参考
本文来自博客园,作者:miyan,转载请注明原文链接:https://www.cnblogs.com/xyjk1002-rejuvenation/p/16646334.html