学习YCbCr和YUV

2020年11月18日 / 22次阅读 / Last Modified 2020年11月24日

YCbCr是一种常用的color model,它根据人眼的特性,用算法将luminance(亮度)和chroma(颜色)进行分离,通过chroma subsampling,来实现对still image或video的有损压缩。

另一种常见的 color model 是RGB。color model是一种颜色表示机制(表示颜色的数据结构)。还有很多其它的color model。

我们人眼视觉系统的特点是:对明暗程度的敏感度超过了颜色,而在颜色中,又对绿色最为敏感。

YCbCr color model uses Y to represent the brightness and two color channels Cb (chroma blue) and Cr (chroma red). The YCbCr can be derived from RGB and it also can be converted back to RGB.

Y表示亮度,Cb表示蓝色,Cr表示绿色,YCbCr可以和RGB相互转换。

下图来自wiki百科,直观显示了从原图分离出来的Y,Cb和Cr:

YCbCr颜色模式
YCbCr颜色模式

根据ITU-R组织发布的BT.601标准,从RGB到YCbCr为:

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

注意计算Y的公式,3个系数之和为1(这3个系数就成了一种权重),Y本质上就是从原图得到的一张grayscale灰度图,这也是很多人使用的从原图得到灰度图的计算方法。G(Green)的系数最大,这符合人眼视觉系统对绿色最敏感的特性。

从YCbCr到RGB为:

R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr

Chroma subsampling

这个压缩技术,也是利用了人眼对明暗的敏感程度超过颜色的现实,原理是,保留全部Y,但Cb和Cr只取一部分。(如果人类进化,人眼的特性改变了呢...)

Chroma subsampling is the practice of encoding images by implementing less resolution for chroma information than for luma information, taking advantage of the human visual system's lower acuity for color differences than for luminance. It is used in many video encoding schemes – both analog and digital – and also in JPEG encoding.

JPEG编码也用到了YCbCr的chroma subsampling。

我们在讨论subsampling scheme的时候(注意采样是不涉及Y的),都会采用J:a:b的形式,比如4:2:0,4:2:2等等。这个地方有点费解,我也是仔细研究了好一会儿才明白。

  • J:水平采样参考,一般取4,
  • a:Cb和Cr每行采样a个,
  • b:在第1行和第2行之间的变化,针对Cb和Cr,

还是看这个WiKi的图来理解吧:

Chroma subsampling
Chroma subsampling

4:1:1,水平方向每4个pixel分别采集1个Cb和Cr,垂直方向变换采集(即采集新的值),因此这个比例的采样,水平方向Cb和Cr的分辨率缩小到原来的1/4,而垂直方向不变。压缩率为50%。12 bits per pixel。

4:2:0,水平方向每4个pixel分别采集2个Cb和Cr,垂直方向不变化(即不采集新的值),因此这个比例的采样,水平方向Cb和Cr的分辨率缩小到原来的1/2,垂直方向的分辨率也缩小到原来的1/2。压缩率为50%。12 bits per pixel。

4:2:2,水平方向每4个pixel分别采集2个Cb和Cr,垂直方向变量2次,对水平方向的2次采集分别变化1次,因此这个比例的采样,水平方向Cb和Cr的分辨率缩小到原来的1/2,垂直方向的分辨率不变。压缩率为33.33%,即整体缩小1/3。16 bits per pixel。

按这种notation,b要么为0,要么与a相同。也存在一些不符合这个notation的情况。

4:4:4表示维持原样,24 bits per pixel。

应用YCbCr color model后,虽然有一些损失,但是一般情况人眼难以觉察,或者说这种压缩后的视频质量是在可接受的范围内的。

4:4:4 means no downsampling of the chroma channels.

4:2:2 means 2:1 horizontal downsampling, with no vertical downsampling. Every scan line contains four Y samples for every two U or V samples.

4:2:0 means 2:1 horizontal downsampling, with 2:1 vertical downsampling.

4:1:1 means 4:1 horizontal downsampling, with no vertical downsampling. Every scan line contains four Y samples for every U or V sample.  4:1:1 sampling is less common than other formats, and is not discussed in detail in this article.

YUV

什么是YUV呢?「Y」表示明亮度(Luminance),「U」和「V」则是色度、浓度(Chrominance、Chroma)。其实YUV是模拟信号的称呼,数字信号应该是表示为YCbCr。不过,现在还是能够在很多地方看到YUV这个称呼。

常见的颜色模型中,RGB主要用于电子系统里表达和显示颜色,CMYK印刷四色模式用于彩色印刷,而YUV是被欧洲电视系统所采用的一种颜色编码方法。

使用YUV的优点有两个:

  1. YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视,这一特性用在于电视信号上。
  2. YUV是数据总尺寸小于RGB格式(但用YUV444的话,和RGB888一样都是24bits)

YUV存储格式(原始视频文件格式)

YUV的存储格式有两大类:packed和planar,还有SemiPlanar。

对于packed的YUV格式,每个像素点的Y,U,V是连续交错存储的。对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。对于SemiPlanar,则是先连续存储所有像素点的Y,再连续交错U和V。

packed方式

UYVY422:422采样下,每2个pixel共用1个U和1个V,UYVY表示顺序,先放一个U,然后一个Y,然后一个V,然后一个Y,这4个值刚好对应2个pixel。

UYVY422
UYVY422

搞定了UYVY422,也就直接搞定了 YUYV422(YUY2),YVYU422

YUV420:420采样下,每4个pixel共用1个U和1个V,存储方式如下图:

UYVY422
UYVY422

planar和semiplanar

YUV422P:P就是Plannar的意思,存储形式如下图:

YUV422P
YUV422P

YUV422SP,S就是Semi的首字母,直接看图:

YUV422SP
YUV422SP

YUV420P(也叫I420)

YUV420P
YUV420P

YVU420P,它叫YV12,12表示12 bit per pixel。

YUV420SP(也叫NV12):

YUV420SP
YUV420SP

YVU420SP,也叫NV21

I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP

-- EOF --

本文链接:https://www.pynote.net/archives/2809

相关文章

    留言区

    《学习YCbCr和YUV》有5条留言

    电子邮件地址不会被公开。 必填项已用*标注

    • 麦新杰

      原始的YUV数据文件,貌似没有分辨率信息。。。 [回复]

    • 麦新杰

      YUV 是比较常用的原始视频数据数据格式,视频采集芯片输出的码流大部分都是 YUV 数据流形式,而视频处理(如 H264、H265编码等),也是在原始 YUV 码流进行编码和解析。 [回复]

    • 麦新杰

      YCbCr压缩了颜色! [回复]

    • 麦新杰

      【History】Chroma subsampling was developed in the 1950s by Alda Bedford for the development of color television by RCA, which developed into the NTSC standard; luma–chroma separation was developed earlier, in 1938 by Georges Valensi. Through studies, he showed that the human eye has high resolution only for black and white, somewhat less for "mid-range" colors like yellows and greens, and much less for colors on the end of the spectrum, reds and blues. Using this knowledge allowed RCA to develop a system in which they discarded most of the blue signal after it comes from the camera, keeping most of the green and only some of the red; this is chroma subsampling in the YIQ color space and is roughly analogous to 4:2:1 subsampling, in that it has decreasing resolution for luma, yellow/green, and red/blue. [回复]

    • 麦新杰

      从RGB到YCbCr的转换,还有许多不同的系数,分别对应不同的标准。 [回复]


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top