zoukankan      html  css  js  c++  java
  • 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
    
    >> 
    
  • 相关阅读:
    使用jQuery和CSS自定义HTML5 Video 控件 简单适用
    在win7系统下使用Windows XP Mode 和 Windows Virtual PC搭建window xp系统
    Runtime 解读
    Reachability实时监控网络变化
    关于AsyncSocket
    关于CoreData的用法
    邓白氏编码申请
    Android 到底是个什么东西?
    听 Fabien Potencier 谈Symfony2 之 《What is Symfony2 ?》
    听 Fabien Potencier 谈Symfony2 之 《What is Dependency Injection ?》
  • 原文地址:https://www.cnblogs.com/mollnn/p/14807110.html
Copyright © 2011-2022 走看看