计算机图像编码入门篇(下)

发布时间 2023-10-24 12:21:28作者: 小虾_758

前言

本文旨在为初学者提供有关计算机图像编码的基础知识,以帮助他们初步理解计算机中图像编码的概念。鉴于我个人知识的限制,如有不准确之处,欢迎指正并提供建议。

文中部分内容参考ChatGPT,在此感谢ppword的支持。

四、YUV色彩空间

1、YUV和YCbC的关系

YUV是编译true-color颜色空间的种类,Y表示明亮度,U和V则是色度、浓度。
YCbCr的Y与YUV中的Y含义一致,Cb和Cr与UV同样都指色彩,Cb指蓝色色度,Cr指红色色度。

YUV, YCbCr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV通常用来编码电视的模拟信号,而YCbCr则是用来描述数字的影像信号,适合影片与图片压缩以及传输,例如MPEG、JPEG。因此一般俗称的YUV大多是指YCbCr。

2、YUV有什么特别

2.1、与RGB的数据组成对比

  • RGB数据由R、G、B三个分量组成。

  • YUV数据由Y、U、V三个分量组成,现在通常说的YUV指的是YCbCr。

    • Y:表示亮度,占8bit(1字节)
    • Cb(U):蓝色色度分量,占8bit(1字节)
    • Cr(V):红色色度分量,占8bit(1字节)

这么一看,感觉两者除了把RBG换成YUV之外,别的也没什么区别啊。那我们就拿一张图来做一下对比。

2.2、与RGB的图像分解对比

先看原图:

原图

再来看一下它所对应的RGB的数据图:
RGB

再来看一下它所对应的YUV的数据图:
YUV

根据上面的图片,不难看出:

  • RGB的每个分量,是对当前颜色的一个亮度值
  • Y分量对呈现出清晰的图像有着很大的贡献
  • Cb、Cr分量的内容不太容易识别清楚
  • YUV将亮度信息(Y)与色度信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的

2.3、视网膜的秘密

人眼的视网膜上,分布着两种感光细胞:视杆细胞和视锥细胞。

  • 视杆细胞
    • 感知光线的强弱
    • 没有色彩识别功能
    • 负责夜间非彩色视觉
  • 视锥细胞
    • 感知颜色
    • 负责白天彩色视觉
    • 如果你的视锥细胞发育不正常,可能会导致你色弱

人眼中有上亿个感光细胞,其中视杆细胞占了95%,而视锥细胞仅占5%。因此,人眼对亮度的敏感程度要高于对色度的敏感程度,人眼对于亮度的分辨要比对颜色的分辨精细一些。

如果把图像的色度分量减少一些,人眼也丝毫感觉不到变化和差异

2.4、YUV的优点

YUV颜色空间(亮度、色差)在数字视频和图像处理中得到广泛使用,有以下好处:

  • 分离亮度和色差:YUV将图像的亮度信息(Y)与颜色信息(U和V)分开。这个分离使得在不影响图像质量的情况下,可以更有效地压缩颜色信息,减小数据量,这在视频传输和存储中非常重要。

  • 人眼对亮度敏感:人眼对亮度信息的感知更敏感,因此更高的亮度分辨率可以提高图像质量,而相对较低的色差分辨率通常不会明显影响视觉感知。

  • 减小带宽需求:在广播、视频传输和流媒体等应用中,通过对色差信息进行亚采样,可以显著减小传输所需的带宽。这可以在视频编码中实现更高的压缩比例,减小数据传输成本。

  • 适用于多种显示技术:YUV的颜色编码适用于多种显示技术,包括电视、监视器和数字相机。因为YUV更符合人眼感知方式,它在各种显示设备上都能提供更自然的颜色。

  • 图像处理和编辑:在图像处理和编辑中,YUV颜色空间提供了更灵活的颜色操作选项,特别是在色彩校正和颜色分离等方面。

总之,YUV颜色空间的分离亮度和色差信息以及对亮度信息的更高分辨率使其成为数字视频处理中的一种重要工具。它可以帮助减小数据量,降低传输成本,同时保持图像质量。在各种多媒体应用中,YUV都发挥着关键的作用,使图像和视频的处理和传输更加高效和有效。

既然有这么多优点,那这些优点又是怎么体现的呢?

3、色度二次采样

色度二次采样(Chrominance Subsampling)是数字图像和视频压缩中的一种技术,旨在减小颜色信息的数据量,以降低存储和传输成本,同时保持相对高质量的图像。这一技术主要涉及对色差信息的亚采样。色度二次采样通常应用于U和V色差通道。

在数字图像和视频处理中,"采样" 是指通过有限数量的数据点(或像素)来表示和近似连续信号或图像的过程。采样是模拟信号(连续信号)转换为数字信号(离散信号)的关键步骤。

3.1、原理

色度二次采样的原理如下:

  • 亮度(Y)通道:亮度通道通常以全分辨率进行采样,因为人眼对亮度信息的感知非常敏感。

  • 色差(U和V)通道:色差通道的分辨率可以低于亮度通道。说白了,就是按一定规则丢掉一部分的U和V,但是具体要怎么丢,这就是接下来要讨论的了。

3.2、采样格式

为节省带宽起见,大多数 YUV 格式平均使用的每像素位数都少于 24 位。主要的采样(subsample)格式有 YCbCr4:2:0、YCbCr4:2:2、YCbCr4:1:1 和 YCbCr4:4:4。YUV 的表示法称为 A:B:C 表示法。

下面我们以表格来说明,表格中,每一格代表一个像素

原始数据

行列 1 2 3 4
1 Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
2 Y4 U4 V4 Y5 U5 V5 Y6 U6 V6 Y7 U7 V7
3 Y8 U8 V8 Y9 U9 V9 Y10 U10 V10 Y11 U11 V11
4 Y12 U12 V12 Y13 U13 V13 Y14 U14 V14 Y15 U15 V15

3.2.1、4:4:4采样

  • 每1个像素都有自己独立的1组CbCr分量
  • 1个像素占用24bit(3字节),跟RGB24的体积一样
  • 这种格式是没有进行色度二次采样的

采样后

行列 1 2 3 4
1 Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
2 Y4 U4 V4 Y5 U5 V5 Y6 U6 V6 Y7 U7 V7
3 Y8 U8 V8 Y9 U9 V9 Y10 U10 V10 Y11 U11 V11
4 Y12 U12 V12 Y13 U13 V13 Y14 U14 V14 Y15 U15 V15

3.2.2、4:2:2采样

  • 每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。
  • 1个像素平均占用16bit(2字节)
    • 因为2个像素共占用32bit(4字节 = 2个Y分量 + 1个Cb分量 + 1个Cr分量)
  • 还原时,水平方向相邻的2个像素(1行2列)共用1组CbCr分量

采样后

行列 1 2 3 4
1 Y0 U0 - Y1 - V1 Y2 U2 - Y3 - V3
2 Y4 U4 - Y5 - V5 Y6 U6 - Y7 - V7
3 Y8 U8 - Y9 - V9 Y10 U10 - Y11 - V11
4 Y12 U12 - Y13 - V13 Y14 U14 - Y15 - V15

还原后

行列 1 2 3 4
1 Y0 U0 V1 Y1 U0 V1 Y2 U2 V3 Y3 U2 V3
2 Y4 U4 V5 Y5 U4 V5 Y6 U6 V7 Y7 U6 V7
3 Y8 U8 V9 Y9 U8 V9 Y10 U10 V11 Y11 U10 V11
4 Y12 U12 V13 Y13 U12 V13 Y14 U14 V15 Y15 U14 V15

3.2.3、4:2:0采样

  • 每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。
  • 1个像素平均占用12bit(1.5字节)
    • 因为4个像素共占用48bit(6字节 = 4个Y分量 + 1个Cb分量 + 1个Cr分量)
  • 还原时,相邻的4个像素(2行2列)共用1组CbCr分量

采样后

行列 1 2 3 4
1 Y0 U0 - Y1 - - Y2 U2 - Y3 - -
2 Y4 - V4 Y5 - - Y6 - V6 Y7 - -
3 Y8 U8 - Y9 - - Y10 U10 - Y11 - -
4 Y12 - V12 Y13 - - Y14 - V14 Y15 - -

