YUVRGB

news2024/12/22 20:01:38

一、直观感受

根据上面的图片,不难看出:

  • RGB的每个分量,是对当前颜色的一个亮度值
  • Y分量对呈现出清晰的图像有着很大的贡献
  • Cb、Cr分量的内容不太容易识别清楚
  • YUV将亮度信息(Y)与色度信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的

二、RGB

RGB是构成多种颜色的三基色(红绿蓝),也称为加成色。

三个分量共同组成一个像素,且每一个分量占8bit,RGB常常用于图像的存储,并且十分简单。

但是在视频领域中,RGB就不那么常见了。我们知道,视频其实是由一张张连续的图片序列组成的,我们假设有一个1080p(1920 * 1080)分辨率、帧率为30帧的视频,如果使用RGB进行存储的话,仅仅一分钟的视频就能达到 ( 1920 * 1080 * 8 * 30 * 60 )bit (约等于27G)。

三、YUV

YUV是编译true-color颜色空间的种类,Y表示明亮度,U和V则是色度、浓度。 YCbCr的Y与YUV中的Y含义一致,Cb和Cr与UV同样都指色彩,Cb指蓝色色度,Cr指红色色度。

YUV 的最大特点是将亮度信息和色彩信息分离,没有了色彩信息依旧可以显示一张完整的黑白图片。

YUV, YCbCr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV通常用来编码电视的模拟信号,而YCbCr则是用来描述数字的影像信号,适合影片与图片压缩以及传输,例如MPEG、JPEG。因此一般俗称的YUV大多是指YCbCr。

  • Y:表示亮度,占8bit(1字节)
  • Cb(U):蓝色色度分量,占8bit(1字节)
  • Cr(V):红色色度分量,占8bit(1字节)

3.1、YUV 采样格式

YUV 图像的主流采样方式有如下三种:

  • 4:4:4表示色度频道没有下采样,即一个Y分量对应着-个U分量和一个V分量
  • 4:2:2表示2:1的水平下采样,没有垂直下采样,即每两个Y分量共用- - 个U分量和一个V分量
  • 4:2:0表示2:1的水平下采样,2:1 的垂直下采样,即每四个Y分量共用一个U分量和一个V分量

下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量

3.1.1、YUV 4:4:4 采样

YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bit,也就是一个字节。

举个例子 :

假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

那么采样的码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 

最后映射出的像素点依旧为 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3] 

可以看到这种采样方式的图像和 RGB 颜色模型的图像大小是一样,并没有达到节省带宽的目的,当将 RGB 图像转换为 YUV 图像时,也是先转换为 YUV 4:4:4 采样的图像。

3.1.2、YUV 4:2:2 采样

YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。如果水平方向有 10 个像素点,那么采样了 10 个 Y 分量,而只采样了 5 个 UV 分量。

 举个例子 :
  
 假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

 那么采样的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3 

 其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。

 最后映射出的像素点为 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

采样的码流映射为像素点,还是要满足每个像素点有 Y、U、V 三个分量。但是可以看到,第一和第二像素点公用了 U0、V1 分量,第三和第四个像素点公用了 U2、V3 分量,这样就节省了图像空间。

一张 1280 * 720 大小的图片,在 YUV 4:2:2 采样时的大小为:

(1280 * 720 * 8 + 1280 * 720 * 0.5 * 8 * 2)/ 8 / 1024 / 1024 = 1.76 MB 。

可以看到 YUV 4:2:2 采样的图像比 RGB 模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。

3.1.3、YUV 4:2:0 采样

YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。

假设第一行扫描了 U 分量,第二行扫描了 V 分量,那么需要扫描两行才能够组成完整的 UV 分量。

举个例子 :
 
假设图像像素为:
 
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
 
那么采样的码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
 
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。
 
最后映射出的像素点为:

