从相机入手
最近入手了富士的 2022 年上市的旗舰机X-T5,选择相机时我往往会关注设备的拍照和视频参数,其中往往就会看到 4:2:2、10bit 等字样,这些字样也经常会在音视频领域出现。作为一名关注设备的摄影爱好者,自然少不了看一些器材推荐和科普视频,影视飓风也专门为其出过一期科普视频。
422,420,10bit,8bit?这些究竟是什么
视频来源:影视飓风.
视频质量相当之高,但在观看视频学习过程中对于色度采样我没有理解到位,于是便有了这篇记录学习过程的文章。
开始发现自己写的博客有点不精简
色深
色深,即每个像素的红、黄、蓝通道分别是由多少位 bit 的数据来表示的。
Adobe PhotoShop、颜色选择器中我们经常会看到,通道的色彩选择范围是 0 到 255 的数字,0-255 共 256 个数字在二进制中可以用 8 位数字来表示,该 RGB 系统即 8bit 系统。意味着每个 RGB 通道都有 256 种色调,因此在这个系统中总共有256 x 256 x 256即16,777,216种颜色。

尽管 8bit 的16,777,216这个数字十分的庞大,但所有颜色的表示终究只是一个个离散的值,并不可能做到无极变化,面对动态范围较大的素材时,往往会发现色彩复杂的渐变场景有出现色彩断层、色带的情况,如上右图中太阳周围的余晖可以看到这一明显现象。
10bit 解决的正是这个问题,在 10bit 系统中,您可以产生 1024 x 1024 x 1024 = 1,073,741,824即10亿种颜色,这是 8bit 颜色的64倍。数据越多,表达的颜色范围也就越多,过渡也就会更加自然。更令人震惊的是,12bit 系统能够产生高达4096 x 4096 x 4096 = 68,719,476,736种颜色! 因此,增加颜色深度将使您能够更好地表现颜色。
当然,色深的位数越多,也会带来更多的数据量和更大的存储负担。
从颜色空间出发,到 YUV
1. RGB
我们常接触的颜色编码方案是RGB,它简单、清晰、易懂,正如上面色深中提到的通过将三原色的组合能够将每个像素的颜色都进行展示; RBG 里也有很多门道,生物学角度同等亮度下,人眼感知绿色要强于其他所有颜色,例如在RGB16中采用565格式,绿色通道被分配了比红色和蓝色更多的一位(6 位而非 5 位)。这样做可以提供更精细的绿色色调表示,使得图像色彩的整体感知更加自然和平衡。
2. CMYK
在印刷领域,由于印刷颜料的问题,三原色变成了青(Cyan)、品红(Magenta)、黄(Yellow),印刷颜色混合的黑色不够纯,而 Black 的首字母又被其他规范中的 Blue 占用,于是引入了 K(Black)便有个CMYK;
3. HSL 和 HSV
如果你有时使用图片处理软件制作海报或进行后期处理,可能会遇到颜色太艳丽了,饱和度降低一点儿就好了、这里的红色太亮了等等描述,在设计行业十分常见,此时,RGB并不能直观地表示出这饱和度、亮度等信息这一点,因此有了HSL和HSV颜色空间。
HSL和HSV比RGB更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。
HSV表达彩色图像的方式由三个部分组成:
- H: Hue(色调、色相)
- S: Saturation(饱和度、色彩纯净度)
- V: Value(明度)
HSL则是将V进行替换,两者十分类似 - L: Lightness(亮度)

4. YUV
在彩色电视出现之前,电视系统是黑白的,只传输亮度信息。YUV 格式设计时,需要考虑彩色电视的设计方案需要与已存在的黑白电视进行兼容,能够在亮度信息上扩展增加色度信息,于是 YUV 便出现了。 YUV 由以下分量组成:
- Y 分量:表示亮度信息,是图像的灰度版本,对应黑白影像。
- U 和 V 分量:表示色度信息,用于描述色彩和饱和度。U 通常指蓝色亮度差分量(蓝色与亮度的差),而 V 指红色亮度差分量(红色与亮度的差)。
进阶
每个像素可以分为亮度信息(Y)和色度信息(UV 或 CrCb)。如果去掉一个画面的色度信息,就会获得一个黑白的画面;如果把亮度值去掉,就会得到一片黑暗。很多年前就有研究发现,人的眼睛对亮度信息相比于色度信息更加的敏感,一个画面需要保留亮度信息,而色度信息可以通过多个像素共用一个色度值来呈现出人眼看到接近的效果,这提供了一个很好的减少数据量的方法。 
色度采样(Chroma sampling)
我们经常会见到
4:4:4、4:2:2、4:2:0、4:1:1等字样,这些代表了色度采样方案。
采样方案中通常表示为三个部分的比率J:a:b(例如 4:2:2),并描述J x 2像素内区域的亮度和色度样本,他们分别代表的含义是:
- J:水平采样参考(概念区域的宽度)通常是 4,例如下面图中一个个都是
4 x 2的像素区域。很多博客会说是观测多少个像素甚至将区域划分成一个个 2 x 2 的区域来解释 4 的由来,这是不对的; - a:第一行 J 个像素中色度样本(Cr,Cb)的数量,也就是说我们要在横向的 J 个像素中采样多少个样本,采样的越多信息越完整,越少则会丢失一部分信息。例如
4:4:4中第一行对 4 个样本进行采样,也就是每个样本我们都获取了它的色度信息,4:2:2中也就是仅采样两个色度信息,即横向从左到右数,第一二个像素共用一个色度值,第三四个像素共用一个色度值; - b:第一行和第二行 J 像素之间色度样本(Cr,Cb)的变化数量。我们可以从下面
4:1:1和4:2:0的例子中很好的理解。但注意 b 需要满足b == a || b == 0(除了罕见的情况 4:4:1 和 4:2:1,他们不遵循该约定)
以4:2:0和4:1:1举例。
4:2:0代表在4 x 2的像素区域内采样,第一行的J = 4个像素中采样2个信息,每两个像素共用一个色度信息,而第二行相比于第一行发生了0个变化,即第二行需要继承第一行的色度采样值,可以看到左边的2 x 2共用一个色度信息,右边的2 x 2共用一个色度信息;
4:1:1代表在4 x 2的像素区域内采样,第一行的J = 4个像素中采样1个信息,第一行共用一个色度信息,而第二行相比于第一行发生了1个变化,即第二行重新采样,即总图中第一行 4 个像素共享一个色度信息,第二行 4 个像素共享一个色度信息。
色度采样的作用
色度采样的伟大之处便是,利用YUV 总结中提到的,通过保留亮度信息,并对色度信息进行采样来减少数据量。可以看到,4:4:4中在4 x 2区域内我们需要采样 8 个色度信息,也就是每个像素都需要采样,而4:2:2中,我们仅需要采样 4 个色度信息,相比于4:4:4已经压缩了50%,甚至在4:2:0中,我们仅需要采样 2 个色度信息,这压缩扔掉了75%的数据。
日常前期拍摄情况下4:2:0已经可以记录非常不错的画面,当遇到需要扣像、精细后期处理的场景4:4:4或4:2:2才是更好的选择,需要在数据量和需求之前作出相应的取舍。总的来说,色度采样利用 YUV 格式,既考虑到了技术和经济的实际需求,也利用了人类视觉的特性,实现了高效的图像和视频处理。

