【学习笔记】关于图像YUV格式分类和排布方式的全学习

这里是尼德兰的喵·学习笔记相关文章,欢迎您的访问!

如果文章对您有所帮助,期待您的点赞收藏

让我们一起为芯片前端全栈工程师而努力

目录

前言

YUV格式导图

YUV444

packed

planar

I444

YV24

semi-planar

NV24

NV42

YUV422

packed

YUYV

UYVY

VYUY

planar

I422

IV16

semi-planar

NV16

NV61

YUV420

planar

I420

YV12

semi-planar

NV12

NV21

10bit像素讨论

不管不顾型

双字节对齐型

四字节对齐型

82拆分型

前言

先来明确一些问题,以便咱们之后更加顺利的进行学习。

1.什么是图像YCrCb/YUV格式?

YCrCb格式是一种将彩色图像表示为亮度(Y)和色度(Cr和Cb)分量的色彩编码系统。它在数字图像处理和计算机视觉中被广泛使用,特别是在图像压缩和视频编码领域。通常而言,YCrCb格式与YUV格式只是在数值和取值范围上有一些不同,但在实践中通常可以互换使用。

具体来说,YCrCb格式包含以下三个分量:

YCrCb格式是一种将彩色图像表示为亮度(Y)和色度(Cr和Cb)分量的色彩编码系统。它在数字图像处理和计算机视觉中被广泛使用,特别是在图像压缩和视频编码领域。YCrCb格式是YUV格式的一个变种,因为它们在数值上有一些不同,但在实践中通常可以互换使用。

具体来说,YCrCb格式包含以下三个分量:

  1. Y(亮度分量):表示图像的亮度信息,也可以看作是黑白图像。Y分量表示了图像的明暗变化,亮度从黑到白的变化。Y值通常用来表示像素的灰度级别,范围一般是0到255,其中0是纯黑,255是纯白。

  2. Cr(红色色度分量):表示红色与亮度之间的差异。它描述了颜色在红色和绿色之间的变化程度,是色彩信息的一部分。

  3. Cb(蓝色色度分量):表示蓝色与亮度之间的差异。它描述了颜色在蓝色和黄色之间的变化程度,也是色彩信息的一部分。

YUV 和 YCrCb只是相差128,Y、U、V的取值范围是0~255(8bit像素位宽),Cr、Cb取值范围的取值范围是-128~127,两种格式的转换关系为:

Y = Y
U = Cr + 128
V = Cb + 128

下文中,我们只针对YUV(分量取值范围0~255)格式进行讨论。 

2.YUV与RGB的转换关系是?

当YUV与RGB的取值范围均为0~255(8bit像素位宽)时,由YUV转RGB的公式近似为:

R = Y + 1.403(V - 128)
G = Y - 0.344(U - 128) - 0.714(V - 128)
B = Y + 1.770(U - 128)

通俗点理解,U是图片蓝色部分去掉亮度,V是图片红色部分去掉亮度。

3.packed/planar/semi-planar格式分别是什么含义?

Packed、Planar和Semi-Planar都是用于表示图像像素排列方式的术语。

Packed格式(打包格式): Packed格式是指将RGB或YUV的三个分量(R、G、B或Y、U、V)按照像素排列在一起的方式。每个像素的所有分量依次排列在一片连续的内存区域中。在Packed格式中,每个像素所需的字节数等于各个分量的字节数之和。

Planar格式(平面格式):Planar格式是指将RGB或YUV的各个分量(R、G、B或Y、U、V)独立存储在不同的内存区域中。每个分量都有自己的平面(内存缓冲区),这样的排列方式使得所有的R、G、B或Y、U、V分量在内存中是彼此分开的。

Semi-Planar格式(半平面格式): Semi-Planar格式是YUV格式的一种变种,它将亮度(Y)分量存储在一个平面中,而将色度(U和V)分量交错存储在另一个平面中。这种排列方式在一些视频编码标准中得到广泛应用,因为它能够更好地利用色度分量的相关性,从而实现更高的压缩效率。在Semi-Planar格式中,通常将Y平面存储在一个连续的内存区域中,而U和V分量则交错存储在另一个连续的内存区域中。典型的交错方式是UVUVUV... 或 VUVUVU...。

YUV格式导图

