• 一文搞懂图像RGB和YUV编码及相互转换


    一文搞懂图像RGB和YUV编码及相互转换

    硬件花园 • 来源:硬件花园 • 作者:硬件花园 • 2023-05-17 08:37 • 3987次阅读

    1 色彩空间和色彩模型

    色彩是人眼对于不同频率的光线的不同感受。色彩既是客观存在的,但又是主观感知的,所以不同人对色彩的感知会存在差异。为了规范色彩的表述,引入了色彩空间一词。 “色彩空间”源于西方的“Color Space”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有RGB、CMYK、Lab等。

    08b0055e-f44b-11ed-9c1d-dac502259ad0.png

    色彩空间

    色彩模型是描述使用一组值(通常使用三个、四个值或者颜色成分)表示颜色方法的抽象数学模型。例如三原色光模式(RGB) 和印刷四分色模式(CMYK) 都是色彩模型。

    不同的色彩模型的差异和优劣不在本文讨论范围之内。本文主要讨论YUV和RGB两种色彩模型的相关知识。

    2 RGB色彩模型

    我们知道, “色彩” 是人类大脑对事物的一种主观感觉,为了将这种 “感性” 进行 “理性” 描述,数学家们创建了 RGB 模型的概念:通过三个数的组合(色值)来表述某一种特定的颜色,从而人类可以将这种感性的色彩感受进行理性地表达和传递。

    2.1 RGB三原色

    08b87086-f44b-11ed-9c1d-dac502259ad0.png

    RGB和CMY

    rgb(255, 0, 0) 代表纯红色,rgb(0, 255, 0) 代表纯绿色,rgb(0, 0, 255) 代表纯蓝色,而 rgb(255, 255, 0) 代表纯黄色(光学中红色和绿色加法混合会呈现黄色)。

    08c0ae86-f44b-11ed-9c1d-dac502259ad0.png

    RGB三原色 通过 RGB 色彩模型,我们最多能表示出256x256x256=16777216种不同的色值,也就是我们常说的1600万色。

    如果我们创建一个三维坐标系,三个轴的代表字母由X、Y、Z换成 R、G 和 B,即用 Red 代表X轴,Green代表Y轴,Blue代表Z轴,采用光学加法混色的方式构建这个立方空间的话,就形成了一个基于RGB模型的色彩空间了。

    08c83408-f44b-11ed-9c1d-dac502259ad0.png

    RGB三原色立体空间

    我们知道通过 rgb(x, y, z)这种方式构建的每一个颜色点,都对应于这个立方体中的某一个点,也就是说每一种颜色都被包含在我们的色彩空间之内。

    2.2RGB颜色模型存在的问题

    因为在自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感,而RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变。

    另外,RGB 颜色空间是一种均匀性较差的颜色空间,人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。

    而且,在视频领域如果使用RGB存储的话,视频数据会非常大。

    比如有一个1080p(1920*1080)分辨率、帧率为30帧的视频,如果使用RGB进行存储的话,仅仅一分钟的视频就能达到 (1920*1080*8*30*60)bit(约等于27G)。这明显是不现实的,所以我们需要对视频数据进行压缩。

    基于以上两点,所以我们需要一种数据相关性没那么强的颜色编码系统或色彩空间,而YUV正好就是这样,从下面的介绍中我们就会明白。YUV能够方便地编码和传输,并且减少带宽占用和信息出错。

    3 YUV色彩模型

    我们先回到人类刚拥有彩色电视的时候,在那段从黑白电

  • 相关阅读:
    spark sql重分区
    Java面试官最爱问的volatile关键字
    kubernetes(5) 续4
    【JavaWeb】Servlet系列 --- HttpServletRequest接口详解(接口方法要记住!!!)
    mysql面试题51:你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?
    【LSTM回归预测】基于matlab布谷鸟算法优化LSTM回归预测【含Matlab源码 2037期】
    ocserv,anyconnect
    【深度学习】教你 使用PyTorch 框架 构建神经网络 并 优化+可视化(附源代码):自制数据集 | 加载常见数据集 | 自制分类数据集 | 手动VS使用torch 实现线性模型
    (一)JDK、转义字符、数据类型
    Jetpack:005-文本组件的扩展
  • 原文地址:https://blog.csdn.net/qq_20312079/article/details/134273146