YUV数据格式

news2025/1/20 6:00:30

1. YUV的原理

YUV 的原理是把亮度(Luma)与色度(Chroma)分离。 “Y”表示亮度,也就是灰度值。 “U”表示蓝色通道与亮度的差值。 “V”表示红色通道与亮度的差值。

其中 Y 信号分量除了表示亮度信号外,还含有较多的绿色通道量,单纯的 Y 分量可以显示出完整的黑白图像。 U、V 分量分别表示蓝 (blue)、红 (red) 分量信号,只含有色度信息,所以 YUV 也称为 YCbCr,其中,Cb、Cr的含义等同于U、V,C 可以理解为 component 或者 color。

RGB 转 YUV 的公式能更好地反应 YUV 与 RGB 的关系,以及为什么称为 YCbCr:

yuv1.png

RGB与YUV的变换公式如下:

yuv_rgb.jpg

在RGB色彩空间中,三个颜色的重要程度相同,所以需要使用相同的分辨率进行存储,最多使用RGB565这样的形式减少量化的精度,但数据量还是很大的。

研究发现人眼对亮度的敏感超过色度。将图像的亮度信息和颜色信息分离,并使用不同的分辨率进行存储,这样在对主观感觉影响很小的前提下,可以更加有效地存储图像数据。

2. YUV的取值范围

与RGB每个像素点的每个分量取值范围为0-255不同(每个分量占8bit),YUV取值范围有两种:

  1. 以Rec.601为代表(还包括BT.709 / BT.2020)的广播电视标准中,Y的取值范围是16-235,U、V的取值范围是16-240。FFmpeg中称之为“mpeg”范围。

  2. 以JPEG为代表的标准中,Y、U、V的取值范围都是0-255。FFmpeg中称之为“jpeg” 范围。

实际中最常见的是第1种取值范围的YUV(可以自己观察一下YUV的数据,会发现其中亮度分量没有取值为0、255这样的数值)。很多人在这个地方会有疑惑,为什么会去掉“两边”的取值呢?

原因:

  • 在广播电视系统中不传输很低和很高的数值,实际上是为了防止信号变动造成过载,因而把这“两边”的数值作为“保护带”[4]。

下面这张图是数字电视中亮度信号量化后的电平分配图。从图中可以看出。

  • 对于8bit量化来说,信号的白电平为235,对应模拟电平为700mV。

  • 黑电平为16,对应模拟电平为0mV。

  • 信号上方的“保护带”取值范围是236至254,而信号下方的“保护带”取值范围是1-15。

  • 最边缘的0和255两个电平是保护电平,是不允许出现在数据流中的。

与之类似,10bit量化的时候,白电平是2354=940,黑电平是164=64。

文末名片免费领取音视频开发学习资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

quantization_yuv.jpg

下面两张图是数字电视中色度信号量化后的电平分配图。可以看出:

  • 色度最大正电平为240,对应模拟电平为+350mV。

  • 色度最大负电平为16,对应模拟电平为-350mV。

  • 需要注意的是,色度信号数字电平128对应的模拟电平是0mV。

quantization_2.jpg

quantization_3.jpg

3. YUV的存储格式

YUV格式有两大类:planar和packed。

对于 planar 的 YUV 格式,先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。相当于将 YUV 拆分成三个平面 (plane) 存储。

对于 packed 的 YUV 格式,每个像素点的 Y,U,V 是连续交替存储的。

4. YUV的采样格式

主要的采样格式有YUV4:4:4、YUV4:2:2、YUV4:2:0 ,其中YUV4:2:0是最常用的采样格式。

采样就是根据一定的间隔取值。其中的比例是指 Y、U、V 表示的像素,三者分别占的比值。

下图是YUV4:4:4,YUV4:2:2,YUV4:2:0的采样示意图。

image

  • YUV 4:4:4采样,每一个Y对应一组UV分量。

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

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

5. 存储方式

下面用图的形式给出常见的YUV数据的存储方式,并在后面附有取样每个像素点的YUV数据的方法。

(1) YUYV 格式 (属于YUV422)

YUYV.png

相邻的两个Y共用其相邻的两个Cb、Cr,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。

(2) UYVY 格式 (属于YUV422)

YUYV.png

与YUYV不同的是UV的排列顺序不一样,还原其每个像素点的YUV值的方法与上面一样。

(3) YUV422P(属于YUV422)

YUV422P.png

YUV422P是一种平面模式,其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。

(4) YUV420P格式(属于YUV420)

YV12.png

YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。

YUV420p.png

