RGB 与 YUV 转换:多标准整理

  • RGB:红绿蓝

    • 每个分量的位深度?RGB555,RGB565,RGB24
  • YUV:Y 亮度 luma,U(Cb),V(Cr) 色度 chroma

    • 模拟 YUV, Y∈ [0,1] U,V∈[-0.5,0.5]
    • YCbCr TV Range, YUV Y~[16,235] Cb~[16-240] Cr~[16-240] (解决滤波后的过冲现象)
    • YCbCr Full Range,[0,255]
    • Cr: 红-亮度,Cb:蓝-亮度

  • YUV 采样格式:由于人眼对 Y 比对 UV 更敏感,因此我们可以考虑多个像素共用一个 UV,于是 YUV4xy 表示在 4×2 矩形中,第一行均匀分布 x 个,第二行均匀分布 y 个,如图

  • 平面格式: 用三个不同的数组来表示 3 个分量,分开存储,这类似于存储/编址顺序的问题,如 YUV420p(i420)
  • 压缩格式: 用一个数组表示 YCbCr,每个分量交替出现

YUV 与 RGB 互转

  • 常规转换标准

    [egin{bmatrix} R \ G \ B end{bmatrix} = egin{bmatrix} 1 & 0 & 1.370705 \ 1 & -0.337633 & -0.698001 \ 1 & 1.732446 & 0 end{bmatrix} egin{bmatrix} Y\U\V end{bmatrix} \ egin{bmatrix} Y\U\V end{bmatrix} = egin{bmatrix} 0.29882 & 0.58681 & 0.114363 \ -0.172485 & -0.338718 & 0.511207 \ 0.51155 & -0.42811 & -0.08343 end{bmatrix} egin{bmatrix} R \ G \ B end{bmatrix} ]

  • BT.601 标准,用于 SDTV

    [egin{bmatrix} R \ G \ B end{bmatrix} = egin{bmatrix} 1.0 & 0.0 & 1.13983 \ 1.0 & -0.39465 & -0.5806 \ 1.0 & 2.03211 & 0.0 end{bmatrix} egin{bmatrix} Y\U\V end{bmatrix} \ egin{bmatrix} Y\U\V end{bmatrix} = egin{bmatrix} 0.299 & 0.587 & 0.114 \ -0.14713 & -0.28886 & 0.436 \ 0.615 & -0.51499 & -0.10001 end{bmatrix} egin{bmatrix} R \ G \ B end{bmatrix} ]

    例:雷老师博客上的一段代码

    y = (unsigned char)( ( 66 * r + 129 * g +  25 * b + 128) >> 8) + 16  ;       
    u = (unsigned char)( ( -38 * r -  74 * g + 112 * b + 128) >> 8) + 128 ;     
    v = (unsigned char)( ( 112 * r -  94 * g -  18 * b + 128) >> 8) + 128 ;
    // https://blog.csdn.net/leixiaohua1020/article/details/50534150
    

    与上述公式相符,其中 (Y in [16,235], U in [0,255], V in [0,255])(没搞明白为啥又出来个 16-235-255 还是我算错了?)

  • BT.709 标准,用于 HDTV

    [egin{bmatrix} R \ G \ B end{bmatrix} = egin{bmatrix} 1.0 & 0.0 & 1.28033 \ 1.0 & -0.21482 & -0.38059 \ 1.0 & 2.12798 & 0.0 end{bmatrix} egin{bmatrix} Y\U\V end{bmatrix} \ egin{bmatrix} Y\U\V end{bmatrix} = egin{bmatrix} 0.2126 & 0.7152 & 0.0722 \ -0.09991 & -0.33609 & 0.436 \ 0.615 & -0.55861 & -0.05639 end{bmatrix} egin{bmatrix} R \ G \ B end{bmatrix} ]

  • BT.2020 标准,……

References

视音频数据处理入门:RGB、YUV像素数据处理_雷霄骅(leixiaohua1020)的专栏-CSDN博客

YUV <——> RGB 转换算法 (juejin.cn)

如何理解 YUV ? - 知乎 (zhihu.com)

Color Space - YUV vs. YCbCr 16-235-240 vs. YCbCr 0-255 - Processors forum - Processors - TI E2E support forums

附录:代码与公式验证的运算过程

>> a=[66 129 25]

a =

    66   129    25

>> b=[0.299 0.587 0.114]

b =

    0.2990    0.5870    0.1140

>> a-(235-16)*b

ans =

    0.5190    0.4470    0.0340

>> b2=[-0.14713 -0.28886 0.436]

b2 =

   -0.1471   -0.2889    0.4360

>> a2=[-38 -74 112]

a2 =

   -38   -74   112

>> a2-(240-16)*b2

ans =

   -5.0429   -9.2954   14.3360

>> a1-(235-16+1)*b1

ans =

    0.2200   -0.1400   -0.0800

>> a2-(240-16+1)*b2

ans =

   -4.8957   -9.0065   13.9000

>> a2-(235-16+1)*b2

ans =

   -5.6314  -10.4508   16.0800

>> a2-(255-16+1)*b2

ans =

   -2.6888   -4.6736    7.3600

>> a2-(255-0+1)*b2

ans =

   -0.3347   -0.0518    0.3840

>> 
原文地址:https://www.cnblogs.com/mollnn/p/14807110.html