为了压缩数据以及便于编码,YUV衍生出大量的数据格式以及排布方式,对这些格式的归纳如下:

之后我们就按照这个格式导图,对8bit像素位宽的YUV格式和存储排布进行学习。

YUV444

YUV444格式的Y:U:V = 4:4:4,典型的没有进行数据压缩而是完整的用三个分量表示一个像素低:

packed

YUV444-packed格式通常只有一种排列方式,即按像素点顺序排列:

YUV YUV YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV YUV YUV

在内存中(文章主体讨论8bit像素点的情况),则可表示如下:

planar

I444

YUV分量分3个平面分别存放,由起始地址开始先存Y后存U最后存V。

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYUUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUUVVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVV

更加可视化一些在内存中的存储方式为(令w=W-1,h=H-1,下同):

YV24

与I444的区别就是平面按照Y-V-U的方式排布:

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYVVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVVUUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUU

semi-planar

NV24

Y分量单独存放,UV分量交错存放,UV在排列的时候顺序为UVUV。

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYUVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV

NV42

Y分量单独存放,UV分量交错存放,UV在排列的时候顺序为VUVU。

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYVUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVU

YUV422

相较于YUV444和YUV420,YUV422因为兼顾了数据压缩和分辨率,是更加常用的图像格式。简单来说YUV422就是Y:U:V = 4:2:2,左右两个像素点共享UV分量:

对于一帧图像的数据量而言,YUV422:YUV444 = 8:12 = 2:3。

packed

YUYV

顾名思义,就是图像的传输和存储次序是YU-YV-YU-YV...

YU YV YU YV YU YV YU YV
YU YV YU YV YU YV YU YV
YU YV YU YV YU YV YU YV
YU YV YU YV YU YV YU YV

存储于内存中,直观可视图:

UYVY

UY VY UY VY UY VY UY VY
UY VY UY VY UY VY UY VY
UY VY UY VY UY VY UY VY
UY VY UY VY UY VY UY VY

VYUY

VY UY VY UY VY UY VY UY
VY UY VY UY VY UY VY UY
VY UY VY UY VY UY VY UY
VY UY VY UY VY UY VY UY

planar

I422

YUV 分量分别存放,平面顺序为Y-U-V。

YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYYUUUUUU
UUUUUU
UUUUUU
UUUUUUVVVVVV
VVVVVV
VVVVVV
VVVVVV

IV16

平面顺序为Y-V-U。

YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYYVVVVVV
VVVVVV
VVVVVV
VVVVVVUUUUUU
UUUUUU
UUUUUU
UUUUUU

semi-planar

NV16

Y分量单独存放,UV分量交错存放,UV平面存放顺序为UVUV....

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYUVUVUVUVUVUV
UVUVUVUVUVUV
UVUVUVUVUVUV
UVUVUVUVUVUV

NV61

Y分量单独存放,UV分量交错存放,UV平面存放顺序为VUVU....

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYVUVUVUVUVUVU
VUVUVUVUVUVU
VUVUVUVUVUVU
VUVUVUVUVUVU

YUV420

YUV420进一步合并UV分量,上下左右四个Y共享一组UV:

可以看出YUV420是不适合以packed格式存储的,因为行传输时无论如何部分行的Y分量对应UV分量也不在自己行:

在YUV420中,每个4x4像素块有一个Y分量,而对于4x4像素块中的每2x2像素块,只有一个U分量和一个V分量。这种分量的排列方式在Planar格式中是比较自然的,因为U和V分量需要单独存储在各自的平面中,而且它们的尺寸比Y分量小。

对于Packed格式,所有的分量都需要按照像素排列在一片连续的内存区域中。在YUV420中,由于U和V分量的尺寸比Y分量小,无法将它们简单地放在连续的内存区域中,因此不能使用Packed格式表示YUV420。

数据量对比,YUV420:YUV444 = 1:2。

planar

I420

YUV 分量分别存放,平面顺序为Y-U-V。

YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYYUUUUUU
UUUUUUVVVVVV
VVVVVV

YV12

YUV 分量分别存放,平面顺序为Y-V-U。

YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYYVVVVVV
VVVVVVUUUUUU
UUUUUU

semi-planar

NV12

Y分量单独存放,UV分量交错存放,UV平面存放顺序为UVUV....

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYUVUVUVUVUVUV
UVUVUVUVUVUV

