YUV格式到底是什么?

article/2025/9/23 4:29:38

简介

YUV是视频、图片、相机等应用中使用的一类图像格式,实际上是所有“YUV”像素格式共有的颜色空间的名称。 与RGB格式(红 - 绿 - 蓝)不同,YUV是用一个称为Y(相当于灰度)的“亮度”分量和两个“色度”分量表示,分别称为U(蓝色投影)和V(红色投影),由此得名。

YUV也可以称为YCbCr,虽然这些术语意味着略有不同,但它们往往会混淆并可互换使用。

Y表示亮度分量:如果只显示Y的话,图像看起来会是一张黑白照。

U(Cb)表示色度分量:是照片蓝色部分去掉亮度(Y)。

V(Cr)表示色度分量:是照片红色部分去掉亮度(Y)。

要说清楚YUV,得分别说清楚以下两点:

  • YUV的采样格式:即我们在采集图片、视频帧时,是如何获取每个像素的Y、U、V三个分量的。
  • YUV的存储格式:即Y、U、V三个分量的值,是以什么方式存储在内存或者文件中的。

为了理解这两点,破费功夫,只因没有在网上找到比较让人满意的解读。最后找到了两篇文档:

VLC提供的wiki和微软家提供的Video Rendering with 8-Bit YUV Formats

YUV采样格式

什么是扫描线(scan line)

为了说明采样格式,先说明一下待会儿会用的的概念:扫描线

什么是扫描线?这是关于电视显示的术语,用来描述电视是如何显示画面的。wiki中是这么解释的:

电视萤幕由电子枪射出的电子,经由磁场偏向后打在屏幕上而发光,因此每一个图框都由电子枪的扫描线画出来。

大概意思如下图:图片来源
在这里插入图片描述

电子枪的扫描线从左上角像素点到右下角像素点顺序移动,喷射电子显像。

我猜,这种像素的显示方式也对像素的采样方式产生了影响,YUV采样格式中就大量提到了扫描线,至于这中间是否有什么历史"恩怨",大家如果知道,不妨留言分享。

宏像素 (macropixels)

像素是视频显示的基本单位,因为它代表了屏幕上一个"点"的色彩,通常也会被形象地称为"像素点"。通常RGB格式像素点,会有Red、Green、Blue三个基本像素分量组成。也就是说,只要确定了红、绿、蓝三个像素分量就能确定这个像素将要显示什么。

同理,YUV格式也可以分为三个分量,即Y、U、V一一对应。

但和RGB不一样的是,利用人体眼睛对亮度分量(Y)敏感,而对色度分量(U和V)不敏感的原理,视频可以通过降低色度分量的采样数据,达到降低视频数据量而人眼很难分辨的目的。所以,目前流行的YUV采样,基本都是降低色度分量的采集。

也就是说,一个视频帧中,亮度分量Y的采样数不会被改变,但色度分量U和V会被降低采样数(downsampling)。如此一来,Y、U、V三个分量将无法达到和RGB一样一一对应的效果。

好在YUV所有的格式中,U、V分量的采样数是相等的,只是不同的Y分量之间,需要共享数量不足的UV分量,为了让这个共享更好的表达,YUV出现了宏像素的概念。即:当前格式下,至少需要x个像素点的采样数据,才能将这x个像素点完整表达,这几个像素点组成了一个宏像素,每个像素点称为宏像素点。所谓的完整表达,也就是让所有的Y分量都有对应的UV分量可以使用。

如果看到这里,还不是很懂,你可以先跳过这节,这对后文的阅读影响不是很大。

宏像素的概念,是从微软家的那个文档看到的,但他家没做任何解释,网上也没有。这一节的内容,实际上是本人自己琢磨了好久才总结出来的。受限知识水平,请大家谨慎参考,如果有大神发现有误,请留言帮帮小弟,一拜……再拜……

YUV4:4:4

YUV格式,采用A:B:C表示法用于描述UV色度分量相对于Y分量的采样率。这怎么理解呢,以YUV4:4:4为例。

YUV4:4:4的采样方式表示:各采样分量在扫面每个像素点时,都不会降低采样率。

在这里插入图片描述

如图,一个方格表示一个像素点,方格中的YUV分别表示有在该像素点采YUV分量。之所以用四个方格显示,是因为YUV格式中,UV分量最小时需要四个像素共享一个UV分量对。同时,共享一个UV分量对的像素点,在平面上和UV分量都有临近的关系,所以这四个像素点不会是同一条扫面线上的点,而是分布在两条扫描线上。

所以,一个宏像素最多容纳四个宏像素点。而在YUV4:X:X的表示法中,的4表达的也是这个意思。

从图可以看出,YUV4:4:4的采样方式,是对每个像素点进行Y、U、V分量的全采样。

关于内存占用,因为YUV模式的每个分量都是存储在一个字节(8bit)中的。

所以,对于四个像素,YUV4:4:4格式需要4*8 + 4*8 + 4*8 = 96位,因此,每个像素深度为24位

YUV4:2:2

YUV4:2:2的采样方式表示:水平方向Y分量与UV分量2:1采样,垂直方向不降低采样率。也就是这样:

在这里插入图片描述

水平方向上的两个像素点组成了一个宏像素,两个像素点共享一对UV像素分量。

至于U和V分量是从水平方向第一个像素采集,还是分开到两个像素采集。如果是分开采集,是先采U分量还是先采集V分量,这个可能需要更专业的解释了。根据我搜索到的资料,最准确的说法只是,在扫描线上,水平方向上的UV分量是Y分量的一半。

对于四个像素,YUV4:2:2格式需要4*8 + 2*8 + 2*8 = 64位,每个像素深度为16位

YUV4:2:0

YUV4:2:2的采样方式表示:水平和垂直方向上Y分量和UV分量对的采样比都是2:1。

目前YUV4:2:0有两种变体,一种用于MPEG-1标准如下图:

在这里插入图片描述

另一个常用语MPEG-2标准,我们经常见到的4:2:0通常都是这种。如下图:

在这里插入图片描述

对于四个像素,YUV4:2:0格式需要4*8 + 8 + 8 = 48位,每个像素深度为12位

YUV存储格式

YUV的存储格式分为打包格式(packet formats)和平面格式(planar formats)。

在打包格式中,Y,U和V组件存储在单个数组中,YUV三个分量是顺序交错存储。 像素被组织成宏像素组,其布局取决于采样格式。

在平面格式中,Y,U和V分量存储在三个不同的平面(数组)中。YUV三个分量被分开存储在三个不同的数组中。

4:4:4,24位像素深度

YUV4:4:4实际上表达的是:采样模式位4:4:4的打包存储的数据。它的存储方式如图:

在这里插入图片描述

一个小方格代表一个字节,一组连续的小方格代表一个像素。

4:2:2,16位像素深度

4:2:2的采样格式共有两种存储方式

  • YUY2
  • UYVY

它们的存储方式都是打包格式,其中每个宏像素是两个像素,编码为四个连续字节。

YUY2

在YUY2格式中,中第一个字节包含第一个Y样本,第二个字节包含第一个U(Cb)样本,第三个字节包含第二个Y样本,以及 第四个字节包含第一个V(Cr)样本,如图所示:

在这里插入图片描述

UYVY

这种格式与YUY2相同,只是字节顺序颠倒了 - 也就是说,色度和亮度字节被翻转,如图:

在这里插入图片描述

4:2:0,12位像素深度

下面要介绍的4:2:0格式都采用了平面存储模式,共有四种:

  • IMC2
  • IMC4
  • YV12
  • NV12

所有的4:2:0模式,色度分量无论是在水平还是垂直方向上,采样数都是亮度分量的1/4。

IMC2

IMC2格式的存储方式如图:

在这里插入图片描述

每个分量以一个字节存储,平面存储格式的意思就是,先存储视频帧中所有的Y分量。Y分量存储完之后,才开始存储色度分量。在IMC2格式中,YUV三分量的存储关系是:先存所有的Y分量、再存所有的V分量,最后存储U分量。

为了便于处理和表达,通常在代码中会以三个数组来分别装着三个分量。

另外需要提一嘴,在IMC2格式中,存储UV分量的内存空间步长分别是存储Y分量的一半。另外因为色度分量的采样书是Y分量的1/4,所以,及时色度分量占用空间是亮度分量的一半,也会有一些空闲的内存。

IMC4

在这里插入图片描述

和IMC2格式类似,只是U、V两个色度分量的存储顺序对调了一下。

YV12&I420

在这里插入图片描述

YV12格式的存储方式又有变化,存储色度分量的内存步幅是亮度分量的一半,首先Y分量数据以unsigned char数组的形式存储,紧跟着后面存V分量,最后存U分量。

I420和YV12的存储方式差不多,区别的地方在于,I420的Y分量后,存储的是U分量,最后存V分量,色度分量的存储顺序替换了一下。另外I420也被称为YUV420P。

YV12、I420、YUV420p这三个名词在多媒体开发中,是出现频率比较高的是那个了。大家不妨记忆一下

NV12

在这里插入图片描述

NV12格式首先存储Y分量平面,作为具有偶数行的无符号字符值数组。 Y平面后面紧跟着一个无符号字符值数组,其中包含打包的U(Cb)和V(Cr)样本。

剧终

本文以理解为主,部分讲述并不代表事实,在生产场景这已经够用了。


http://chatgpt.dhexx.cn/article/gvaeUL7m.shtml

相关文章

YUV格式详解

介绍 我们都知道,YUV是一种表示颜色的模型,另外在大多数情况下,我们所说的YUV与YCbCr是一样的,其中Y指亮度分量,UV和CbCr都是色彩分量。 有一款YUV图像查看工具 YUV Eye ,可以使用这个工具查看YUV图像&am…

图像和流媒体 -- 详解YUV数据格式

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78283369 我们在讲 FFmpeg 系列的时候,有提到 YUV 的。其中包括YUV播放器、简单的YUV格式介绍。 参看:FFmpeg再学习 -- 视音频基础知识 接下来详细研究一下&#x…

YUV格式详解【全】

YUV格式详解 YUVYUV 采样YUV 4:4:4YUV 4:2:2YUV 4:2:0YUV 4:1:1 planar formatPacked (or Interleaved)PlanarSemi-Planar 关系图 YUV 与 RGB 相互转换计算公式推导1. 模拟 RGB转YUV的推导公式2. 数字 RGB to YUV 1. 模拟YUV→模拟RGB2. 数字YUV→数字RGBYUV与RGB的相互转换会损…

LaTeX Error: Unknown option quiet for package fontspec

编译方式错误,fontspec是基于Xe和Le开发的,所以不能使用pdf**进行编译

