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

article/2025/9/23 5:10:38

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78283369

我们在讲 FFmpeg 系列的时候,有提到 YUV 的。其中包括YUV播放器、简单的YUV格式介绍。

参看:FFmpeg再学习 -- 视音频基础知识

接下来详细研究一下:

参看:YUV -- 维基百科

参看:图文详解YUV420数据格式

一、YUV简介

YUV,是一种颜色编码方法。常使用在各个影像处理元件中。 YUV在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma),Y′UV, YUV, YCbCr, YPbPr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV和Y'UV通常用来编码电视的模拟信号,而YCbCr则是用来描述数位的影像信号,适合影片与图片压缩以及传输,例如MPEG、JPEG。 但在现今,YUV通常已经在电脑系统上广泛使用。
Y'代表明亮度(luma; brightness)而U与V储存色度(色讯; chrominance; color)部分; 亮度(luminance)记作Y,而Y'的prime符号记作伽玛校正。
YUV Formats分成两个格式:
紧缩格式(packed formats):将Y、U、V值储存成Macro Pixels阵列,和RGB的存放方式类似。
平面格式(planar formats):将Y、U、V的三个分量分别存放在不同的矩阵中。

紧缩格式(packed format)中的YUV是混合在一起的,对于YUV4:4:4格式而言,用紧缩格式很合适的,因此就有了UYVY、YUYV等。

平面格式(planar formats)是指每Y分量,U分量和V分量都是以独立的平面组织的,也就是说所有的U分量必须在Y分量后面,而V分量在所有的U分量后面,此一格式适用于采样(subsample)。平面格式(planar format)有I420(4:2:0)、YV12、IYUV等。

二、历史

Y'UV的发明是由于彩色电视与黑白电视的过渡时期[1]。黑白视讯只有Y(Luma,Luminance)视讯,也就是灰阶值。到了彩色电视规格的制定,是以YUV/YIQ的格式来处理彩色电视图像,把UV视作表示彩度的C(Chrominance或Chroma),如果忽略C信号,那么剩下的Y(Luma)信号就跟之前的黑白电视信号相同,这样一来便解决彩色电视机与黑白电视机的相容问题。Y'UV最大的优点在于只需占用极少的带宽。
因为UV分别代表不同颜色信号,所以直接使用R与B信号表示色度的UV。 也就是说UV信号告诉了电视要偏移某象素的的颜色,而不改变其亮度。 或者UV信号告诉了显示器使得某个颜色亮度依某个基准偏移。 UV的值越高,代表该像素会有更饱和的颜色。
彩色图像记录的格式,常见的有RGB、YUV、CMYK等。彩色电视最早的构想是使用RGB三原色来同时传输。这种设计方式是原来黑白带宽的3倍,在当时并不是很好的设计。RGB诉求于人眼对色彩的感应,YUV则着重于视觉对于亮度的敏感程度,Y代表的是亮度,UV代表的是彩度(因此黑白电影可省略UV,相近于RGB),分别用Cr和Cb来表示,因此YUV的记录通常以Y:UV的格式呈现。

三、常用的YUV格式

为节省带宽起见,大多数YUV格式平均使用的每像素位数都少于24位元。主要的抽样(subsample)格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和YCbCr 4:4:4。YUV的表示法称为A:B:C表示法:
4:4:4表示完全取样。
4:2:2表示2:1的水平取样,垂直完全采样。
4:2:0表示2:1的水平取样,垂直2:1采样。
4:1:1表示4:1的水平取样,垂直完全采样。
最常用Y:UV记录的比重通常1:1或2:1,DVD-Video是以YUV 4:2:0的方式记录,也就是我们俗称的I420,YUV4:2:0并不是说只有U(即Cb), V(即Cr)一定为0,而是指U:V互相援引,时见时隐,也就是说对于每一个行,只有一个U或者V分量,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。至于其他常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。

 

用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。

先记住下面这段话,以后提取每个像素的YUV分量会用到。
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。 
YUV 4:2:0采样,每四个Y共用一组UV分量。 

四、存储方式

下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。

(1) YUVY 格式 (属于YUV422)

YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。 

(2) UYVY 格式 (属于YUV422)

UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。

(3) YUV422P(属于YUV422)

YUV422P也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。

(4)YV12,YU12格式(属于YUV420)

YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。

(5)NV12、NV21(属于YUV420)

NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00

(6)了解更多

想了解更多类型的存储方式,参看:YUV Formats

中文的有人翻译了,参看:V4L2文档翻译(十)

 

  • 2.6.1. Packed YUV formats
  • 2.6.2. V4L2_PIX_FMT_GREY (‘GREY’)
  • 2.6.3. V4L2_PIX_FMT_Y10 (‘Y10 ‘)
  • 2.6.4. V4L2_PIX_FMT_Y12 (‘Y12 ‘)
  • 2.6.5. V4L2_PIX_FMT_Y10BPACK (‘Y10B’)
  • 2.6.6. V4L2_PIX_FMT_Y16 (‘Y16 ‘)
  • 2.6.7. V4L2_PIX_FMT_Y16_BE (‘Y16 ‘ | (1 << 31))
  • 2.6.8. V4L2_PIX_FMT_Y8I (‘Y8I ‘)
  • 2.6.9. V4L2_PIX_FMT_Y12I (‘Y12I’)
  • 2.6.10. V4L2_PIX_FMT_UV8 (‘UV8’)
  • 2.6.11. V4L2_PIX_FMT_YUYV (‘YUYV’)
  • 2.6.12. V4L2_PIX_FMT_UYVY (‘UYVY’)
  • 2.6.13. V4L2_PIX_FMT_YVYU (‘YVYU’)
  • 2.6.14. V4L2_PIX_FMT_VYUY (‘VYUY’)
  • 2.6.15. V4L2_PIX_FMT_Y41P (‘Y41P’)
  • 2.6.16. V4L2_PIX_FMT_YVU420 (‘YV12’), V4L2_PIX_FMT_YUV420 (‘YU12’)
  • 2.6.17. V4L2_PIX_FMT_YUV420M (‘YM12’), V4L2_PIX_FMT_YVU420M (‘YM21’)
  • 2.6.18. V4L2_PIX_FMT_YUV422M (‘YM16’), V4L2_PIX_FMT_YVU422M (‘YM61’)
  • 2.6.19. V4L2_PIX_FMT_YUV444M (‘YM24’), V4L2_PIX_FMT_YVU444M (‘YM42’)
  • 2.6.20. V4L2_PIX_FMT_YVU410 (‘YVU9’), V4L2_PIX_FMT_YUV410 (‘YUV9’)
  • 2.6.21. V4L2_PIX_FMT_YUV422P (‘422P’)
  • 2.6.22. V4L2_PIX_FMT_YUV411P (‘411P’)
  • 2.6.23. V4L2_PIX_FMT_NV12 (‘NV12’), V4L2_PIX_FMT_NV21 (‘NV21’)
  • 2.6.24. V4L2_PIX_FMT_NV12M (‘NM12’), V4L2_PIX_FMT_NV21M (‘NM21’), V4L2_PIX_FMT_NV12MT_16X16
  • 2.6.25. V4L2_PIX_FMT_NV12MT (‘TM12’)
  • 2.6.26. V4L2_PIX_FMT_NV16 (‘NV16’), V4L2_PIX_FMT_NV61 (‘NV61’)
  • 2.6.27. V4L2_PIX_FMT_NV16M (‘NM16’), V4L2_PIX_FMT_NV61M (‘NM61’)
  • 2.6.28. V4L2_PIX_FMT_NV24 (‘NV24’), V4L2_PIX_FMT_NV42 (‘NV42’)
  • 2.6.29. V4L2_PIX_FMT_M420 (‘M420’)

五、YUV与RGB的转换公式

参看:YUV -- 维基百科

这部分我没看懂...   

六、推荐一个工具

参看:Image Analyzer

参看:GSG:Debugging projects

参看:软件操作演示

文章最后,是有视频都哦!!可以下载下来看看。

 

  • Bayer File:Bayer.zip
    • bayer720480_8of16_prop.txt: size 720 x 480 pixels, even B lines, GR/BG order, 8 bits out of 16 bits
    • bayer720480_10of16_prop.txt: size 720 x 480 pixels, even B lines, GR/BG order, 10 bits out of 16 bits
  • DaVinci HD File:DaVinciHD.zip
  • NV12 Tiled File:Nv12 tiled.zip
  • YUV 4:2:0 planar File:Yuv420planar.zip
  • YUV 4:2:2 packed File:Yuv422packed.zip
  • YUV 4:2:2 planar File:Yuv422planar.zip

 

七、RGB 介绍

既然都提到RGB了,就简单讲一下吧。

参看:三原色光模式 -- 维基百科

三原色光模式(RGB color model),又称RGB颜色模型或红绿蓝颜色模型,是一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光。(且三原色的红绿蓝不可能用其他单色光合成)

三原色光的相加:红光加绿光为黄光,黄光加蓝光为白光

再有一个是  RGB颜色查询对照表  

 

八、像素

最后,我要讲一下像素,上面提到很多次了。

参看:分辨率和像素是什么关系? -- 知乎

像素即px,是画面中最小的点(单位色块)。像素的大小是没有固定长度值的,不同设备上1个单位像素色块的大小是不一样的。
分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。分辨率可以分为两方面:屏幕分辨率和图像分辨率。

1. 屏幕分辨率:     

例如,屏幕分辨率是1024×768,也就是说设备屏幕的水平方向上有1024个像素点,垂直方向上有768个像素点。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样的。    例如,尺寸面积大小相同的两块屏幕,分辨率大小可以是不一样的,分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致,单个色块面积更小。而分辨率低的屏幕上像素点(色块)更少,单个像素面积更大,可以显示的画面就没那么细致。

2. 图像分辨率:    

例如,一张图片分辨率是500x200,也就是说这张图片在屏幕上按1:1放大时,水平方向有500个像素点(色块),垂直方向有200个像素点(色块)。    在同一台设备上,图片分辨率越高,这张图片1:1放大时,图片面积越大;图片分辨率越低,这张图片1:1缩放时,图片面积越小。(可以理解为图片的像素点和屏幕的像素点是一个一个对应的)。    但是,在屏幕上把图片超过100%放大时,为什么图片上像素色块也变的越大,其实是设备通过算法对图像进行了像素补足,我们把图片放的很大后看到的一块一块的方格子,虽然理解为一个图像像素,但是其实是已经补充了很多个屏幕像素;同理,把图片小于100%缩小时,也是通过算法将图片像素进行减少。     

最后,虽然不同设备上像素块大小会不一样,但是同一台硬件设备上的屏幕分辨率、像素块大小是不会变的。PC电脑上之所以可以调整屏幕分辨率,其实也是通过算法转换了。

 

举个例子吧,我用的华为P8手机(是该换了...),看看其参数。

这里就有摄像头参数介绍了,后置摄像头 1300万像素。或者说 vivo X9前置2000万柔光双摄,这个广告熟不熟悉。

1300万像素啥意思呢?

打开手机相机设置,查看分辨率,你可以看到有如下几个选项。

其中图片大小最大的 13M 4160x3120(4:3) 即摄像头最大像素

4160x3120 = 12979200 = 1300 万像素

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78283369

 


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

相关文章

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

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

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

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

介绍Latex神器——Overleaf的方法

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

LaTeX:斜线表头的表格制作

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

latex报错 Misplaced \noalign.

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

3、显示锁和AQS

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

LaTex绘制跨行跨列的三线表

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

Springer latex期刊模板使用的坑

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

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

本期的主要内容有&#xff1a; 一个 LaTeX 文档的基本结构导言区常用排版命令标题、作者与日期字体与字号特殊字符的输入一些常用排版效果 另外我们还会穿插介绍一些 LaTeX 的基本概念&#xff0c;在文中加粗表示并附上英文。 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上去掉…

JDNI

JNDI是为了一个最最核心的问题&#xff1a;是为了解耦&#xff0c;是为了开发出更加可维护、可扩展的系统JNDI和JDBC起的作用类似&#xff1a;JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关…

JGit

JGit 参考&#xff1a;https://yonge812.iteye.com/blog/1687480 概念&#xff1a; 就是用java代码实现git的命令行操作 JGit API&#xff1a; https://download.eclipse.org/jgit/site/5.2.1.201812262042-r/apidocs/index.html 打开git仓库 Git gitGit.open&#xff…