[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

从映射出的像素点中可以看到,四个 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采样中两个 Y 分量共用一套 UV 分量,这样更能够节省空间。

一张 1280 * 720 大小的图片,在 YUV 4:2:0 采样时的大小为:

(1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 1.32 MB 。

可以看到 YUV 4:2:0 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。

3.2、YUV存储格式

  • Planar(平面)
    • Y、U、V分量分开单独存储(先连续存储所有像素点的 Y 分量,然后存储 U 分量,最后是 V 分量。)
    • 名称通常以字母p结尾
  • Semi-Planar(半平面)
    • Y分量单独存储,U、V分量交错存储
    • 名称通常以字母sp结尾
  • Packed(紧凑)
    • 或者叫Interleaved (交错)
    • Y、U、V分量交错存储

3.3、YUV 格式汇总

根据采样方式和存储格式的不同,就有了多种 YUV 格式。

3.3.1、基于 YUV444 采样的存储格式

下面是4x4 像素的 YUV444 格式采样数据:

行列1234
1Y0 U0 V0Y1 U1 V1Y2 U2 V2Y3 U3 V3
2Y4 U4 V4Y5 U5 V5Y6 U6 V6Y7 U7 V7
3Y8 U8 V8Y9 U9 V9Y10 U10 V10Y11 U11 V11
4Y12 U12 V12Y13 U13 V13Y14 U14 V14Y15 U15 V15

I444:先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  U1  U2  U3  U4  U5  U6  U7
U8  U9  U10 U11 U12 U13 U14 U15
V0  V1  V2  V3  V4  V5  V6  V7
V8  V9  V10 V11 V12 V13 V14 V15

YV24:先存储所有的 Y 分量,再存储所有的 V 分量,再存储所有的 U 分量
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V0  V1  V2  V3  V4  V5  V6  V7
V8  V9  V10 V11 V12 V13 V14 V15
U0  U1  U2  U3  U4  U5  U6  U7
U8  U9  U10 U11 U12 U13 U14 U15

:先存储所有的 Y 分量,再U和V交错存放
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  V0  U1  V1  U2  V2  U3  V3
U4  V4  U5  V5  U6  V6  U7  V7
U8  V8  U9  V9  U10  V10  U11  V11
U12  V12  U13  V13  U14  V14  U15  V15

NV42:先存储所有的 Y 分量,再V和U交错存放
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V0  U0  V1  U1  V2  U2  V3  U3
V4  U4  V5  U5  V6  U6  V7  U7
V8  U8  V9  U9  V10  U10  V11  U11
V12  U12  V13  U13  V14  U14  V15  U15

3.3.2、基于 YUV422 采样的存储格式

下面是4x4 像素的 YUV422格式 采样数据:

行列1234
1Y0 U0 -Y1 - V1Y2 U2 -Y3 - V3
2Y4 U4 -Y5 - V5Y6 U6 -Y7 - V7
3Y8 U8 -Y9 - V9Y10 U10 -Y11 - V11
4Y12 U12 -Y13 - V13Y14 U14 -Y15 - V15

I422:先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  U2  U4  U6  U8  U10 U12 U14
V1  V3  V5  V7  V9  V11 V13 V15
YV16:先存储所有的 Y 分量,再存储所有的 V 分量,再存储所有的 U 分量。
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V1  V3  V5  V7  V9  V11 V13 V15
U0  U2  U4  U6  U8  U10 U12 U14

NV16:先存储所有的 Y 分量,再U和V交错存放。
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  V1  U2  V3  U4  V5  U6  V7 
U8  V9  U10 V11 U12 V13 U14 V15

NV61:先存储所有的 Y 分量,再V和U交错存放。
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V1  U0  V3  U2  V5  U4  V7  U6 
V9  U8  V11 U10 V13 U12 V15 U14

UYVY:(每个方括号里是2个像素)

[U0  Y0  V1  Y1 ] [U2  Y2  V3  Y3 ]
[U4  Y4  V5  Y5 ] [U6  Y6  V7  Y7 ]
[U8  Y8  V9  Y9 ] [U10 Y10 V11 Y11]
[U12 Y12 V13 Y13] [U14 Y14 V15 Y15]

YUYV:(每个方括号里是2个像素)

[Y0  U0  Y1  V1 ] [Y2  U2  Y3  V3 ]
[Y4  U4  Y5  V5 ] [Y6  U6  Y7  V7 ]
[Y8  U8  Y9  V9 ] [Y10 U10 Y11 V11]
[Y12 U12 Y13 V13] [Y14 U14 Y15 V15]

YVYU(每个方括号里是2个像素)

[Y0  V1  Y1  U0 ] [Y2  V3  Y3  U2 ]
[Y4  V5  Y5  U4 ] [Y6  V7  Y7  V6 ]
[Y8  V9  Y9  U8 ] [Y10 V11 Y11 U10]
[Y12 V13 Y13 U12] [Y14 V15 Y15 U14]

3.3.3、基于 YUV420 采样的存储格式

下面是4x4 像素的 YUV420格式 采样数据:

行列1234
1Y0 U0 -Y1 - -Y2 U2 -Y3 - -
2Y4 - V4Y5 - -Y6 - V6Y7 - -
3Y8 U8 -Y9 - -Y10 U10 -Y11 - -
4Y12 - V12Y13 - -Y14 - V14Y15 - -

I420 :是先 Y 再 U 后 V
  • 大多数视频解码器以I420格式输出原始图片
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  U2  U8  U10 V4  V6  V12 V14

YV12 是先 Y 再 V 后 U
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V4  V6  V12 V14 U0  U2  U8  U10

NV12 是 iOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储。
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
U0  V4  U2  V6  U8  V12 U10 V14

NV21 是 Android 中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储。
Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7  
Y8  Y9  Y10 Y11 Y12 Y13 Y14 Y15
V4  U0  V6  U2  V12 U8  V14 U10

四、转换关系

REF:

一文读懂 YUV 的采样与格式

https://www.cnblogs.com/zuojie/p/16438496.html

https://www.zhihu.com/question/24994945/answer/3255831372

YUV与RGB格式转换 | ibabyblue's Blog

攻克视频技术_声网_视频技术_视频_YUV_RGB_编码原理_编码压缩_SVC_花屏_卡顿_音画同步_MP4_FLV-极客时间

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

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

相关文章

最多不一定最好,只有适合的才是最好的!电脑的内存多大才是合理的

RAM,或称随机存取存储器,是最好的笔记本电脑和最好的电脑最重要的组成部分之一。硬盘驱动器(HDD)或固态驱动器(SSD)存储可以被视为电脑的长期内存,内存是其短期内存。内存可以跟踪后台运行的应用…

P6 链表 插入数据节点 尾插法指定节点插入

目录 前言 ​编辑 01 链表指定节点后插入数据(根据节点号插入) 测试代码 02 链表指定节点后插入数据(根据节点的数据插入) 尾插法的代码 前言 …

for循环定义域问题

记录一个偶然发现的问题&#xff0c;代码如下 int main(int argc, char *argv[], char *envp[]){for(int i 1; i < 10; i);printf("%d",i); return 0; } 可以看到for循环后加了一个分号&#xff0c;按理说应该报变量i未定义的错误&#xff0c;但此时在编译器中…

RCE绕过

1.[SCTF 2021]rceme 总结下获取disabled_funciton的方式 1.phpinfo() 2.var_dump(ini_get(“disable_functions”)); 3.var_dump(get_cfg_var(“disable_functions”)); 其他的 var_dump(get_cfg_var(“open_basedir”)); var_dump(ini_get_all()); <?php if(isset($_POS…

使用coco数据集进行语义分割(1):数据预处理,制作ground truth

如何coco数据集进行目标检测的介绍已经有很多了&#xff0c;但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json&#xff0c;将上面那些json中的dict转化为图片的label mask&am…

C++入门篇第十篇----继承

前言&#xff1a; 本篇我们将开始讲解C的继承&#xff0c;我想要说的是&#xff0c;C的主体基本就是围绕类和对象展开的&#xff0c;继承也是以类和对象为主体&#xff0c;可以说&#xff0c;C相较于C优化的地方就在于它对于结构体的使用方法的高度扩展和适用于更多实际的场景…

ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)

漏洞描述 影响范围 FFmpeg 2.8.x < 2.8.5FFmpeg 2.7.x < 2.7.5FFmpeg 2.6.x < 2.6.7FFmpeg 2.5.x < 2.5.10 漏洞环境及利用 搭建docker环境 访问8080端口看到上传界面 由于vulhub并没有讲述该漏洞如何复现&#xff0c;我们需要进入环境查看源码 <?php if(!…

电大搜题:开启你的学习新篇章

广西开放大学&#xff0c;作为一所具有悠久历史和丰富经验的广播电视大学&#xff0c;在教育领域享有盛誉。如今&#xff0c;随着科技的迅猛发展&#xff0c;广西开放大学推出了电大搜题微信公众号&#xff0c;为广大学子提供了一个便捷、高效的学习工具。 电大搜题微信公众号…

2_企业级Nginx使用-day1

#企业级Nginx使用-day1 学习目标和内容 1、能够了解Nginx的信号参数 2、能够进行平滑升级Nginx 3、能够配置server虚拟机 4、能够部署上线项目到LNMP架构中 5、能够了解Nginx的常用官方模块 6、能够了解日志相关使用 一、重装和升级 在实际业务场景中&#xff0c;需要使用软件…

linux之buildroot(2)配置toolchain

Linux之buildroot(2)配置toolchain Author&#xff1a;Onceday Date&#xff1a;2023年11月27日 漫漫长路&#xff0c;才刚刚开始… 全系列文章请查看专栏: buildroot编译框架_Once_day的博客-CSDN博客 参考文档&#xff1a; Buildroot - Making Embedded Linux Easy 文章…

.net7.0中把exe和dll分开打包

之前写过 C#把dll分别放在指定的文件夹_wpf core dll 放文件夹-CSDN博客 C#把dll打包到exe_c# 打包exe_故里2130的博客-CSDN博客 这都是老技术了&#xff0c;可以进行参考。 现在的.netcore系列有单独支持把exe和dll分开打包的功能了&#xff0c;当然也支持.net7.0和.net8.…

吉他初学者学习网站搭建系列(4)——如何查询和弦图

文章目录 背景实现ChordDbvexchords 背景 作为吉他初学者&#xff0c;如何根据和弦名快速查到和弦图是一个必不可少的功能。以往也许你会去翻和弦的书籍查询&#xff0c;像查新华字典那样&#xff0c;但是有了互联网后我们不必那样&#xff0c;只需要在网页上输入和弦名&#…

在国外,职业生命期长,是因为敬业吗?

不知道有没有朋友关注围棋比赛&#xff1f;昨天进行了农心杯三国围棋擂台赛第二轮的攻擂战&#xff0c;结果中国棋手谢尔豪半目险胜韩国棋手元晟臻。 棋局本身很精彩&#xff0c;更引人注目的是韩国棋手已经是 38 岁高龄。所以有网友发出感叹&#xff0c;中国的领军人物玩直播、…

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3&#xff0c;包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识&#xff0c;为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

Python中用于机器学习的Lazy Predict库

Python是一种多功能语言&#xff0c;你可以用它来做任何事情。Python的一个伟大之处在于&#xff0c;有这么多的库使它变得更加强大。Lazy Predict就是其中一个库。它是机器学习和数据科学的一个很好的工具。在本文中&#xff0c;我们将了解它是什么&#xff0c;它做什么&#…

k8s中Service负载均衡和Service类型介绍

目录 一.service介绍 二.service参数详解 三.定义service的两种方式 1.命令行expose 2.yaml文件 四.service负载均衡配置 1.kube-proxy代理模式 &#xff08;1&#xff09;设置ipvs &#xff08;2&#xff09;负载均衡调度策略 2.会话保持 3.案例演示 五.四种Servi…

51单片机 -全球【最笨】学习法

全球属我最笨 1> 还有比我笨的吗&#xff1f;2> 4个回合&#xff01;拿下51单片机第1回合> 先学各个外围驱动模块第2回合> 自己写各个外围模块程序第3回合> 学习开源实战小项目第4回合> 小项目-视频讲解 1> 还有比我笨的吗&#xff1f; 有兄弟&#xff0…

(C语言)逆序输出字符串

#include<stdio.h> #include<string.h> int main() {int i;char s[100];scanf("%s",&s);int count strlen(s);for(int i count -1;i > 0; i --)printf("%c",s[i]);return 0;} 代码运行截图&#xff1a; 注&#xff1a;侵权可删

号称要做人民货币的Spacemesh,有何新兴叙事?

​打开Spacemesh的官网&#xff0c;率先映入眼帘的是一个响亮的口号——On a quest to become the people’s coin&#xff08;致力于成为人民的货币&#xff09;&#xff01;Spacemesh 联合创始人 Tomer Afek 曾表示“Spacemesh 的低准入门槛和激励兼容性&#xff0c;激发了从…

Hdoop学习笔记(HDP)-Part.12 安装HDFS

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …