YUV格式分析,通过分辨率及YUV格式计算图片大小

当谈论YUV格式时,一般是指一种色彩编码系统,常用于数字视频。它将图像的亮度(Y)和色度(U和V)分开编码,以便有效地压缩数据而不损失太多图像质量。这种编码方式在视频压缩和传输中广泛应用,特别是在广播、视频流媒体和视频压缩标准中。

这里是对YUV格式的简要分析:

  1. Y分量(亮度):Y分量表示图像的亮度信息。它是图像中的灰度信息,决定了图像的明暗程度。Y分量在颜色表示中占有重要地位,因为人眼对亮度的感知更为敏感。

  2. U和V分量(色度):U和V分量表示图像的色彩信息。它们捕获了图像中的色彩差异。这两个分量一起描述了图像中的色调和饱和度。由于人眼对色彩的感知相对较低,因此U和V分量的采样率通常比Y分量低,以实现更高效的压缩。

  3. 取样率:YUV格式通常使用不同的取样率来表示每个分量的采样率。例如,常见的YUV格式之一是YUV420,其中Y分量的取样率最高,而U和V分量的取样率较低。这意味着对于相同的图像分辨率,U和V分量的数据量比Y分量更少,从而实现了数据压缩。

  4. 应用:YUV格式在数字视频编码中得到广泛应用,例如MPEG标准系列、H.264、H.265等。它们被用于数字视频压缩、视频传输和视频处理等各个领域。

利用 YUV 色彩编码模型可以降低图片数据的内存占用,提高数据处理效率,另外,YUV 编码模型的图像数据一般不能直接用于显示,还需要将其转换为 RGB(RGBA) 编码模型,才能够正常显示图像。

常见的几种采样方式

 (可以想象空心白圈为一对UV,黑色实心圈为Y)

  1. YUV444:每个像素的Y、U和V分量都有完整的采样,即每个分量都有与图像分辨率相同的采样率。这意味着每个像素的亮度和色度信息都是完整的,没有丢失任何细节。虽然质量高,但数据量也相对较大。(每像素占用 (Y + U + V = 8 + 8 + 8 = 24bits)3 字节;)

  2. YUV422:Y分量的采样率与图像分辨率相同,但U和V分量的采样率每行各半,即对于每两个相邻像素,只有一个U和一个V样本。这种采样方式可以实现一定程度的数据压缩,同时保留相对较高的图像质量,适用于很多视频传输和存储场景。(每像素占用 (Y + 0.5U + 0.5V = 8 + 4 + 4 = 16bits)2 字节;

  3. YUV420:Y分量的采样率与图像分辨率相同,但U和V分量的采样率每行和每列各半,即对于每四个相邻像素,只有一个U和一个V样本。这种采样方式在视频压缩中应用广泛,因为它能够显著减少数据量,同时在视觉上的影响相对较小。(每像素占用 (Y + 0.25U + 0.25V = 8 + 2 + 2 = 12bits)1.5 字节;

我们举个例子来算一算一张图片的大小,以一张1280*720分辨率的图片来计算,采用YUV422格式来计算:

首先我们要知道 1208*780指的是1280列,720行的像素矩阵

法1:
Y 分量:1280 * 720  = 921600 字节
U 分量:1280 * 720 * 0.5 = 460800 字节
V 分量:1280 * 720 * 0.5 = 460800 字节
法2:
共有1280*720个像素点,知道YUV422一个像素点为2字节,1280*780*2=921600+460800*2=1843200字节

综上两种方法算出来的图片大小一样

  • 打包(Packed)格式:每个像素点的 YUV 分量是连续交叉存储的,如 YUYV 、NV21 格式;
  • 平面格式(Planar):YUV 图像数据的三个分量分别存放在不同的矩阵中,这种格式适用于采样,如 YV12、YU12 格式;
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
读取yuv格式的视频的yuv信息,需要以下步骤: 1. 打开视频文件,读取每一帧的yuv数据。 2. 根据视频的分辨率和色彩空间,确定每一帧yuv数据的大小和格式。 3. 对每一帧的yuv数据进行分析和处理,将像素值转换为亮度和色度分量。 4. 将处理后的yuv数据保存,或者进行其他操作,例如图像的压缩和编码等。 下面是一个Python的示例代码,用于读取yuv格式的视频的yuv信息: ``` import numpy as np def read_yuv_file(file_path, width, height): # 根据视频的分辨率和色彩空间计算yuv数据的大小 frame_size = int(width * height * 3 / 2) # 打开yuv视频文件 with open(file_path, "rb") as f: # 读取每一帧的yuv数据 while True: # 读取yuv一帧数据 yuv_frame = f.read(frame_size) # 如果读取到数据为空,则退出循环 if not yuv_frame: break # 将yuv数据转换成numpy数组 yuv_np = np.frombuffer(yuv_frame, dtype=np.uint8) # 提取亮度分量Y,色度分量U,V y = yuv_np[:width*height].reshape((height, width)) u = yuv_np[width*height:width*height + width//2*height//2].reshape((height//2, width//2)) v = yuv_np[width*height + width//2*height//2:].reshape((height//2, width//2)) # 返回每一帧的YUV数据 yield y, u, v ``` 示例代码中使用了numpy库来实现对yuv数据的处理和转换,代码读取yuv一帧的数据后,将其转换成numpy数组,然后提取亮度分量Y,色度分量U,V,最终返回每一帧的yuv数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值