Skip to content

LV010-YUV简介

其实这一节的笔记是为后面的视频学习做铺垫,视频数据也是由一帧一帧的图像组成,在国内,一般都是使用25fps,就是1秒钟25帧图像,由于人眼的视觉停留,所以我们看到的画面就是运动的了。在视频原始数据中,常见的采样格式有YUV444、YUV420、RGB等。

一、什么是YUV?

1. yuv简介

YUV,是一种颜色编码方法。常使用在各个影像处理元件中。之前了解的RGB 色彩空间更适合图像采集和显示, YUV 空间用于编码和存储则比较好。在存储和编码之前,RGB 图像要转换为 YUV 图像,而 YUV 图像在 显示之前通常有必要转换回 RGB。

YUV 色彩空间在音视频开发,编码压缩领域更加常用。常用的原因主要是涉及到 HVS (Human Visual System)人类视觉系统 对 色彩空间的感知能力。

视觉心理学研究表明,人的视觉系统对光的感知程度可以用两个属性来描述:**亮度(luminance)**跟 色度(chrominance),这里的色度也叫做 饱和度或彩度,总之 色度的叫法有很多,要注意上下文来区分语义。

然后 色度感知 包含两个维度:色调(Hue)和 色饱和度(saturation)。色调是由光波的峰值定义的,描述的是光的颜色。色饱和度是由光波的谱宽定义的,描述的是光的纯度。

因此 HVS 对色彩的感知主要有 3个属性:亮度(luminance),色调(Hue)和 色饱和度(saturation)。也就是 YUV 色彩空间,Y 代表 亮度,U代表色调,V代表色饱和度。

经过大量研究实验表明,视觉系统 对 色度 的敏感度 是远小于 亮度的。所以可以对 色度 采用更小的采样率来压缩数据,对亮度采用正常的采样率即可,这样压缩数据不会对视觉体验产生太大的影响。简单来说就是用更少的数据/信息来表达 色度(chroma),用更多的数据/信息来表达 亮度(luminance)。

2. HVS 是怎么感知 YUV?

首先我们需要一张YUV图片:meigui_yuv_444.rar,下载完毕后解压,我们会得到这样一张yuv格式的图片,但是是打不开的:

image-20240622101759453

用什么打开?我们需要用支持YUV数据查看的软件,如YUVviewer: YUVviewer (gitee.com)YUV Player7yuv等,7yuv这个软件好像是要收费,功能比较多,网上随便找找,都有绿色版本,YUVviewer还带自己编译,YUV Player的话只能单独查看Y分量吧我记得,反正后来没有用。最后我用的是这个7zyuv:

image-20240622110512701

打开meigui_yuv_444这个文件,打开后要配置一下,左边的Format中选择YUV444 planar,长宽选择650x487,右侧的YUV全部勾选,就可以看到彩色的图片啦。我们若是只勾选了 Y 分量显示,可以看到是一个黑白图像,Y 是亮度,黑色越亮就会变成灰色,灰色越亮就会变成白色。

image-20240622110713382

然后我们只勾选 Y 跟 U 两个分量,注意看叶子跟花朵,可以看出来,已经能看到绿色跟红色了,但是他们非常原始,是暗红跟暗绿的颜色。

image-20240622110752252

最后,把 V (色饱和度)也勾上,可以看到,暗红 变成了玫瑰红,暗绿 变成了 青绿色。

image-20240622110815174

为什么 RGB 色彩空间不符合 HVS 的感知能力

我们来看一张图片juren.rar,里面是 RGB24 真彩色数据。然后同样用刚才的7yuv打开:

image-20240622112910361

我们分别只勾选RGB,来看一下效果:

image-20240622113318726

可以看到蓝色明显更暗,其他两个更亮一些,这 3 个 分量都跟 亮度密切相关,所以针对 HVS 的压缩技巧,在 RGB 色彩空间 不方便使用。

二、YUV的分类?

1. YCbCr简介

在网上还会看到一些其他的描述:Y'UV、YUV、YCbCr、YPbPr 等。由于历史关系,Y'UV、YUV 主要是用在彩色电视中,用于模拟信号表示。YCbCr 是用在数字视频、图像的压缩和传输,如 MPEG、JPEG。今天我们所讲的 YUV 其实就是指 YCbCr。其中 Y 表示亮度(luma),CbCr 表示色度(chroma)。其实 Y 是明亮度,用来表示像素的灰度值,U、V 分别是影像色彩与饱和度,用来表示像素的颜色。总的来说它其实与RGB一样表示一个像素点的颜色,RGB和YUV之间是可以互相转换的。

分量说明
Y表示亮度分量,如果只显示Y的话,图像看起来会是一张黑白照。
U(Cb)表示蓝色色度分量:是照片蓝色部分去掉亮度(Y)。
V(Cr)表示红色色度分量:是照片红色部分去掉亮度(Y)。

总的来说,YUV 其实目前有 三种分类:

  • YIQ,适用于NTSC彩色电视制式
  • YUV,适用于PAL和SECAM彩色电视制式
  • YCbCr,适用于计算机用的显示器

互联网音视频开发中 一般说的 YUV 是 指 YCbCr ,U 就是 Cb,V 就是 Cr。我们会经常在一些音视频书籍看到 YCbCr ,把它当成是 YUV 就行。实际上 YCbCr 才是比较准确的术语,JPEG、MPEG 标准 用的也是 YCbCr 。后面学习的 YUV 也是指 YCbCr ,不是指 用于PAL和SECAM彩色电视 的 YUV。

2. YCbCr中的CbCr

我们来看一下CbCr 这两个通道信息。YUV 里面的 U 就是 Cb ,术语是 色调(Hue)。V 就是 Cr ,术语是 色饱和度(saturation)。实际上可以把 UV 看成是 ,colour difference (色彩的差异),可以看下面三个公式:

shell
Cb = Blue - Y
Cr = Red - Y
Cg = Green - Y

Cb 代表 蓝色 色度的分量,是通过 RGB 里面的 B 的值 减去 Y 的值得到的。Cr 代表 红色 色度的分量,是通过 RGB 里面的 R 的值 减去 Y 的值得到的。Cg 代表 绿色色 色度的分量,是通过 RGB 里面的 G 的值 减去 Y 的值得到的。Cb 跟 Cr 的颜色空间 如下图:

YCbCr-CbCr_Scaled_Y50

为了直观感受 CbCr 值的影响,需要使用一个 YUV 调色板来演示一下,如下图:

img

上图中,YUV 的值都是 1 ~ 255 ,所以 128 就是上图 x y轴的中心。可以试着把 Y 从 0 改成 255,会越来越 ,直到变成白色。调色板里面的 U 就是 Cb,这个值 就是 彩色空间 x 轴的偏移位置,也就是差值,偏移这么多就能达到想要的颜色。但是 还有 Y 轴,Y 轴是 Cr。Cb 跟 Cr 是组合的,会互相影响最后的颜色。所以, Cr 跟 Cb 在 X Y 轴的图片上看,就会很容易理解他们的作用。

这个调色板是 岳麓吹雪 用MFC 写的(原文章在这里YUV调色板软件_yuv在线调色板-CSDN博客),需要安装 VS2017 跟 MFC 组件,因为这个项目比较旧,需要改一下配置,如下图,把 Platform Toolset 换成 v2017:

img

我没装这些组件,后面也没试,等有需要再说吧。

参考资料:

视音频数据处理入门:RGB、YUV像素数据处理_视频基本原理--rgb to yuv&ycbcr-CSDN博客