【学习笔记】关于图像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
YYYYYYYYYYYY

UUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUU

VVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVV

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

YV24

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

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY

VVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVV
VVVVVVVVVVVV

UUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUU
UUUUUUUUUUUU

semi-planar

NV24

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

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY

UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV

NV42

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

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY

VUVUVUVUVUVUVUVUVUVUVUVU
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
YYYYYYYYYYY

UUUUUU
UUUUUU
UUUUUU
UUUUUU

VVVVVV
VVVVVV
VVVVVV
VVVVVV

IV16

平面顺序为Y-V-U。

YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY

VVVVVV
VVVVVV
VVVVVV
VVVVVV

UUUUUU
UUUUUU
UUUUUU
UUUUUU

semi-planar

NV16

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

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY

UVUVUVUVUVUV
UVUVUVUVUVUV
UVUVUVUVUVUV
UVUVUVUVUVUV

NV61

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

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY

VUVUVUVUVUVU
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
YYYYYYYYYYY

UUUUUU
UUUUUU

VVVVVV
VVVVVV

YV12

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

YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY
YYYYYYYYYYY

VVVVVV
VVVVVV

UUUUUU
UUUUUU

semi-planar

NV12

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

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY

UVUVUVUVUVUV
UVUVUVUVUVUV

NV21

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

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY

VUVUVUVUVUVU
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就可以了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++静态代码扫描工具clang-tidy详细介绍

clang-tidy 文章目录 clang-tidy1. 什么是clang-tidy2. clang-tidy可以解决什么问题3. 工作原理4. 如何使用clang-tidy4. 总结5. 举例说明: 1. 什么是clang-tidy Clang-Tidy是一个由LLVM项目提供的开源工具,是一个静态分析工具,用于进行静态…

【雕爷学编程】MicroPython动手做(15)——掌控板之AB按键3

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

win10日程怎么同步到安卓手机?电脑日程同步到手机方法

在如今快节奏的生活中,高效地管理时间变得至关重要。而对于那些经常在电脑上安排日程的人来说,将这些重要的事务同步到手机上成为了一个迫切的需求。因为目前国内使用win10系统电脑、安卓手机的用户较多,所以越来越多的职场人士想要知道&…

macos下安装john the ripper并配置zip2john+破解加密zip文件

为了破解加密的zip文件,需要用到john进行爆破密码。 1、首先使用homebrew安装john,可以安装它的增强版john-jumbo: brew install john-jumbo 2、安装后可以使用 john 命令验证: john 3、配置zip2john的环境——.zshrc下,&#x…

HashMap查找

文章目录 1 哈希表的基本概念1.1 两个例子1.2 如何查找1.3 若干术语 2 哈希函数的构造方法2.1 直接定址法2.2 除留余数法 3 处理冲突的方法3.1 开放地址法3.1.1 线性探测法3.1.2 二次探测法3.1.3 伪随机探测法 3.2 链地址法(拉链法)3.2.1 创建步骤3.2.2 …

C#..上位机软件的未来是什么?

C#是一种流行的编程语言,广泛应用于桌面应用程序和上位机软件开发。未来,C#上位机软件将继续不断发展和创新,以满足用户日益增长的需求。以下是我认为C#上位机软件未来可能会涉及的一些方向: 更加智能化:随着人工智能…

idea连接远程服务器上传war包文件

idea连接远程服务器&上传war包 文章目录 idea连接远程服务器&上传war包1. 连接服务器2.上传war包 1. 连接服务器 选择Tools -> Start SSH Session 添加配置 连接成功 2.上传war包 Tools -> Deployment -> Browse Remote Host 点击右侧标签,点击&…

Manjaro KDE 22.1.3vmware无法复制文件

Wayland 是 X11 的现代替代品,几十年来 X11 一直是 Linux 上的默认窗口系统。 Wayland 是一种通信协议,定义 X Window 显示服务器和客户端应用程序之间的消息传递。 软件还不兼容 使用X11即可

linux查看服务器系统版本命令

有时我们需要在linux服务器上安装DB、Middleware等,为了保证兼容性,我们需要知晓被提供的linux服务器版本是否满足需求,下面就说一说linux查看服务器系统版本命令。 1.cat /etc/redhat-release 适用于:rhel/centos等 2.cat /etc…

java static修饰的静态成员

静态成员 特点: 1.静态成员可以被本类所有对象共享2.静态成员可以通过类名调用也可以推荐对象调用,但是推荐使用类名调用!3.静态成员随着类的加载而加载,优先于对象存在的静态方法的注意事项: 1.非静态方法可以访问任…

大数据Flink(四十九):框架版本介绍和编程语言选择

文章目录 框架版本介绍和编程语言选择 一、框架版本介绍 二、编程语言选择 框架版本介绍和编程语言选择

1-Linux的目录结构

Linux的目录结构是规定好的,不可以随意进行更改! Linux的文件系统是采用级层式的树状目录结构,最上层是根目录–/,然后再在根目录下创建其它的目录。 各个目录中主要负责的功能和作用如下:(主体的结构一定…

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 (NCCM)解决方案&#xff…

springboot编写mp4视频播放接口

简单粗暴方式 直接读取指定文件,用文件流读取视频文件,输出到响应中 GetMapping("/display1/{fileName}")public void displayMp41(HttpServletRequest request, HttpServletResponse response,PathVariable("fileName") String fi…

掌握文件锁:使用flock实现多个进程之间的无缝文件同步

使用flock实现多个进程之间的无缝文件同步? 博主简介一、引言二、文件锁的概述2.1、定义文件锁2.2、文件锁的种类2.3、文件锁的作用 三、使用flock实现文件锁3.1、flock的简介3.2、flock的使用方法3.3、flock文件锁命令3.4、flock对文件同步的帮助 四、实现多个进程…

GRE TAP的工作原理与5G工业物联网中的应用

随着互联网新技术的发展以及智能化水平的提高,各企业对实时数据传输的需求也在不断提升,企业愈发重视数据中心的建设,以保障企业内网数据安全。 GRE(Generic Routing Encapsulation,通用路由封装)协议属于…

物理机安装ESXI时遇到No Network Adapters

前不久在虚拟机下安装完成了ESXI,果断地使用了,确实很不错了, 配合我上次发的密匙(https://www.cnntt.com/archives/5556)妥妥爽。 虚拟机中试玩了一下,就开始布置到我的物理机上了,毕竟我以后…

【LeetCode】142.环形链表Ⅱ

题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部…

无涯教程-jQuery - Highlight方法函数

Highlight 效果可以与effect()方法一起使用。这将以特定的颜色突出显示元素的背景,默认为黄色(yellow)。 Highlight - 语法 selector.effect( "highlight", {arguments}, speed ); 这是所有参数的描述- color - 高亮显示颜色。默认值为"#fff…

(八九)如何与InfluxDB交互InfluxDB HTTP API

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦! 第 8 章 前言:如何与InfluxDB交互 1、InfluxDB启动后,会向外提供一套HTTP API。外部程…