WebRTC 视频基础之一: YUV 格式

图像格式

最简单的图像格式是 RGB24, 每个像素用24bits 来表示,三原色的每个颜色用 8 bits 来表示,如果还要表示像素的透明度,就再加 8 bits ,即 RGB32 格式

RGB

这样一个 RGB24 图片可以用一个三维数组来表示,前两个维度表示图像的空间位置,最后一个维度表示颜色

YUV 则是另一种格式,Y 表示亮度,U 表示色度,V 表示浓度, 按照公式,可以把 RGB 转换成 YUV 格式

YCbCr 其实是 YUV 经过缩放和偏移的翻版。其中 Y 与 YUV 中的 Y 含义一致,Cb,Cr 同样都指色彩,只是在表示方法上不同而已。YCbCr 其中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量。

常用的格式有

  • YUV 4:4:4采样,每一个Y对应一组UV分量。
  • YUV 4:2:2采样,每两个Y共用一组UV分量。
  • YUV 4:2:0采样,每四个Y共用一组UV分量。

如图所示

在 YUV 格式的图像中,以实心圆代表 Y 分量, 空心圆代表 U 或 V 分量,其采样如下

下面详细说说

YUV 4:4:4

YUV 4:4:4 表示 Y、U、V 三分量采样率相同,即每个像素的三分量信息完整,都是 8bit,每个像素占用 3 个字节。

  • 四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  • 采样的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
  • 映射出的像素点为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

YUV 4:2:2

YUV 4:2:2 表示 UV 分量的采样率是 Y 分量的一半

  • 四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  • 采样的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 V3
  • 映射出的像素点为:[Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

YUV 4:2:0

YUV4:2:0并不是说只有U, V一定为0,而是指U:V互相援引,时见时隐,也就是说对于每一个行,只有一个U或者V分量,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。

  • 8 个 图像像素为:8 * 3 = 24 个 bytes
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y4 U4 V4]、[Y5 U5 V5]、 [Y6 U6 V6] 、[Y7 U7 V7]
  • 采样的码流为:8(Y) + 2(U) + 2(V) = 12 个 bytes, 一下子就压缩了一半
Y0 U0 Y1 Y2 U2 Y3 
Y4 V4 Y5 Y6 V6 Y7
  • 映射出的像素点为:
[Y0 U0 V4]、[Y1 U0 V4]、[Y2 U2 V6]、[Y3 U2 V6]
[Y4 U0 V4]、[Y5 U0 V4]、[Y6 U2 V6]、[Y7 U2 V6]


Y0, Y1, Y4, Y5 共用 U0, V4

Y2, Y3, Y6, Y7 共用 U2, V6

YUV 图像的存储格式

YUV 的存储格式有以下三种

  1. 紧缩格式 Packed (or 交织格式)
  2. 平面格式 Planar (这种格式的名称常带着字母 "p")
  3. 半平面格式 Semi-planar (这种格式的名称常带着字母 "sp")

不同的存储格式定义了在内存中的YUV分量的排列顺序

  • 紧缩格式(packed):每个像素点的Y、U、V交替存储,Y1U1V1...YnUnVn。
  • 平面格式(planar):先存储所有像素的Y,再存储所有像素点U或者V,最后存储V或者U。其中U、V分别连续存储:Y1...Yn U1...Un V1...Vn 或者 Y1...Yn V1...Vn U1...Un。
  • 半平面格式(semi-planar):先存储所有像素的Y,再存储所有像素点UV或者VU。其中U、V交替存储:Y1...Yn U1V1...UnVn 或者 Y1...Yn V1U1...VnUn。

从 YUV420P 的名字就可以看出它是 planar 平面格式,根据U和V顺序不同又分为:

  1. YV12:Y1...Y4n V1...Vn U1...Un (例如:YYYYYYYYVVUU)
  2. I420: Y1...Y4n U1...Un V1...Vn (例如:YYYYYYYYUUVV)

一般说的 YUV420p就是指 I420

从 YUV420SP 的名字就可以看出它是 Semi-planar 半平面格式

  1. NV21
  2. NV12

一般说的 YUV420sp就是指 NV12

引用一张图来表示

