这里是尼德兰的喵·学习笔记相关文章,欢迎您的访问!
如果文章对您有所帮助,期待您的点赞收藏
让我们一起为芯片前端全栈工程师而努力
目录
前言
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格式包含以下三个分量:
-
Y(亮度分量):表示图像的亮度信息,也可以看作是黑白图像。Y分量表示了图像的明暗变化,亮度从黑到白的变化。Y值通常用来表示像素的灰度级别,范围一般是0到255,其中0是纯黑,255是纯白。
-
Cr(红色色度分量):表示红色与亮度之间的差异。它描述了颜色在红色和绿色之间的变化程度,是色彩信息的一部分。
-
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位像素摄像头出现的原因有多个因素:
-
提供更高的图像质量:10位像素相比于传统的8位像素,可以表示更多的色彩细节和灰度级别。这意味着在相同的场景下,10位像素能够捕捉更多的色彩变化和亮度层次,从而提供更高质量、更真实的图像。
-
提高图像的动态范围:10位像素具有更大的动态范围,能够捕捉更宽广的亮度范围。这对于拍摄高对比度场景(如明亮的天空和阴暗的阴影)非常重要,可以减少过曝和欠曝现象,提供更平衡的图像。
-
支持更好的后期处理:10位像素在后期图像处理时具有更多的信息,可以更好地抵抗色带、噪点和其他处理时产生的损失。这对于专业摄影和视频制作领域特别有益。
-
视频制作需求:在视频制作中,更高的色彩深度可以提供更大的颜色空间和更多的颜色梯度,这对于色彩校正和特效处理非常有用。
-
技术进步和成本下降:随着技术的发展,制造10位像素传感器的成本逐渐降低,使得这些相机逐渐走入普通用户的市场。
需要指出的是,10位像素在图像处理和存储上需要更多的资源,相比于传统的8位像素,会产生更大的文件大小。因此,对于一般日常拍摄,普通用户可能并不明显感受到10位像素的差异,而这种技术更常见于专业摄影、电影制作和广播等领域,以满足对高质量图像的要求。
但是显然,10bit的像素对于数据存储和对齐带来了很多的麻烦,在此我列举几种我看到的存储方式。
不管不顾型
就致密的楞放,不管硬件处理的死活那种,好处是真没有空间浪费,缺点是对齐读取时哭死:
双字节对齐型
双字节也分成低位对齐:
和高位对齐:
相比较而言我更加喜欢高位对齐,因为在10bit到8bit截断时,每两个Byte丢弃一个Byte就可以了。
四字节对齐型
82拆分型
就是把10bit拆分为8bit+2bit,先传4个像素点的高8bit,再把这4个像素点的低2bit拼成一个8bit,同样也是5Byte传4个有效像素。这种方式在YUV422格式下个人感觉时比较合适的,同样也比较适合截位,每5个Byte固定丢弃一个Byte就可以了。