Latex Error:Two \documentclass or \documentstyle commands. \documentclass{

今天尝试在latex中使用markdown语法时出现了如下错误: Two \documentclass or \documentstyle commands. \documentclass{ 在网上查找了好多地方,都说是因为用了两次\documentclass命令导致的,可是我能确定我只用了一次\documentclass命令,最后我终于找到了问题所在。因为我的…

介绍Latex神器——Overleaf的方法

向大家介绍2个神网站,一个是腾讯在线文档,一个是overleaf 腾讯在线文档就不多介绍了,可以直接百度网址并使用,它有2个亮点,1.特别简洁,高效。2.可以多人在线,共同编辑同一个文档。(在…

LaTeX:斜线表头的表格制作

参考 LaTeX:斜线表头的表格制作 - 云社区 - 腾讯云 需求:正规表格的左上角"第一个单元是表头",一般都是用"斜线分区"的!本文介绍其实现方法:不仅适用在表头,表中任何一个单元位置都适…

latex报错 Misplaced \noalign.

表格最后一行少了双斜杠\\

3、显示锁和AQS

3、显示锁和AQS 原子操作CAS atom(不可分割) 什么是原子操作?如何实现原子操作? synchronized 基于阻塞的锁机制 可以实现,但会引发以下问题 1、被阻塞的线程优先级很高 2、拿到锁的线程一直不释放锁怎么办&#x…

LaTex绘制跨行跨列的三线表

有时表格某单元格需要横跨几列,我们可以使用 \multicolumn 命令, 同时使用 booktabs 宏包的 \cmidrule 命令来画横跨几列的横线。它们的语 法如下: \begin{table }[ htbp]\centering \begin{tabular }{ lll}\toprule & \multicolumn{2}{…

Springer latex期刊模板使用的坑

1.之前都是用这个编译,Springer 期刊不是这个,是pdflatex 解决方案:可以上面选项换成pdflatex也可以加这命令\documentclass[pdflatex,sn-basic]{sn-jnl}(注意documentclass只能出现一次,所以pdflatex可以加在原有的d…

LaTeX--5--一个文档的基本结构/导言区/标题_作者_日期

本期的主要内容有: 一个 LaTeX 文档的基本结构导言区常用排版命令标题、作者与日期字体与字号特殊字符的输入一些常用排版效果 另外我们还会穿插介绍一些 LaTeX 的基本概念,在文中加粗表示并附上英文。 1. 一个 LaTeX 文档的基本结构 承接上一期&…

Latex表格大小调整常见问题汇总

列宽调整 若要调整每列的宽度到指定数值&#xff0c;可以将代码中的 \begin{tabular}{c|ccc}改为 \begin{tabular}{p{xxx}|ccc}其中花括号里面填写宽度数值&#xff0c;如5pt&#xff0c;10mm等。如果需要该列居中&#xff0c;可以写作 \begin{tabular}{p{xxx}<{\center…

Elsevier模板LaTex中编译时出现“! Undefined control sequence.”

问题描述(以下内容仅是我遇到的问题&#xff0c;不一定具有普适性) 使用overleaf模板库里的ElsevierLaTex模板上传到系统后&#xff0c;系统并没有正确的生成pdf&#xff0c;而是生成了报错信息。 后来改用了Elsevier官网的latex模板&#xff0c;但是上传之后还是生成报错信息…

latax中插入表格

下面这篇博客写的很好&#xff0c;这里转载了过来。另外需要补充几点&#xff1a; 1.绘制表格的简单方法 latax绘制复杂表非常的麻烦&#xff0c;故一般采取其他方法。 可以使用Excel2LaTeX插件 https://www.latexstudio.net/archives/6992.html &#xff08;需要安装ms off…

Latex的常见问题及解决方案

制作斜线表头 \usepackage{diagbox} \begin{tabular}{|l|ccc|} \hline \diagbox{Time}{Room}{Day} & Mon & Tue & Wed \\ \hline Morning & used & used & \\ Afternoon & & used & used \\ \hline \end{tabular} 效果如下: 空格表示 …

LaTex学习笔记之命令使用

LaTex学习笔记之命令使用 概要vscode跳转写作环境宏包的使用命令的使用常用命令章节层次列表环境字体字号行内和行间公式分式、根式、矩阵表格的使用插图参考文献的插入 概要 本文章是针对已安装好Tex环境&#xff0c;并已安装好编辑器。这里使用TeXstudio进行编辑。 vscode跳…

LaTeX心得分享之插入表格(下)

接上篇~今天我们主要说&#xff1a; 单元格的合并 单元格的拆分 一、单元格的合并 1、\multicolumn命令 。通常用于合并一行种几个不同列的单元格&#xff0c;适合排版跨列的标头。其基本语法格式&#xff1a; \multicolumn{项数}{新列格式}{名称} 项数&#xff1a;表格的…

LaTeX制表命令使用教程(简要例子+清晰代码)(论文排版)

1.基本格式 \documentclass{article}\begin{document}\begin{tabular}{cc}%一个c表示有一列&#xff0c;格式为居中显示(center) (1,1)&(1,2)\\%第一行第一列和第二列 中间用&连接 (2,1)&(2,2)\\%第二行第一列和第二列 中间用&连接 \end{tabular}\end{docum…

语义分割 FastFcn ~ JPU单元

Paper: FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation 贡献&#xff1a; 提出JPU替代 扩张卷积计算时间和内存消耗减少3倍且有更好的表现在一些公开数据集上 start of the art 文章以resnet101作为backbone, deeplab系列在resnet上去掉…