欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

YUV

最编程 2024-08-15 16:06:47
...

YUV是指亮度参量和色度参量分开表示的像素格式,其中“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
Y: 表示明亮度(Luminance或Luma)
U和V: 色度(Chrominance或者Chroma), 作用是描述影像色彩及饱和度,用于指定像素的颜色。

YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。
YCbCr 则是在世界数字组织视频标准研制过程中作为ITU - R BT.601 建议的一部分,其实是YUV经过缩放偏移的翻版。其中Y与YUV 中的Y含义一致,Cb,Cr 同样都指色彩,只是在表示方法上不同而已。在YUV 家族中,YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。YCbCr 有许多取样格式,如4∶4∶4,4∶2∶2,4∶1∶1 和4∶2∶0。

YUV 采样

色度通道的采样率可以低于亮度通道,而不会显著降低感知质量。

4:4:4 表示完全取样。
4:2:2 表示2:1的水平取样,垂直完全采样。
4:2:0 表示2:1的水平取样,垂直2:1采样。
4:1:1 表示4:1的水平取样,垂直完全采样。

最常用Y:UV记录的比重通常1:1或2:1,Video是以YUV4:2:0的方式记录,也就是我们俗称的I420,YUV4:2:0并不是说只有U(即Cb),V(即Cr)一定为0,而是指U:V互相援引,时见时隐,也就是说对于每一个行,只有一个U或者V分量,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。至于其他常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。

为了方便举例说明,这里使用ffmpeg生成一个320x320分辨率的yuvj444p

# 用ffmpeg testsrc 生成一个完全取样的的YUV文件 yuvj444p
ffmpeg  -f lavfi -i testsrc -frames 10 -pix_fmt yuvj444p -s 320x320 yuvj444p_320x320.yuv
# 基于yuvj444p转换成422、420、411等
ffmpeg -pix_fmt yuvj444p -s 320x320 -i yuvj444p_320x320.yuv -pix_fmt yuvj420p yuvj420p_320x320.yuv
ffmpeg -pix_fmt yuvj444p -s 320x320 -i yuvj444p_320x320.yuv -pix_fmt yuv422p yuv422p_320x320.yuv
ffmpeg -pix_fmt yuvj444p -s 320x320 -i yuvj444p_320x320.yuv -pix_fmt yuvj411p yuvj411p_320x320.yuv

图像效果如下图所示
I444

YUV 4:4:4

完全取样,每个像素都有独立的Y/U/V值
YUV444
为了方便对比,我们挑画面下方横条渐变色块6x5个像素放大40倍,看像素的YUV值(其它采样也取相同位置)。
从如下图所示,可以看出相邻的像素点的Y/U/V值不相等也可以看出每个像素都有独立的U/V值
I444

YUV 4:2:2

每两个Y共用一对U/V值
YUV422
422采样,水平方向每两个像素共用一对U/V值,下如图绿色框(U channel)和蓝色框(V channel)标记的一个框在内存中只有一个值。
I422

YUV 4:2:0

每四个Y共用一对U/V值
YUV420
420采样,因为是相邻的4个像素共用一对U/V,所以会出现如下图所示,每四个相邻的像素就出现4个相同的UV值。
I420

YUV 4:1:1

与YUV 4:2:0类似,都是四个每四个Y共用一对U/V值,区别是4:1:1是水平方向的4个Y共享一对U/V,如下图所示,第1-4个Y使用同一对U/V值,第5-8个Y使用同一对U/V值,依次类推。。。
YUV411
这里就不截图举例了,由于411采样的不太常用的以致于一般工具都不支持播放,有了422的例子其实也好更多,411相当于在422的基础上再在水平方向下采样,即水平方向每连续4个像素共用一对UV。

planar format

Packed (or Interleaved)

将YUV三个分量的素数值放在同一个阵列中,存储为单个阵列宏像素
将每个像素点的Y/U/V连续交叉存储
以UYVY、YUYV为例,由两个像素的Y/U/V组成一个宏像素,依次排列

  1. UYVY

U0Y0V0Y1 U2Y2V2Y3 U4Y4V4Y5 U6Y6V6Y7 …
UYVY

  1. YUYV

Y0U0Y1V0 Y2U2Y3V2 Y4U4Y5V4 Y6U6Y7V6 …
YUYV

Planar

每个分量存储为单独的数组,最终图像是三个单独平面的整合
以I420为例Y/U/V排列如下:

width: 图像分辨率的宽
height: 分辨率高
n = width * height
m = width * height / 4
Y0Y1Y2Y3Y4Y5…Yn U0U1U2U3…Um V0V1V2V3…Vm

I420

Semi-Planar

介于Pakced和Planar之间,即Y分量为一个阵列,UV交叉存储
NV12

width: 图像分辨率的宽
height: 分辨率高
n = width * height
m = width * height / 4
Y0Y1Y2Y3Y4Y5…Yn U0V0U1V1U2V2U3V3…UmVm
NV12
Note:
格式的名称以“ p”结尾的一般都是planar格式,如在ffmpeg 中的yuvj420p格式
格式的名称以“ sp”结尾的一般都是semi-planar格式, 如

关系图

如下图,树的第四层只是列举部分并非全部,理论上树的第4层可以通过YUV的排列、位深、色彩范围(full range和limited range)等*组合出来非常多的格式。

YUV
YUV444
YUV422
YUV420
YUV411
yuv444 Planar
yuv444 Semi-Planar
yuv444 Packed
yuv422 Planar
yuv422 Semi-Planar
yuv422 Packed
yuv420 Planar
yuv420 Semi-Planar
yuv420 Packed
yuv411 Planar
yuv411 Semi-Planar
yuv411 Packed
I444
NV24
NV42
AYUV
I422
NV16
NV61
YUYV
UYVY
I420
YV12
I010
NV12
NV21
P010
yuv410p
NV11
Y41P