详解RGB和YUV色彩空间转换

news/2025/3/15 16:33:15/

前言

        首先指出本文中的RGB指的是非线性RGB,意思就是经过了伽马校正,按照行业规矩应当写成R'G'B',但是为了书写方便,仍写成RGB。关于YUV有多种叫法,分别是YUV,YPbPr,YCbCr。因此本文将首先指出他们之间的区别与联系,然后依次推演和RGB色彩空间之间的关系,最后导出转换矩阵。

各种说法

        对于名称的叫法本来无所谓,例如鬼子、倭寇、小日本、Japan指的都是日本,只要交流的人之间互相明白对方的意思即可。对于YUV色彩空间来说,原本也是如此,只是概念上的混用对于专业人士来说,有时候会引起不专业的问题。所以有必要汇总一下各家的说法。

        YUV:第一种含义是YUV,YCbCr,YPbPr的统称,任何一种都可以叫YUV;第二种含义指的是原始版YUV色彩空间。

        YCbCr:第一种含义指的是数字分量,他是YUV的压缩和裁剪版本;第二种含义指的是标清隔行视频的模拟分量接口名称。

        YPbPr:第一种含义指的是模拟分量,仅仅是YCbCr进行模拟化得到;第二种含义指的是高清视频的模拟分量接口名称。

演化推导

1:亮度和色差的定义

        因为 

                 k_r+k_g+k_b=1

        所以

                k_g=1-k_r-k_b

        因此亮度分量可以使用下面的表达式表示:

               Y=k_rR+(1-k_r-k_b)G+k_bB

         红色分量和亮度之差为:

               R-Y=R-k_rR-(1-k_r-k_b)G-k_bB

               R-Y=R(1-k_r)+(k_r+k_b-1)G-k_bB

        蓝色分量和亮度之差为:

                B-Y=k_b-k_rR-(1-k_r-k_b)G-k_bB

                B-Y=-k_rR+(k_r+k_b-1)G+(1-k_b)B

        上面三个式子用矩阵的形式表达如下:

                \begin{bmatrix} Y\\ B-Y \\ R-Y \end{bmatrix}=\begin{bmatrix} k_r &1-k_r-k_b &k_b \\ -k_r& k_r+k_b -1 & 1-k_b \\ 1-k_r& k_r+k_b -1 &-k_b \end{bmatrix}.\begin{bmatrix} R\\ G \\ B \end{bmatrix}

2,色差的范围标定

       RY_{min}=RGB_{min}-(k_rRGB_{min}+(1-k_r-k_b)RGB_{max}+ k_bRGB_{max})=(k_r-1)(RGB_{max}-RGB_{min}) 

       RY_{max}=RGB_{max}-(k_rRGB_{max}+(1-k_r-k_b)RGB_{min}+ k_bRGB_{min})=(1-k_r)(RGB_{max}-RGB_{min})

        所以可以知道红色分量范围是:

        RY_{range}=2(1-k_r)(RGB_{max}-RGB_{min})

        同理可知,蓝色分量范围是:

        BY_{range}=2(1-k_b)(RGB_{max}-RGB_{min})

        通常我们知道RGB的范围是0~1,因此

        RGB_{max}=1RGB_{min}=0

        那么为了给色差分量的范围归一化,就需要乘以缩放系数:

          S_r=1/RY_{range}=0.5/(1-k_r)

          S_b=1/BY_{range}=0.5/(1-k_b)

       色差归一化后用UV去表达,矩阵形式如下:

        \begin{bmatrix} Y\\ U \\ V \end{bmatrix}=\begin{bmatrix} k_r &1-k_r-k_b &k_b\\ -k_r*S_b& (k_r+k_b-1)*S_b & (1-k_b)*S_b \\ (1-k_r)*S_r& (k_r+k_b-1)*S_r &-k_b*S_r \end{bmatrix}.\begin{bmatrix} R\\ G \\ B \end{bmatrix}

