YUV色彩空间

发布于 2022-04-14  222 次阅读


YUV色彩空间

一、RGB和YUV

  我们熟悉的RGB色彩空间有着三个A通道,以8bit为例,通过{ R[0, 255], G[0, 255], B[0, 255] }的组合,我们得到了16M量级的色彩组合。对于RGB来说,每一个通道的分量都不能丢弃。在图形学领域,因为RGB模型的原理与人眼视觉系统原理相似,所以得到了广泛应用。下面我们简单回顾一下灰度图与RGB的结构:

// 灰度图
Mat = {
    11, 12, 
    21, 22
};

// RGB
Mat = {
    { 111, 112, 113 }, { 121, 122, 123 },
    { 211, 212, 213 }, { 221, 222, 223 }
};

  而YUV则是一种用于视频、图片编码处理的方法。YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma),Y′UV, YUV, YCbCr, YPbPr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV和Y'UV通常用来编码电视的模拟信号,而YCbCr则是用来描述数字的影像信号,适合视频与图片压缩以及传输,例如MPEG、JPEG。 但在现今,YUV通常已经在电脑系统上广泛使用。

图0
图0:YUV色彩空间

  和RGB不同的是,YUV中的UV通道是可以丢弃的,在丢弃UV之后,Y就与灰度图的灰阶值相等。通过丢掉部分的UV采样值,就可以做到传输带宽小于24位,下面介绍几种常见的YUV格式。

二、YUV采样格式

2.1 YUV 4:4:4采样

  YUV 4:4:4采样,意味着Y、U、V三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是8位。

图1
图1:YUV-444

  其中Y分量用叉表示,UV分量用圆圈表示。下面来看一下编码方式:

// 假设图像像素为:
    Mat = {
        { Y0, U0, V0 }, { Y1, U1, v1 },
        { Y2, U2, V2 }, { Y3, U3, V3 }
    };

// 那么采样的码流为:
    // Y U V 交替
    Stream = { Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 };

// 最后映射出的像素点为:
    Mat = {
        { Y0, U0, V0 }, { Y1, U1, v1 },
        { Y2, U2, V2 }, { Y3, U3, V3 }
    };

2.2 YUV 4:4:2采样

  YUV 4:2:2采样,意味着UV分量是Y分量采样的一半,Y分量和UV分量按照2 : 1的比例采样。如果水平方向有10个像素点,那么采样了10个Y分量,而只采样了5个UV分量。

图2
图2:YUV-422

  其中Y分量用叉表示,UV分量用圆圈表示。下面来看一下编码方式:

// 假设图像像素为:
    Mat = {
        { Y0, U0, V0 }, { Y1, U1, v1 },
        { Y2, U2, V2 }, { Y3, U3, V3 }
    };

// 那么采样的码流为:
    // Y U Y V
    Stream = { Y0 U0 Y1 V1 }, { Y2 U2 Y3 V3 };

// 最后映射出的像素点为:
    Mat = {
        { Y0, U0, V1 }, { Y1, U0, v1 },
        { Y2, U2, V3 }, { Y3, U2, V3 }
    };

2.3 YUV 4:2:0采样

  YUV 4:2:0采样,并不是指只采样U分量而不采样V分量。而是指,在每一行扫描时,只扫描一种色度分量(U或者V),和Y分量按照2:1的方式采样。比如,第一行扫描时,YU按照2:1的方式采样,那么第二行扫描时,YV分量按照2:1的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和Y分量相比都是2:1。

图3
图3:YUV-420

  其中Y分量用叉表示,UV分量用圆圈表示。下面来看一下编码方式:

// 假设图像像素为:
    Mat = {
        { Y0, U0, V0 }, { Y1, U1, v1 }, { Y2, U2, V2 }, { Y3, U3, V3 },
        { Y4, U4, V4 }, { Y5, U5, V5 }, { Y6, U6, V6 }, { Y7, U7, V7 }
    };

// 那么采样的码流为:
    /*
        假设奇数行采集 U,那么偶数行就采集 V
        { Y0 U0 Y1 }, { Y2 U2 Y3 }
        { Y4 V4 Y5 }, { Y6 V6 Y7 }
    */
    Stream = { Y0 U0 Y1 }, { Y2 U2 Y3 }, { Y4 V4 Y5 }, { Y6 V6 Y7 }

// 最后映射出的像素点为:
    Mat = {
        { Y0, U0, V4 }, { Y1, U0, v4 }, { Y2, U2, V6 }, { Y3, U2, V6 },
        { Y4, U0, V4 }, { Y5, U0, V4 }, { Y6, U2, V6 }, { Y7, U2, V6 }
    };

三、色彩空间转换

3.1 RGB2YUV

3.2 YUV2RGB

3.3 矩阵描述

  RGB2YUV:

  YUV2RGB: