H.264 探索 第一部分 色彩模型

原文地址

目前,我正在做的H.264视频信号解码相关的一些研究工作。所以,我决定我的第一篇献给色彩模型。因为如果我们抛开一切不必要的(现在)的信息 - 我们将看到,解码视频信号将规约为一个问题:如何从比特流中提取出像素颜色?

什么是数字信号?就像在数字世界中的一切 - 这是位序列。它可以储存,复制,传播或压缩。

视频是一组图片,每一个图片是由像素组成的。和每一个像素具有其自己的色彩和/或亮度,并以数字形式存储此值。让我们看看,我们怎么可以存储色彩值。这通过色彩模型(色彩空间)来实现的.什么是色彩模型?它是一个数学模型,通过数字序列来表示色彩。让我们先从最流行 的一种开始。

1.RGB模型

看看下面的图片,这是众所周知的RGB合成模型。

色彩模型

任何颜色可以在三个数字来表示。例如(255,0,0)表示红色。很清楚,但不是很实用:我们需要知道所有三个数字以重建颜色。我们肯定需要更高效的模型,并且存在这种模型。

2.YCbCr色彩模型

那么,如何更有效地用数字代表色彩?
假设我们用luminance代码色彩亮度,那么我们可以用RGB来表示,

Y = krR + kgG + kbB

其中 Y – luminance (luma),
k – 权重 (described in ITU-R BT.601-7 recommendation)

接下来计算计算色度(色差)表示的色彩信息:

Cr = R - Y
Cg = G - Y 
Cb = B - Y

现在我们可以从ITU-R BT.601-7 recommendation获得权重,跳过一些数学计算,得到以下公式:

Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr

现在我们可以用亮度和两个色差来代表任何色彩。
所以,我们有什么?代表一种颜色在YCbCr模型我们需要3个数字。代表相同颜色的RGB模型我们需要…等一下- 3数字。但是为什么YCbCr应该更有效率呢?

要回答这个问题,让我们视频分割成图片,检查其中一张图片。这张照片由像素组成。像这样:

像素

图片由一个像素集合组成:

4:4:4二次抽样

技巧在于:我们可以不牺牲视觉损失的情况下减少色差值。例如,我们可以这样表示我们的图片:

4:2:2二次抽样

一行里的每个像素都luma(亮度),奇数列有两个色差值.我们仍然可以在减小数据量的同时获得相同的质量.我们甚至可以这样做:

4:2:0二次抽样

这一个是真正的低成本二次抽样,并且质量依旧优良.可以没有质量显著损失的情况下大大降低图片的大小。


cppprimer
180 声望5 粉丝

引用和评论

0 条评论