常用的图像文件

  • BMP: 使用 RGB24 或 RGB32, 存储顺序为 BGR 或 BGRA
  • JPG: 就是使用 YUV 并进行 DCT 变换及压缩

RGB 与 YUV 格式的转换

计算公式如下

Y = k_rR + k_gG + k_bB

U = \frac{B - Y}{2(1-k_b)}

V = \frac{R - Y}{2(1-k_r)}

其中的相关系统,ITU-R 给出的推荐值为

k_r=0.299

k_g=0.587

k_b=0.114

以矩阵计算的方式表示 RGB 转为 YUV 的公式如下

\left [ \begin{matrix} Y \\ U \\ V \\ \end{matrix} \right ] = \left [ \begin{matrix} 0 \\ 128 \\ 128 \\ \end{matrix} \right ] + \left [ \begin{matrix} 0.299 && 0.5870 && 0.1140 \\ -0.1687 && -0.3313 && -0.5000 \\ 0.5000 && -0.4187 && -0.0813 \\ \end{matrix} \right ] * \left [ \begin{matrix} R \\ G \\ B \\ \end{matrix} \right ]

在实际应用中,针对不同的场景和清晰度要求,上述公式会有细微调整

模拟电视

传统上说的 YUV 是用于模拟电视的色彩表示,它与 RGB 之间的转换公式如下

标清视频

对于数字视频,使用颜色格式 YCbCr。 对于标清电视应用 (SDTV),以下等式描述了从 RGB 到 YCbCr 的颜色转换(根据 ITU-R BT.601):

对于使用 RGB 和 YCbCr 颜色格式的基于计算机的应用程序,色度和亮度值的可能范围保留了一些头部和足部的空间,这是为避免过冲提供一些空间所必需的。

如果要使用 8 位的完整可能范围,则不提供足部空间或动态余量。 通常,这种全范围颜色格式用于 JPEG 图像。

RGB 颜色到全范围 YCbCr 颜色的转换由以下等式描述:

高清视频

对于高清电视应用 (HDTV),转换系数以有所不同:

代码示例

void rgb2yuv(double& Y, double& U, double& V, const double R, const double G, const double B)
{
  Y =  0.257 * R + 0.504 * G + 0.098 * B +  16;
  U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
  V =  0.439 * R - 0.368 * G - 0.071 * B + 128;
}

void yuv2rgb(double& R, double& G, double& B, double Y, double U, double V)
{
  Y -= 16;
  U -= 128;
  V -= 128;
  R = 1.164 * Y             + 1.596 * V;
  G = 1.164 * Y - 0.392 * U - 0.813 * V;
  B = 1.164 * Y + 2.017 * U;
}

在工程上,为提高性能,可以先用整数计算,再右移8位

void rgb2yuv(double& Y, double& U, double& V, const double R, const double G, const double B)
{
    Y = ((66 * R + 129 * G + 25 * B) >> 8) + 16;
    U = ((-38 * R + -74 * G + 112 * B) >> 8) + 128;
    V = ((112 * R + -94 * G + -18 * B) >> 8) + 128;
}

参考资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 文章参考: 图文详解YUV420数据格式 YUV主要采样格式理解 YUV格式详解 百度百科和维基百科 概述 本文基...
    Felix_lin阅读 3,531评论 0 5
  • 矩阵 在先讲颜色编码之前,先回顾一下高数中的矩阵的基本知识《线性代数》: 什么是矩阵 矩阵是指纵横排列的二维数据表...
    DramaScript阅读 6,783评论 2 10
  • RGB 颜色编码 RGB颜色编码格式 每种颜色都可以用(红,绿,蓝)三种原色来表示,将RGB分别取不同的值,展示不...
    王俏阅读 427评论 0 0
  • 在摄像头之类编程经常是会碰到YUV格式,而非大家比较熟悉的RGB格式. 我们可以把YUV看成是一个RGB的变种来理...
    starmier阅读 1,296评论 0 3
  • 什么是YUV YUV是一种色彩空间的模型,基于YUV格式的颜色编码,是流媒体的常用编码方式。如我们平时看到的彩色电...
    浮晓悠羡阅读 5,759评论 1 5