YUV色彩空间在SDTV中的实例

 1,参数带入后得到基本的YUV转换公式

                k_r=0.2990

                kb=0.1140

                S_r=0.5/(1-k_r)=0.7133

                S_b=0.5/(1-k_b)=0.5643

        写成方程式RGB转YUV如下:

                Y=0.2990R+0.5870G+0.1140B

                U=-0.1687R-0.3313G+0.5000B

                V=0.5000R-0.4187G-0.0813B

        反过来YUV转RGB公式为:

                R=Y+1.4020V

                G=Y-0.3441U-0.7141V

                B=Y+1.7720U

2,模拟信号的负电平和过冲问题

        由于模拟信号在传输的过程中会引起吉布斯过冲现象,导致后端解码识别错误,因此在模拟视频时代需要对YUV信号进行二次压缩,同时为了保证电平为正,还需要叠加一个偏置。

        Y'=\frac{219}{255}(0.2990R+0.5870G+0.1140B)+16

        Cb=\frac{224}{255}(-0.1687R-0.3313G+0.5000B)+128

        Cr=\frac{224}{255}(0.5000R-0.4187G-0.0813B)+128

化简后得如下:

        Y'=0.2568R+0.5041G+0.0979B+16

        Cb=-0.1482R-0.2910G+0.4392B+128

        Cr=0.4392R-0.3678G-0.0714B+128


http://www.ppmy.cn/news/124679.html

相关文章

Redis6 数据结构Hash

前言 在Redis中,hashtable 被称为字典(dictionary),它是一个数组链表到结构。每个键值对都会有一个dictEntry OBJ_ENCODING_HT 这种编码夯实内部才是真正的哈希表结构,或称为字典结构,其可以实现O(1)复杂度的读写操作…

Spring Boot如何实现自定义条件注解

Spring Boot如何实现自定义条件注解 在Spring Boot中,条件注解是一种非常强大的工具,它可以根据特定的条件来选择是否加载某个类或某个Bean。Spring Boot已经提供了一些内置的条件注解,例如ConditionalOnClass、ConditionalOnBean等&#xf…

踩坑笔记 ---- 使用LocalDateTime开通会员到期时间与自动续费业务某天用户突然为0

写在前面 使用LocalDateTime的同学需要注意下,这东西的plusMonth可能会有点点超出你的认知,如果不慎掉坑里,希望这篇笔记可以给你提供思路 业务背景 此业务场景非常简单,自动续费业务,需要在用户会员到期前24小时执…

2021-10-20制氧机解决方案

制氧机的特点是吸氧直接提高使用人动脉血氧含量,而不是作用于机体某个部分间接改善缺氧,只是在增加机体有生以来一直不断摄入的氧气。没有对于机体陌生的、需要适应的、需要解析的物质,因而只是改善而不是改变机体的自然生理状态和生物化学环…

解锁数据魔法:探索Java 8中Stream的奇妙世界

Java 8引入了一个强大的功能,即Stream API。Stream API允许我们以一种更简洁和功能强大的方式处理集合数据。在本文中,我将介绍Java 8中Stream的用法,并提供一些实例来说明其如何简化和改进我们的代码。 一、什么是Stream? Stre…

2021-10-22制氧机控制板开发吸氧机方案

家用智能制氧机工作原理:利用分子筛物理吸附和解吸技术.制氧机内装填分子筛,在加压时可将空气中氮气吸附,剩余的未被吸收的氧气被收集起来,经过净化处理后即成为高纯度的氧气。分子筛在减压时将所吸附的氮气排放回环境空气中&…

制氧机

制氧机是一种制造氧气的设备。它通常通过将空气中的氧分离出来来制造氧气。制氧机通常用于医院、工业生产和家庭使用。它们的工作原理是将空气进行净化和过滤,然后通过分离氧气制造出纯净的氧气。制氧机有很多不同的型号和规格,可以满足不同的使用需求。…

光纤融拉机(拉锥机)

1.功能:将光纤间的内芯,通过烧的方式(也有其它的方式)融合在一起,主要实现光的分路,同时有高低功率的光纤。 2.硬件:运行控制器或卡或自己DIY芯片,电机,数据采集卡&…