3. YUV色彩空间:从黑白电视到彩色世界的桥梁

YUV这个色彩空间,说实话,是我刚入行时觉得最"反直觉"的一个。RGB多直接啊,红绿蓝一混,什么颜色都有了。但YUV为什么要搞个亮度和色度分离?这不是多此一举吗?

后来我在一个视频编码项目里被坑了一次,才真正理解了YUV的精妙之处。嗯,咱们今天就来聊聊这个。

3.1 YUV的起源:黑白电视兼容的智慧

上世纪50年代,彩色电视要普及了。但有个大问题——当时家家户户都是黑白电视机。总不能让大家为了看彩色节目,把电视全换了吧?

工程师们想了个绝妙的办法:把彩色信息"叠"在黑白信号上。黑白电视只取亮度信号,彩色电视再多取一份颜色信息。这就是YUV诞生的背景。

核心思想:Y = 亮度(Luma),UV = 色度(Chroma)。黑白电视只看Y,彩色电视看Y+UV。

具体怎么实现的?Y信号直接复用原来的黑白电视信号标准。UV信号通过调制加载到色度副载波上。黑白电视的电路压根不认识这个副载波,直接忽略,画面不受影响。彩色电视则多一个解码电路,把UV解出来。

我在一个老式电视信号采集项目里,还真的遇到过这种复合视频信号。当时调试时画面一直有彩色条纹,后来发现是色度副载波和亮度信号串扰了。嗯,这个坑后面再细说。

3.2 亮度与色度分离:为什么这么重要?

你想想看,人眼对亮度的敏感度远高于对颜色的敏感度。这是生理结构决定的——视网膜上的视杆细胞负责亮度感知,数量远多于负责颜色的视锥细胞。

所以,YUV把亮度单独拎出来,给了它更多的"带宽"。色度信息可以压缩、可以降低分辨率,人眼几乎察觉不到。

分量 含义 人眼敏感度 典型带宽占比
Y 亮度(Luma) 高 60%-70%
U (Cb) 蓝色色度差 低 15%-20%
V (Cr) 红色色度差 低 15%-20%

这里有个容易混淆的点:YUV和YCbCr是不是一回事?

严格来说,YUV是模拟时代的叫法,YCbCr是数字时代的标准化版本。但实际工程中,大家经常混着用。我个人习惯在代码里统一用YCbCr,因为ITU-R BT.601和BT.709标准里定义的都是这个。

避坑指南:我曾经在色彩空间转换时,直接用YUV的公式去算YCbCr的数据,结果颜色偏得一塌糊涂。后来才发现,YUV的色度范围是-0.5到0.5,而YCbCr的色度范围是16到240(8位)。转换前一定要做范围映射。

3.3 YUV采样格式:4:4:4, 4:2:2, 4:2:0

既然色度可以压缩,那具体怎么压缩?答案就是——降低色度的采样率。

这个"4:4:4"的命名方式,说实话,第一次看到时我也懵了。它其实表示的是:在一行4个像素的范围内,亮度和色度的采样比例。

  • 4:4:4:每4个像素,Y、U、V各采样4次。无压缩,每个像素都有完整的亮度和色度信息。
  • 4:2:2:每4个像素,Y采样4次,U和V各采样2次。水平方向色度减半。
  • 4:2:0:每4个像素,Y采样4次,U和V各采样1次。水平和垂直方向色度都减半。

我画个图,你一看就明白了。

YUV采样格式对比 4:4:4 Y Y Y Y U U U U V V V V 4:2:2 Y Y Y Y U U V V 4:2:0 Y Y Y Y U V 数据量对比(以4个像素为例) • 4:4:4:4个Y + 4个U + 4个V = 12个分量 • 4:2:2:4个Y + 2个U + 2个V = 8个分量(节省33%) • 4:2:0:4个Y + 1个U + 1个V = 6个分量(节省50%) 注意:4:2:0的色度在垂直方向也减半,所以实际是2x2的像素块共享一组UV

看到没?4:4:4每个像素都有完整的YUV,数据量最大。4:2:2水平方向色度减半,4:2:0水平和垂直都减半。

注意:4:2:0并不是说色度采样率为0!它只是水平和垂直方向都降为1/2,实际色度像素数是亮度像素数的1/4。这个命名确实容易让人误解,我当年也搞混过。

3.4 实际应用中的选择

不同的采样格式用在不同的场景。我列个表,你一看就清楚。

采样格式 数据量(相对4:4:4) 典型应用 我的建议
4:4:4 100% 专业影视后期、色键抠像、医疗影像 对色彩精度要求极高时用,但带宽压力大
4:2:2 67% 广播级视频、高端摄像机、HDMI传输 我一般在专业视频采集卡上用这个,画质和带宽的平衡点
4:2:0 50% 流媒体、视频通话、手机拍摄、H.264/H.265编码 绝大多数消费级场景的首选,压缩效率高

我在做视频编码优化时,曾经测试过4:2:0和4:2:2的主观画质差异。说实话,在普通显示器上,90%的人看不出区别。但一旦涉及到文字叠加、UI渲染或者色键抠像,4:2:0的色度锯齿就暴露了。

避坑指南:我曾经在一个视频会议项目里,为了省带宽用了4:2:0。结果用户在共享PPT时,红色文字边缘出现了明显的彩色锯齿。后来改成4:2:2,问题解决。记住:有文字或精细图形叠加的场景,别省那点带宽。

3.5 YUV与RGB的转换公式

最后,咱们看看YUV和RGB怎么互相转换。以BT.601标准为例(标清视频常用)。

RGB → YUV:

Y  =  0.299 * R + 0.587 * G + 0.114 * B
U  = -0.169 * R - 0.331 * G + 0.500 * B + 128
V  =  0.500 * R - 0.419 * G - 0.081 * B + 128

YUV → RGB:

R  =  Y + 1.402 * (V - 128)
G  =  Y - 0.344 * (U - 128) - 0.714 * (V - 128)
B  =  Y + 1.772 * (U - 128)

注意U和V加了128的偏移,这是为了把有符号的色度值映射到0-255的无符号范围。如果你直接拿YUV数据套RGB公式,颜色肯定不对。

关键点:YUV转换公式有多个标准(BT.601、BT.709、BT.2020),对应不同的色彩空间和分辨率。高清视频用BT.709,4K超高清用BT.2020。选错了标准,颜色就偏了。

嗯,YUV的内容就聊到这儿。说白了,它就是个为了兼容黑白电视而生的聪明设计,结果成了视频压缩领域的基石。理解YUV,你再看H.264、HEVC这些编码标准,就会觉得顺理成章了。