NV21

Y分量单独存放,UV分量交错存放,UV平面存放顺序为VUVU....

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYYVUVUVUVUVUVU
VUVUVUVUVUVU

10bit像素讨论

通常在芯片中处理的像素值都是8bit,但是现在像素值位宽为10bit的场景越来越多了。问一下GPT-越来越多的10位像素摄像头出现的原因有多个因素:

  1. 提供更高的图像质量:10位像素相比于传统的8位像素,可以表示更多的色彩细节和灰度级别。这意味着在相同的场景下,10位像素能够捕捉更多的色彩变化和亮度层次,从而提供更高质量、更真实的图像。

  2. 提高图像的动态范围:10位像素具有更大的动态范围,能够捕捉更宽广的亮度范围。这对于拍摄高对比度场景(如明亮的天空和阴暗的阴影)非常重要,可以减少过曝和欠曝现象,提供更平衡的图像。

  3. 支持更好的后期处理:10位像素在后期图像处理时具有更多的信息,可以更好地抵抗色带、噪点和其他处理时产生的损失。这对于专业摄影和视频制作领域特别有益。

  4. 视频制作需求:在视频制作中,更高的色彩深度可以提供更大的颜色空间和更多的颜色梯度,这对于色彩校正和特效处理非常有用。

  5. 技术进步和成本下降:随着技术的发展,制造10位像素传感器的成本逐渐降低,使得这些相机逐渐走入普通用户的市场。

需要指出的是,10位像素在图像处理和存储上需要更多的资源,相比于传统的8位像素,会产生更大的文件大小。因此,对于一般日常拍摄,普通用户可能并不明显感受到10位像素的差异,而这种技术更常见于专业摄影、电影制作和广播等领域,以满足对高质量图像的要求。

但是显然,10bit的像素对于数据存储和对齐带来了很多的麻烦,在此我列举几种我看到的存储方式。

不管不顾型

就致密的楞放,不管硬件处理的死活那种,好处是真没有空间浪费,缺点是对齐读取时哭死:

双字节对齐型

双字节也分成低位对齐:

和高位对齐:

 相比较而言我更加喜欢高位对齐,因为在10bit到8bit截断时,每两个Byte丢弃一个Byte就可以了。

四字节对齐型

82拆分型

就是把10bit拆分为8bit+2bit,先传4个像素点的高8bit,再把这4个像素点的低2bit拼成一个8bit,同样也是5Byte传4个有效像素。这种方式在YUV422格式下个人感觉时比较合适的,同样也比较适合截位,每5个Byte固定丢弃一个Byte就可以了。

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

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

相关文章

华为数通HCIA-网络模型

TCP 网络通信模式 作用:指导网络设备的通信; OSI七层模型: 7.应用层:由应用层协议(http、FTP、Telnet.)为应用程序产生对应的数据; 6.表示层:将应用层产生的数据转换成网络设备看…

Go语言中的结构体详解

关于 Golang 结构体 Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对 象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们…

HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face

总述 HuggingGPT 让LLM发挥向路由器一样的作用,让LLM来选择调用那个专业的模型来执行任务。HuggingGPT搭建LLM和专业AI模型的桥梁。Language is a generic interface for LLMs to connect AI models 四个阶段 Task Planning: 将复杂的任务分解。但是这里…

C语言复合赋值符和运算符的优先级问题

结论: 复合赋值符的优先级小于运算符 【练习1】 a * a / b的运算顺序是什么? a / b * a 【练习2】 x / 3 2 * 3 2 / 3 6 2 x 0

【力扣周赛】第 355 场周赛(构造二分答案异或前缀 状态压缩⭐)

文章目录 Q1:6921. 按分隔符拆分字符串(双指针)Q2:6915. 合并后数组中的最大元素(倒序遍历贪心)代码优化 Q3:6955. 长度递增组的最大数目🚹🚹🚹🚹…

【JavaEE初阶】——第七节.Servlet入门学习笔记

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:JavaEE进阶 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录 前…

安全攻击 --- XSS攻击

XSS跨站脚本攻击 (1)简介 OWASP TOP 10 之一,XSS被称为跨站脚本攻击(Cross-Site-Scripting)主要基于JavaScript(JS)完成攻击行为XSS通过精心构造JS代码注入到网页中,并由浏览器解释…

