YUV to RGB

YUV

YUV 是一种颜色编码方法,Y 代表明亮度,U 和 V 则是色度。YUV 是一类颜色编码方法的统称,如 YUV、Y`UV、YCbCr、YPbPr 等专有名词都可以称为 YUV。

历史

Y'UV 的发明是由于黑白电视到彩色电视的过渡时期。黑白视频只有 Y 数据,也就是灰阶值,到了彩色电视时期,增加了 UV 表示图像的色度(U 代表蓝色通道与亮度的差值,V 代表红色通道与亮度的差值),如果忽略了 UV,那么剩下的 Y 信号就与之前的黑白电视表现一致,这样便解决了黑白电视和彩色电视的兼容问题。

RGB 诉求于人眼对色彩的感应,YUV 则着重于视觉对于亮度的敏感程度。因此 YUV 可以通过降低色度的采样率来减少带宽而不会对图像产生大的影响。

YUV Formats

YUV 格式通常有两类:

  • packed formats:打包格式,每个像素点的 Y、U、V 混合在一起存放,类似 RGB 的存放方式。
  • planar formats:平面格式,将一帧图像的 Y、U、V 以独立的平面组织,存放在不同的数组中。

根据不同的采样方式分为 YUV4:4:4、YUV4:2:2、YUV4:2:0、YUV4:1:1 等,代表 Y:U:V。

  • YUV4:4:4 表示完整采样,保持了 UV 分量的完整信息。
  • YUV4:2:2 表示色度分量具有 2:1的水平采样,垂直完全采样。
  • YUV4:2:0 表示色度分量具有 2:1的水平采样,2:1的垂直采样,YUV4:2:0 并不是指只有 U,没有 V,而是对于每一行,只有一个 U 或者 V 分量,如果第一行是 4:2:0,那么下一行就是 4:0:2,以此类推。
  • YUV4:1:1 表示色度分量具有 4:1的水平采样,垂直完全采样。

常见的 YUV 存储方式

YUV420P: I420/YU12/YV12

YUV420P 属于 YUV4:2:0 采样,是一种 Plane 模式,将 Y、U、V 分量分别打包,依次存储。YU12 与 I420 相同,而 YV12 与 YU12 的区别仅仅是 UV 顺序不同。

在 I420/YU12 格式中,是以 Y平面-> U 平面-> V 平面的方式排列的,即 YUV;YV12 则相反,以 Y平面-> V 平面-> U 平面的方式排列,即 YVU。

排列举例:

  • I420/YU12:
    • 2*2图像 YYYYUV
    • 4*4图像 YYYYYYYYYYYYYYYYUUUUVVVV
  • YV12:
    • 2*2图像 YYYYVU
    • 4*4图像 YYYYYYYYYYYYYYYYVVVVUUUU

YU12 取名代表 Y 后面紧跟 U,YV12 则相反,12 代表它位深 12,在 2*2 图像中,一共四个像素点,占用 6 个字节,则每个像素占用空间 12 bit。

YUV420SP: NV12/NV21

YUV420P 属于 YUV4:2:0 采样,是一种 Two-Plane 模式,即 Y 和 UV 分为两个平面,UV 为交错存储。NV12 和 NV21 类似,区别仅是 UV 顺序不同。

在 NV12 格式中,是以 Y平面-> UV平面(以 UV 的方式交错存储);NV21 则相反,以 Y平面-> UV平面(以 VU 的方式交错存储)。

排列举例:

  • NV12:
    • 2*2图像 YYYYUV
    • 4*4图像 YYYYYYYYYYYYYYYYUVUVUVUV
  • NV21:
    • 2*2图像 YYYYVU
    • 4*4图像 YYYYYYYYYYYYYYYYVUVUVUVU

YUV 和 RGB 的转换

首先说下 YCbCr,YCbCr 是被 ITU 定义在标准 ITU-R BT.601(标清)、ITU-R BT.709(高清)、ITU-R BT.2020(超高清)中的一种色彩空间, 是一种针对 RGB 所做的编码,是 YUV 压缩和偏移的版本,YCbCr 通常用于视频和图像压缩和传输,在视频编解码中的"YUV 图像"指的就是 YCbCr。

对于 YCbCr 和 RGB 的转换来说,不同的标准有不同的方式,并且有时候需要区分 Video Range[16-235] 和 Full Range[0-255]。

为方便计算机运算和优化,下列提供定点化后的公式,默认使用 ITU-R BT.601 Video Range。

ITU-R BT.601 标准:

  • RGB 转 YCbCr (Video Range):
\begin{bmatrix} Y  \\ Cb \\ Cr \end{bmatrix}= \begin{bmatrix} 16 \\ 128 \\ 128 \end{bmatrix}+ \begin{bmatrix} 0.257 & 0.504 & 0.098  \\ -0.148 & -0.291 & 0.439 \\ 0.439 & -0.368 & -0.071 \end{bmatrix}* \begin{bmatrix} R \\ G \\ B \end{bmatrix}

​ 定点化后:

\begin{align} Y =& 16 + ((66 * R + 129 * G + 25 * B + 128)>>8) \\ Cb =& 128 + ((-38 * R - 74 * G + 112 * B + 128)>>8) \\ Cr =& 128 + ((112 * R - 94 * G - 18 * B + 128)>>8) \end{align}
  • YCbCr 转 RGB (Video Range):
\begin{bmatrix} R \\ G \\ B \end{bmatrix}= \begin{bmatrix} 1.164 & 0.000 & 1.596 \\ 1.164 & -0.392 & -0.813 \\ 1.164 & 2.017 & 0.000 \end{bmatrix}* \begin{bmatrix} (Y-16) \\ (Cb-128) \\ (Cr-128) \end{bmatrix}

​ 定点化后:

\begin{align} &限制范围[0,255] \\ &R = (298 * (Y - 16) + 409 * (Cr -128) + 128) >> 8 \\ &G = (298 * (Y - 16) - 100 * (Cb -128) - 208 * (Cr - 128) + 128) >> 8 \\ &B = (298 * (Y - 16) + 516 * (Cb -128) + 128)>>8 \end{align}
  • RGB 转 YCbCr (Full Range):
\begin{bmatrix} Y  \\ Cb \\ Cr \end{bmatrix}= \begin{bmatrix} 0 \\ 128 \\ 128 \end{bmatrix}+ \begin{bmatrix} 0.299 & 0.587 & 0.114  \\ -0.169 & -0.331 & 0.500 \\ 0.500 & -0.419 & -0.0813 \end{bmatrix}* \begin{bmatrix} R \\ G \\ B \end{bmatrix}

​ 定点化后:

\begin{align} Y =& ((77 * R + 150 * G + 29 * B + 128)>>8) \\ Cb =& 128 + ((-43 * R - 85 * G + 128 * B + 128)>>8) \\ Cr =& 128 + ((128 * R - 107 * G - 21 * B + 128)>>8) \end{align}
  • YCbCr 转 RGB (Full Range):
\begin{bmatrix} R \\ G \\ B \end{bmatrix}= \begin{bmatrix} 1.000 & 0.000 & 1.402 \\ 1.000 & -0.344 & 0.714 \\ 1.000 & 1.772 & 0.000 \end{bmatrix}* \begin{bmatrix} Y \\ (Cb-128) \\ (Cr-128) \end{bmatrix}

​ 定点化后:

\begin{align} &限制范围[0,255] \\ &R = (Y + 359 * (Cr -128) + 128) >> 8 \\ &G = (Y - 88 * (Cb -128) + 183 * (Cr - 128) + 128) >> 8 \\ &B = (Y + 454 * (Cb -128) + 128)>>8 \end{align}

ITU-R BT.709 标准:

  • RGB 转 YCbCr (Video Range):
\begin{bmatrix} Y  \\ Cb \\ Cr \end{bmatrix}= \begin{bmatrix} 16 \\ 128 \\ 128 \end{bmatrix}+ \begin{bmatrix} 0.183 & 0.614 & 0.062  \\ -0.101 & -0.339 & 0.439 \\ 0.439 & -0.399 & -0.040 \end{bmatrix}* \begin{bmatrix} R \\ G \\ B \end{bmatrix}

​ 定点化后:

\begin{align} Y =& 16 + ((47 * R + 157 * G + 16 * B + 128)>>8) \\ Cb =& 128 + ((-26 * R - 87 * G + 112 * B + 128)>>8) \\ Cr =& 128 + ((112 * R - 102 * G - 10 * B + 128)>>8) \end{align}
  • YCbCr 转 RGB (Video Range):
\begin{bmatrix} R \\ G \\ B \end{bmatrix}= \begin{bmatrix} 1.164 & 0.000 & 1.793 \\ 1.164 & -0.213 & -0.534 \\ 1.164 & 2.112 & 0.000 \end{bmatrix}* \begin{bmatrix} (Y-16) \\ (Cb-128) \\ (Cr-128) \end{bmatrix}

​ 定点化后:

\begin{align} &限制范围[0,255] \\ &R = (298 * (Y - 16) + 459 * (Cr -128) + 128) >> 8 \\ &G = (298 * (Y - 16) - 55 * (Cb -128) - 137 * (Cr - 128) + 128) >> 8 \\ &B = (298 * (Y - 16) + 541 * (Cb -128) + 128)>>8 \end{align}
  • RGB 转 YCbCr (Full Range):
\begin{bmatrix} Y  \\ Cb \\ Cr \end{bmatrix}= \begin{bmatrix} 0 \\ 128 \\ 128 \end{bmatrix}+ \begin{bmatrix} 0.213 & 0.715 & 0.072  \\ -0.117 & -0.394 & 0.511 \\ 0.511 & -0.464 & -0.047 \end{bmatrix}* \begin{bmatrix} R \\ G \\ B \end{bmatrix}

​ 定点化后:

\begin{align} Y =& ((55 * R + 183 * G + 19 * B + 128)>>8) \\ Cb =& 128 + ((-30 * R - 101 * G + 130 * B + 128)>>8) \\ Cr =& 128 + ((130 * R - 119 * G - 12 * B + 128)>>8) \end{align}
  • YCbCr 转 RGB (Full Range):
\begin{bmatrix} R \\ G \\ B \end{bmatrix}= \begin{bmatrix} 1.000 & 0.000 & 1.540 \\ 1.000 & -0.183 & -0.459 \\ 1.000 & 1.816 & 0.000 \end{bmatrix}* \begin{bmatrix} Y \\ (Cb-128) \\ (Cr-128) \end{bmatrix}

​ 定点化后:

\begin{align} &限制范围[0,255] \\ &R = (Y + 394 * (Cr -128) + 128) >> 8 \\ &G = (Y - 47 * (Cb -128) - 118 * (Cr - 128) + 128) >> 8 \\ &B = (Y + 465 * (Cb -128) + 128)>>8 \end{align}

参考

en.wikipedia.org/wiki/YUV

en.wikipedia.org/wiki/YCbCr

zhuanlan.zhihu.com/p/28766366

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值