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

news/2024/11/9 9:29:47/

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

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

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

目录

前言

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.ppmy.cn/news/988230.html

相关文章

【沐风老师】3dMax子样条线编辑插件SubSpline使用方法详解

3dMax子样条线编辑插件SubSpline,是3dMax中样条曲线形状的高级子对象选择器和材质ID编辑器。 只需一个简单的切换按钮,即可在屏幕上轻松显示所有选定形状的顶点编号和材质ID。 利用箭头工具选择样条曲线子对象,以补充和扩展3dsMax的标准工具…

linux驱动学习:从上电到启动 一

1 从上电到bootloader rom boot: 初始化硬件:cpu上电后,首先从片内rom中执行指令,即片内boot程序 加载引导程序:ROM Bootloader 从可访问的存储介质(如闪存、SD卡等)中读取引导程序,并将其加载到…

《零基础入门学习Python》第071讲:GUI的终极选择:Tkinter8

虽然我们能用 tkinter 设计不少东西了,但是不少同学还是感觉对这个界面编程掌控得还不够多,说白了,就是我们现在还没办法随心所欲的去绘制我们想要的界面,但是不瞒你说,今天的这一节课将会给你的人生乃至人生观带来翻天…

Redis Sentinel 及 Redis Cluster

Redis Sentinel Redis-Sentinel(哨兵模式)是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是…

微信小程序开发每日一写--5

按钮的使用和底层逻辑的实现&#xff08;暂未成功&#xff09; WXML&#xff1a; <button class"bth1"type"primary" >按钮</button>JS&#xff1a; // index.js // 获取应用实例 //const app getApp() Page({/*bthTapHandler(e){//按钮的…

飞行动力学 - 第15节-part 1-操纵力与铰链力矩 之 基础点摘要

飞行动力学 - 第15节-part 1-操纵力与铰链力矩 之 基础点摘要 1. HOTAS全拼2. 操纵杆力&铰链力矩3. 铰链力矩4. 气动补偿&#xff08;Aerodynamic Balancing&#xff09;5. 参考资料 1. HOTAS全拼 Hands On Throttle And Stick 2. 操纵杆力&铰链力矩 操纵杆力&#…

代码随想录算法训练营第二十五天 | 读PDF复习环节3

读PDF复习环节3 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

【打点】pv, uv

一、pv, uv是什么&#xff1f; 1、PV(访问量)&#xff1a;即Page View, 具体是指网站的是页面浏览量或者点击量&#xff1b; 2、UV(独立访客)&#xff1a;即Unique Visitor&#xff0c;访问您网站的一台电脑客户端为一个访客。 二、使用步骤 1.定义方法 代码如下&#xff0…