【flutter】flutter如何让app内字体大小不随着系统改变而改变

如果我们不特意设置,flutter开发的app他的字体大小是会跟着系统设置的字体大小而改变,这样就会导致页面出现布局错乱问题,那么如何解决这个问题呢?我也搜索了相关资料,有两个常用也是网络上搜集到比较多的方法&#xf…

vs2013 32位 编译的 dll,重新用vs2022 64位编译,所遇问题记录

目录 一、vs2013 32 DLL 转 VS2022 64 DLL 所遇问题 1、 LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900” 2、原先VS2013 现在 VS2022 导致的vsnprintf 重定义问题 3、 无法解析的外部符号 __vsnwprintf_s 4、无法解析的外部符号__imp__CertFreeC…

Ros终端出现找不到bash: /home/***/devel/setup.bash: 没有那个文件或目录

现象:Ros终端出现找不到bash: /home/***/devel/setup.bash: 没有那个文件或目录 问题:配置时路径写错 解决方法:改正路径 1.打开文件 gedit ~/.bashrc2.修改正确路径

【ruby on rails】M1遇到的一些安装问题

1. homebrew位置变了 原来的Cellar Homebrew Caskroom 都是在 /usr/local/下面 M1在/opt/homebrew下面 2. 装ruby M1电脑安装ruby,装不上的问题 RUBY_CFLAGS"-w" rbenv install 2.7.43. 装puma报错 gem install puma -v 5.5.2 -- --with-openssl-dir…

Kubernetes.Service—使用源 IP

使用源 IP 运行在 Kubernetes 集群中的应用程序通过 Service 抽象发现彼此并相互通信,它们也用 Service 与外部世界通信。 本文解释了发送到不同类型 Service 的数据包的源 IP 会发生什么情况,以及如何根据需要切换此行为。 准备开始 术语表 本文使用…

kotlin 编写一个简单的天气预报app(三)

使用eventbus替换broadcast 将从Broadcast切换到EventBus有以下几个好处: 解耦性:通过使用EventBus,您可以实现组件之间的解耦。传统的Broadcast机制需要发送方和接收方明确知道对方的存在,并且需要在代码中设置Intent过滤器和广…

安装Harbor

前言 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署企业内部的私有环境Registry是非常必要的,Harbor和docker中央仓库的关系,…

2023牛客多校第三场 B.Auspiciousness

传送门 前题提要:没得说,赛时根本没想到dp,赛后翻各大题解看了很久,终于懂了dp的做法,故准备写一篇题解. 首先,先定义一下我们的 d p dp dp方程,考虑将处于 [ 1 , n ] [1,n] [1,n]的数当做小数,将处于 [ n 1 , 2 ∗ n ] [n1,2*n] [n1,2∗n]的数当做大数.那么对于我们的摸牌结…

CEC2022代码(Matlab代码)及多种智能优化算法求解CEC2022

一、CEC2022测试函数 CEC2022测试集共有12个单目标测试函数,每个测试函数可选择的维度分别为10维、20维。该测试集合也是目前高质量论文应用最广泛的测试集,CEC2022测试集函数复杂,非常具有挑战力。 CEC2022测试函数与理论最优值 二、多种智…

hcip——ospf综合

要求 1. 搭建toop 2.地址规划 协议范围路由器地址 RIP 172.16.0.0 17 R12 loop0:172.16.0.0 24 loop1:172.16.1.0 24 OSPF 172.16.128.0 17 area1 172.16.144.0 20 R1 g0:172.16.144.1 24 loop0:172.16.145.1 24 R2 g0:172.16.144.2 24 loop:172…

微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal

效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})

常用css 笔记

0、定义变量 :root { --primary-color: #007bff;} .button { background-color: var(--primary-color);} 1、水平垂直居中 div {width: 100px;height: 100px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto; }父级控制子集居中 .parent {display: fle…

【广州华锐互动】VR模拟灭火逃生体验系统

VR模拟灭火逃生体验系统由广州华锐互动开发,是一种基于虚拟现实技术的应急演练与培训系统,可以真实模拟消防逃生场景,让体验者在沉浸式的虚拟环境中,根据正确的消防逃生方法提示,进行自救演练。这种科学普及方法是更加…