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

news2024/11/17 13:40:05

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

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

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

目录

前言

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

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

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

相关文章

pytorch(6)——神经网络基本骨架nn.module的使用

1 神经网络框架 1.1 Module类的使用 NN (Neural network): 神经网络 Containers: 容器 Convolution Layers: 卷积层 Pooling layers: 池化层 Padding Layers: 填充层 Non-linear Activations (weighted sum, nonlinearity): 非线性激活 Non-linear Activations (other): 非线…

mpi4py包安装报错

报错情况 #include <mpi.h>^~~~~~~compilation terminated.failure.removing: _configtest.c _configtest.oerror: Cannot compile MPI programs. Check your configuration!!![end of output]note: This error originates from a subprocess, and is likely not a probl…

设备取电芯片LDR6328Q

2021年5月&#xff0c;USB-IF 协会发布了全新的USB PD3.1规范&#xff0c;该规范将快充功率上限从100 W提升至240W&#xff08;支持Extended Power Range&#xff0c;简称EPR&#xff09;。充电功率的提升也让USB PD的应用从手机、笔记本电脑&#xff0c;扩展到便携式设备、物联…

Flowable-中间事件-消息中间抛出事件

定义 消息中间事件指在流程中将一个消息事件作为独立的节点来运行。它是一种抛出事件&#xff0c;当流程 执行到消息中间事件时就会中断在这里&#xff0c;一直等待被触发&#xff0c;直接到该事件接收到相应的消息后&#xff0c;流 程沿后继路线继续执行。消息事件是一种引用…

页面访问控制远程仓库

页面访问权限控制 什么是jwt身份认证 在前后端分离模式的开发中&#xff0c;服务器如何知道来访者的身份呢&#xff1f; 在登录后&#xff0c;服务器会响应给用户一个 令牌 &#xff08;token&#xff09;令牌中会包括该用户的id等唯一标识浏览器收到令牌后&#xff0c;自己…

数据结构入门指南:链表(新手避坑指南)

目录 前言 1.链表 1.1链表的概念 1.2链表的分类 1.2.1单向或双向 1.2.2.带头或者不带头 1.2.33. 循环或者非循环 1.3链表的实现 定义链表 总结 前言 前边我们学习了顺序表&#xff0c;顺序表是数据结构中最简单的一种线性数据结构&#xff0c;今天我们来学习链表&#x…

数据结构: 线性表(顺序表实现)

文章目录 1. 线性表的定义2. 线性表的顺序表示:顺序表2.1 概念及结构2.2 接口实现2.2.1 顺序表初始化 (SeqListInit)2.2.2 顺序表尾插 (SeqListPushBack)2.2.3 顺序表打印 (SeqListPrint)2.2.6 顺序表销毁 (SeqListDestroy)2.2.5 顺序表尾删 (SeqListPopBack)2.2.6 顺序表头插 …

vue中各种混淆用法汇总

✨在生成、导出、导入、使用 Vue 组件的时候&#xff0c;像我这种新手就会常常被位于不同文件的 new Vue() 、 export default{} 搞得晕头转向。本文对常见用法汇总区分 new Vue() &#x1f4a6;Vue()就是一个构造函数&#xff0c;new Vue()是创建一个 vue 实例。该实例是一个…

UE5 与 C++ 入门教程·第二课:动画重定向

虚幻中的角色动画都是基于 骨骼网格体 &#xff08;Skeletal Mesh&#xff09;实现&#xff0c;换言之&#xff0c;动画是跟骨骼网格体绑定的。如果有两个骨骼网格体&#xff0c;各自有一套角色动画&#xff0c;那么就可以通过重定向&#xff08;Retargeting&#xff09;将两个…

cglib动态代理、jdk动态代理及spring动态代理使用

1.项目初始化 1.1 pom.xml <dependencies><!-- spring依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version></dependency>&l…

6个电池均衡,buckboost电路,精度高,均衡速度快,BMS均衡

6个电池均衡&#xff0c;buckboost电路&#xff0c;精度高&#xff0c;均衡速度快&#xff0c;本人原创。 1、主体电路图如下 2、均衡电压如图 3、平均电压波动图

SpringBoot使用PropertiesLauncher加载外部jar包

启用SpringBoot的PropertiesLauncher 使用SpringBoot的PropertiesLauncher可以优先加载外部的jar文件, 这样可以在程序运行前替换jar包, 官方文档: Launching Executable Jars 使用演示 建立一个SpringBoot工程, 工程中依赖一个叫自定义的utils包, 版本是1.0.0, 通过http接口…

Java基础_网络编程

Java基础_网络编程 网络编程三要素InetAddress网络模型 UDP通信程序单播发送数据接收数据聊天室 组播广播 TCPTCP通信程序三次握手和四次挥手 来源Gitee地址 网络编程三要素 IP: 设备在网络中的地址&#xff0c;是唯一的标识端口号: 应用程序在设备中唯一的标识。协议: 数据在…

2023OpenFeign源码

原理-源码 让我们看着源~码~ 按顺序走~趟流~程~ 分为两大部分&#xff1a;启动原理、调用流程 Feign 的Java 代码才 3w 多行&#xff0c;放眼现在热门的开源项目&#xff0c; Dubbo、Naocs、Skywalking 中 Java 代码都要 30w 行起步。 重要通知&#xff01;看源码&#xff0c;…

Winform制作的用户界面在高DPI下缩放问题

引言 熟悉Winform的小伙伴应该都遇到过 在100%缩放下制作的用户界面在其他缩放百分比下会出现字体超出边框的情况&#xff0c;导致用户体验大打折扣。用户程序DPI感知是默认打开的&#xff0c;此时可以通过关闭这种感知来禁用字体的缩放&#xff0c;在这种情况下&#xff0c;用…

C语言指针详解

目录 指针是什么? 指针和指针类型 指针-整数 指针的解引用 野指针 野指针成因 如何规避野指针 指针运算 指针- 整数 指针-指针 指针的关系运算 指针和数组 二级指针 指针数组 指针数组 模拟二维数组 指针是什么? 指针理解的2个要点: 1. 指针是内存中一个…

51单片机——串行口通信

目录 1、51单片机串口通信介绍 2、串行口相关寄存器 2.1 、串行口控制寄存器SCON和PCON 2.1.1 SCON&#xff1a;串行控制寄存器 (可位寻址) 2.1.2 PCON&#xff1a;电源控制寄存器&#xff08;不可位寻址&#xff09; 2.2、串行口数据缓冲寄存器SBUF 2.3、从机地址控制…

iOS - 解压ipa包中的Assert.car文件

项目在 Archive 打包后&#xff0c;生成ipa包 将 xxx.ipa文件修改为zip后缀即 xxx.zip &#xff0c;然后再双击解压&#xff0c;会生成一个 Payload 文件夹&#xff0c;里面一个文件 如下图&#xff1a; 然后显示改文件的包内容&#xff1a; 解压 Assets.car 文件的方式&…

基于x-scan的渲染算法

基于x-scan算法实现的z-buffer染色&#xff0c;.net core framework 3.1运行。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula getFormula();Box rect getBound();for …

力扣 968. 监控二叉树

题目来源&#xff1a;https://leetcode.cn/problems/binary-tree-cameras/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a;节点可以分为3个状态&#xff1a;0无覆盖&#xff1b;1有摄像头&#xff1b;2有覆盖。 要想放的摄像头最少&#xff0c;应当叶子…