I420: YYYYYYYY UU VV YV12: YYYYYYYY VV UU

(5) NV12、NV21(YUV420sp,属于YUV420)

NV12.png

这两种格式的不同在于UV交错排列的顺序不同,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。

假设一个分辨率为8X4的YUV图像,它们的格式如下图: YUV420sp格式如下图

YUV420sp.png

NV12: YYYYYYYY UVUV NV21: YYYYYYYY VUVU

以w*h大小图像的YUV420数据为例, 其存储格式是: 共大小为(w * h * 3/2)字节, Y分量:(w * h)个字节 U(Cb)分量:(w * h/4)个字节 V(Cr)分量:(w * h/4)个字节

6. 10bit YUV数据的存储

常见的yuv数据,每个像素的一个通道一般是占用一个字节即8bit。而HDR常用的标准HDR10,数据是10bit的。

10bit数据是怎么存储的呢?我们一般会有两种想法:

  1. 每个像素的一个通道占用两个字节,其中6个bit是填充位。

  2. 每个像素的一个通道占用10bit,10bit数据和10bit数据是挨着排列的。

优缺点

  1. 方式1:便于运算处理,有存储冗余;

  2. 方式2:存储没有冗余,计算麻烦。

事实上,10bit是采用方式1存储的,并且高有效字节的前6个bit是填充的0。

HDR10视频解码得到YUV数据的命令:

//yuv420p10le格式
ffmpeg -i hdr10.mp4 -f rawvideo -pix_fmt yuv420p10be hdr10_yuv420p10le.yuv
​
//yuv420p10be格式
ffmpeg -i hdr10.mp4 -f rawvideo -pix_fmt yuv420p10be hdr10_yuv420p10le.yuv

(1)yuv420p10le的数据格式的16进制的显示:

image.png

比如地址019f7040h开始的两个字节:

-------------低地址---->高地址--------------
00011111 000000 01  

(2)yuv420p10be的数据格式的16进制的显示:

image.png

比如地址019f7040h开始的两个字节:

-------------低地址---->高地址--------------
000000 01 00011111   

工具推荐:一个可以播放10bit yuv流的播放器YUV Player

作者:smallest_one 链接:https://www.jianshu.com/p/8e0b9bbf9a41

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis学习笔记(一)

NoSQL 泛指非关系型数据库,作为关系型数据库的补充作用:应对海量用户和海量数据前提下的数据处理问题特征 可扩容、可伸缩大数据量下高性能灵活的数据模型高可用 常见的NoSQL数据库 RedismemcacheHBaseMongoDB Redis 一种高性能键值对数据库特征 数据间…

[附源码]计算机毕业设计springboot酒店在线预约咨询小程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

STL 迭代器萃取

导言 什么是迭代器 迭代器是一种抽象的设计概念,《Design Patterns》一书中对于 iterator 模式的定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述…

wcdma基站的重选和切换

首先移动组网的特点,单个基站覆盖一定区域范围,我们称之为小区,为了组成一个连续服务不断的网,需要在空间上部署多个基站,应对用户的移动。 为了实现业务的连续性,必须给每个小区设置相邻的小区&#xff0c…

C/C++-指针

C/C-指针参考1. 指针指针与内存/地址指针使用2.数组指针数组/指针/sizeof一维数组与指针多维数组指针3.字符/字符串指针4. 其他指针二级指针 -- 还没看空指针void指针野指针5.指针与函数函数指针引用传递指针函数6.结构体指针结构体数组指针???c 对象指针参考 https://www.…

Kotlin 开发Android app(十四):startActivity跳转Activity活动

从一个Activity跳到另一个Activity 在编写安卓代码是最常见的事情了。我们不可能在一个页面中,把所有的事情都做完。 在kotlin中跳转的程序也比较简单,跟java差不多。如果熟悉java代码的话,只需要把代码改变过来而已。 带参数的调整 从一个…

极空间Docker安装Alist套件整合阿里云盘、百度云盘等网盘资源并挂载到本地供极影视刮削播放完整教程

文章目录0、前言1、在docker中安装alist套件1.1、拉取并下载alist镜像1.2.安装alist镜像2、访问并设置alist2.1、访问alist2.2、配置alist2.2.1、在alist中添加阿里云盘2.2.2、在alist中添加其它网盘3、在极空间中将前述网盘挂载到本地4、在极影视中扫描刮削挂载到本地的云盘中…

如何制作一个微信小程序【微信小程序是怎么做的】