还原后

行列 1 2 3 4
1 Y0 U0 V4 Y1 U0 V4 Y2 U2 V6 Y3 U2 V6
2 Y4 U0 V4 Y5 U0 V4 Y6 U2 V6 Y7 U2 V6
3 Y8 U8 V12 Y9 U8 V12 Y10 U10 V14 Y11 U10 V14
4 Y12 U8 V12 Y13 U8 V12 Y14 U10 V14 Y15 U10 V14

3.2.3、4:1:1采样

  • 每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。
  • 1个像素平均占用12bit(1.5字节)
    • 因为4个像素共占用48bit(6字节 = 4个Y分量 + 1个Cb分量 + 1个Cr分量)
  • 还原时,水平相连的4个像素(2行2列)共用1组CbCr分量

4:2:0和4:1:1的区别在于,前者在水平方向上不会同时出现U和V,只会出现其中一个分量,后者在竖直方向上不会同时出现U和V,只会出现其中一个分量。

采样后

行列 1 2 3 4
1 Y0 U0 - Y1 - - Y2 - V2 Y3 - -
2 Y4 U4 - Y5 - - Y6 - V6 Y7 - -
3 Y8 U8 - Y9 - - Y10 - V10 Y11 - -
4 Y12 U12 - Y13 - - Y14 - V14 Y15 - -

还原后

行列 1 2 3 4
1 Y0 U0 V2 Y1 U0 V2 Y2 U0 V2 Y3 U0 V2
2 Y4 U4 V6 Y5 U4 V6 Y6 U4 V6 Y7 U4 V6
3 Y8 U8 V10 Y9 U8 V10 Y10 U8 V10 Y11 U8 V10
4 Y12 U12 V14 Y13 U12 V14 Y14 U12 V14 Y15 U12 V14

4、YUV 存储方式

  • Planar(平面)
    • Y、U、V分量分开单独存储
    • 名称通常以字母p结尾
  • Semi-Planar(半平面)
    • Y分量单独存储,U、V分量交错存储
    • 名称通常以字母sp结尾
  • Packed(紧凑)
    • 或者叫Interleaved (交错)
    • Y、U、V分量交错存储

4.1、基于 YUV444 采样的存储格式

下面是4x4 像素的 YUV444 格式采样数据:

行列 1 2 3 4
1 Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
2 Y4 U4 V4 Y5 U5 V5 Y6 U6 V6 Y7 U7 V7
3 Y8 U8 V8 Y9 U9 V9 Y10 U10 V10 Y11 U11 V11
4 Y12 U12 V12 Y13 U13 V13 Y14 U14 V14 Y15 U15 V15

4.1.1、存储格式总览

4:4:4

4.1.2、I444

先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  U1  U2  U3  U4  U5  U6  U7
U8  U9  U10 U11 U12 U13 U14 U15
V0  V1  V2  V3  V4  V5  V6  V7
V8  V9  V10 V11 V12 V13 V14 V15

4.1.3、YV24

先存储所有的 Y 分量,再存储所有的 V 分量,再存储所有的 U 分量

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V0  V1  V2  V3  V4  V5  V6  V7
V8  V9  V10 V11 V12 V13 V14 V15
U0  U1  U2  U3  U4  U5  U6  U7
U8  U9  U10 U11 U12 U13 U14 U15

4.1.4、NV24

先存储所有的 Y 分量,再U和V交错存放

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  V0  U1  V1  U2  V2  U3  V3
U4  V4  U5  V5  U6  V6  U7  V7
U8  V8  U9  V9  U10  V10  U11  V11
U12  V12  U13  V13  U14  V14  U15  V15

4.1.5、NV42

先存储所有的 Y 分量,再V和U交错存放

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V0  U0  V1  U1  V2  U2  V3  U3
V4  U4  V5  U5  V6  U6  V7  U7
V8  U8  V9  U9  V10  U10  V11  U11
V12  U12  V13  U13  V14  U14  V15  U15

4.2、基于 YUV422 采样的存储格式

