详解RGB和YUV色彩空间转换

前言

        首先指出本文中的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

        上式中Y'~[0~235],Cb~[0~240],Cr~[0~240];R,G,B~[0,255]

3, RGB的辐值范围均在[16,235]时的转换关系

        首先可以知道亮度表达式一定如下,原因时带入RGB=16或235时,亮度可以取到16或235:

        Y'=0.2990R+0.5870G+0.1140B

        另外按照原来的表达式Cb和Cr还不能够达到240,因此还需要乘以个比例系数:        

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

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

化简后可以得到:      

        Y'=0.2990R+0.5870G+0.1140B

        Cb=-0.1723R-0.3383G+0.5106B+128

        Cr=0.5106R-0.4276G-0.0830B+128

4,YCbCr和RGB均在[0,255]时的转换关系

        显然只需要在YUV转换关系中将U和V偏移到正数区域即可:        

        Y'=0.2990R+0.5870G+0.1140B

        Cb=-0.1687R-0.3313G+0.5000B+128

        Cr=0.5000R-0.4187G-0.0813B+128

5,对于YUV亮度表达式的质疑

       我们知道SDTV中,色域空间的定义如下:

        

         另外我们也知道sRGB跟SDTV的色域空间几乎一致:

                

       在我的上一篇文章 详解RGB和XYZ色彩空间转换之下篇_古楼望月的博客-CSDN博客中已经推导出XYZ和sRGB之间的色彩转换矩阵如下:

         rgb2xyz =   0.4124    0.3576    0.1805
                               0.2126    0.7152    0.0722
                               0.0193    0.1192    0.9505
        因此SDTV中真正的亮度表达式应该如下所示:

        Y=0.2126R+0.7152G+0.0722B

        但是实际上SDTV规范中亮度表达式确实如下定义:

        Y=0.2990R+0.5870G+0.1140B

        因此只有一种解释,那就是SDTV事实上并没有严格按照自己的色域空间进行执行,而是采用了比较接近的三基色,这样的做法或许是技术实现难度上的考量。进一步分析SDTV中RGB三基色的比例关系正好是LED显示中发白光时的比例,这可以百度查询到,如下:

        0.2990:0.5870:0.1140=3:6:1

YUV色彩空间在HDTV中的实例

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

         Y=0.2126R+0.7152G+0.0722B

         U=-0.1146R-0.3854G+0.5000B

         V=0.5000R-0.4542G-0.0458B

2,RGB的辐值范围均在[0,255]时的转换关系        

        Y'=0.1826R+0.6142G+0.0620B+16

        Cb=-0.1006R-0.3386G+0.4392B+128

        Cr=0.4392R-0.3989G-0.0403B+128

3,RGB的辐值范围均在[16,235]时的转换关系

        Y'=0.2126R+0.7152G+0.0722B

        Cb=-0.1170R-0.3936G+0.5106B+128

        Cr=0.5106R-0.4638G-0.0468B+128

4,YCbCr和RGB均在[0,255]时的转换关系

         Y'=0.2126R+0.7152G+0.0722B

         Cb=-0.1146R-0.3854G+0.5000B+128

         Cr=0.5000R-0.4542G-0.0458B+128

YUV色彩空间在UHDTV中的实例

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

         Y=0.2627R+0.6780G+0.0593B

         U=-0.1396R-0.3604G+0.5000B

         V=0.5000R-0.4598G-0.0402B

2,RGB的辐值范围均在[0,255]时的转换关系        

        Y'=0.2256R+0.5823G+0.0509B+16

        Cb=-0.1227R-0.3166G+0.4392B+128

        Cr=0.4392R-0.4039G-0.0353B+128

3,RGB的辐值范围均在[16,235]时的转换关系

        Y'=0.2627R+0.6780G+0.0593B

        Cb=-0.1426R-0.3680G+0.5106B+128

        Cr=0.5106R-0.4696G-0.0411B+128

4,YCbCr和RGB均在[0,255]时的转换关系

         Y'=0.2627R+0.6780G+0.0593B

         Cb=-0.1396R-0.3604G+0.5000B+128

         Cr=0.5000R-0.4598G-0.0402B+128

本文参考:BT.601,BT.709,BT.2020

        

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值