为什么现在这么多人使用微信小程序呢?因为微信小程序除了便捷易开发,公司企业可以用来做小程序展示官网,商家也可以做小程序商城,甚至个人也可以拥有自己的小程序。那么如何制作一个微信小程序?微信小程序是怎么做的呢…

第二证券|房地产股债嗨了,百余只个股谁受热捧?谁还受益?

29日,AH股房地产板块狂飙,地产债反常火热。 A股地产股开盘即掀涨停潮,中国武夷、中交地产、空港股份、光大嘉宝、中华企业等超10股竞价涨停。港股内房股大幅高开,碧桂园、富力地产、新城开展等多股涨超10%,盘中三巽集…

Crack:Stimulsoft BI Server 2022.4.5

Stimulsoft BI Server 是一个客户端-服务器系统,可让您高效且有效地实施使用报告和仪表板的完整周期,从执行信息处理任务的设计和自动化开始,到为方便地向用户展示结果做准备结束。报告模块的功能和功能是使用 Stimulsoft 的快速现代技术实现…

一、Vue3基础[组件(props、事件、插槽)]

一、组件化 解释:正如上图所示,一个页面可以分为多块部分,但是如果把所有代码都写在一个vue文件当中,维护性和可读性都会很差,所以需要用到组件化思维->创建多个vue文件每个里面写一部分代码,然后集中在一个主的vue文件调用 二、组件的注册 1.全局 解释:顾名思义,…

【Java盲点攻克】「时间与时区系列」让我们一起完全吃透对于时区和日期相关的功能开发原理

技术简介 java中的日期处理一直是个问题,没有很好的方式去处理,所以才有第三方框架的位置比如joda。文章主要对java日期处理的详解,用1.8可以不用joda。 时间概念 首先我们对一些基本的概念做一些介绍,其中可以将GMT和UTC表示时…

自然算法 - AI面试基础补全

手撕BP神经网络手写Bert和Transformer(BERT很细节的地方,比如文字标签CLS,par)学习pytorch,tensorflow AI算法岗位 可看网站 牛客网站 面经回复 github 项目连接 算法工程师岗位必备知识 问答 ELMO、GPT、…

Linux系统下KVM虚拟机的基本管理和操作

Linux系统下KVM虚拟机的基本管理和操作一、检查本地环境1.检查系统版本2.检查防火墙状态3.检查selinux3.检查libvirtd服务状态4.检查kvm安装结果5.检查kvm虚拟机状态6.检查virsh版本二、virsh常用命令1.列出虚拟机2.虚拟机开关机操作3.删除虚拟机4.设置虚拟机在宿主机开机时自启…

装在笔记本里的私有云环境:K8s 集群准备

本篇是系列中的第六篇内容,继续聊聊如何把一个简化过的私有云环境部署在笔记本里,以满足低成本、低功耗、低延时的实验环境。 在前几篇内容中,我们聊过了:虚拟化、监控、基础的存储、持续集成等内容,接下来的内容中&a…

告诉你如果对一个新产品进行测试

初入一家公司,当一个全新的产品摆在你的面前,你会如何快速入手呢?点、点、点。。。虽说实践是熟悉系统的第一要素,但我们需要静静思考一下。我是谁?--QA我在哪?--**产品组我要做什么?--保质量有…

Nature:“我还有用!“凋亡细胞释放的代谢物充当组织信使

代谢组学文献分享,细胞凋亡是指为维持内环境稳定,由基因控制的细胞自主的有序的死亡。2002年授予在“发现细胞凋亡的重要调控分子并阐述其作用机制”方面做出重要贡献的三位科学家诺贝尔生理和医学奖,caspase依赖的细胞凋亡约占机体内稳态细胞…

多线程初阶(一)

目录 前言: 认识多线程 创建线程 run方法和start区别 继承Thread类 实现Runnable接口 匿名内部类实现继承Thread类 匿名内部类实现Runnable接口实例 Lambda表达式 中断线程 等待线程 线程休眠 线程状态 线程状态之间切换 代码观察线程的状态 线程安…

多点DMALL × Apache Kyuubi:构建统一SQL Proxy探索实践

伴随着国家产业升级的推进和云原生技术成熟,多点 DMALL 大数据技术也经历了从存算一体到存算分离的架构调整变迁。本文将从引入 Kyuubi 实现统一 SQL Proxy 的角度讲述这一探索实践的历程。 多点 DMALL 成立于2015年,提供一站式全渠道数字零售解决方案 D…

STL的常用算法-查找 (20221130)

STL的常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric> 组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;涉及比较、交换、查找、遍历等等&#xff1b; <functional>定义了一些模板类&#xff0…