下面是4x4 像素的 YUV422 格式采样数据:

行列 1 2 3 4
1 Y0 U0 - Y1 - V1 Y2 U2 - Y3 - V3
2 Y4 U4 - Y5 - V5 Y6 U6 - Y7 - V7
3 Y8 U8 - Y9 - V9 Y10 U10 - Y11 - V11
4 Y12 U12 - Y13 - V13 Y14 U14 - Y15 - V15

4.2.1、存储格式总览

4:2:2

4.2.2、I422

先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  U2  U4  U6  U8  U10 U12 U14
V1  V3  V5  V7  V9  V11 V13 V15

4.2.3、YV16

先存储所有的 Y 分量,再存储所有的 V 分量,再存储所有的 U 分量。

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V1  V3  V5  V7  V9  V11 V13 V15
U0  U2  U4  U6  U8  U10 U12 U14

4.2.4、NV16

先存储所有的 Y 分量,再U和V交错存放。

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  V1  U2  V3  U4  V5  U6  V7 
U8  V9  U10 V11 U12 V13 U14 V15

4.2.5、NV61

先存储所有的 Y 分量,再V和U交错存放。

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V1  U0  V3  U2  V5  U4  V7  U6 
V9  U8  V11 U10 V13 U12 V15 U14

4.2.6、UYVY

存储时(每个方括号里是2个像素)

[U0  Y0  V1  Y1 ] [U2  Y2  V3  Y3 ]
[U4  Y4  V5  Y5 ] [U6  Y6  V7  Y7 ]
[U8  Y8  V9  Y9 ] [U10 Y10 V11 Y11]
[U12 Y12 V13 Y13] [U14 Y14 V15 Y15]

4.2.7、YUYV

存储时(每个方括号里是2个像素)

[Y0  U0  Y1  V1 ] [Y2  U2  Y3  V3 ]
[Y4  U4  Y5  V5 ] [Y6  U6  Y7  V7 ]
[Y8  U8  Y9  V9 ] [Y10 U10 Y11 V11]
[Y12 U12 Y13 V13] [Y14 U14 Y15 V15]

4.2.8、YVYU

存储时(每个方括号里是2个像素)

[Y0  V1  Y1  U0 ] [Y2  V3  Y3  U2 ]
[Y4  V5  Y5  U4 ] [Y6  V7  Y7  V6 ]
[Y8  V9  Y9  U8 ] [Y10 V11 Y11 U10]
[Y12 V13 Y13 U12] [Y14 V15 Y15 U14]

4.3、基于 YUV420 采样的存储格式

下面是4x4 像素的 YUV420格式采样数据:

行列 1 2 3 4
1 Y0 U0 - Y1 - - Y2 U2 - Y3 - -
2 Y4 - V4 Y5 - - Y6 - V6 Y7 - -
3 Y8 U8 - Y9 - - Y10 U10 - Y11 - -
4 Y12 - V12 Y13 - - Y14 - V14 Y15 - -

4.3.1、存储格式总览

4:2:0

4.3.2、I420

I420 是先 Y 再 U 后 V

  • 大多数视频解码器以I420格式输出原始图片

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  U2  U8  U10 V4  V6  V12 V14

4.3.3、YV12

YV12 是先 Y 再 V 后 U

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V4  V6  V12 V14 U0  U2  U8  U10

4.3.4、NV12

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

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  V4  U2  V6  U8  V12 U10 V14

4.3.5、NV21

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

存储时

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V4  U0  V6  U2  V12 U8  V14 U10

5、小结

这些格式实际上是用于视频编码和解码中的YUV色彩空间的不同组合。在视频处理中,YUV色彩空间被广泛使用。其中,I420是一种常见的YUV格式之一,在视频编码解码中经常出现。

在视频编码和解码过程中,使用I420格式可以有效地压缩图像数据,减小文件大小和传输带宽,并且在保持相对较高的图像质量的同时,保持较低的计算复杂度。

了解这些常见的YUV格式对于理解视频编码和解码以及图像处理技术是很重要的。在实际应用中,根据具体的需求和平台支持,选择适合的YUV格式进行处理和转换是很常见的操作。