YUV数据

YUV数据

Y:亮度(Luminance) 即灰度值
U和V:色度(chrominance)即饱和度
没有UV信息,一样可以显示完整的图像,不过是黑白的。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

采样方式

YUV码流有多种不同的格式,要分析YUV码流,就必须搞清楚你面对的到底是哪一种格式,并且必须搞清楚这种格式的YUV采样和分布情况。YUV采样有三种方式:YUV4:4:4,YUV4:2:2,YUV4:2:0 如下图所示,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
这里写图片描述
具体码流格式详解:http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

YUV转RGB

如何根据其采样格式来从码流中还原每个像素点的YUV值,进而通过转换公式提取出每个像素点的RGB值。
// 转换公式
R = Y + 1.4075*(V-128)
G = Y - 0.3455*(U-128) - 0.7169*(V-128)
B = Y + 1.779*(U-128)
matlab 读写YUV文件:
https://blog.youkuaiyun.com/u012868357/article/details/72780000

<think>好的,我现在需要处理用户关于YUV数据格式转换和存储的问题。首先,我得回忆一下YUV的基本概念。YUV是一种颜色编码系统,常用于视频处理和图像压缩中。与RGB不同,YUV将亮度(Y)和色度(U、V)分开处理,这样有利于压缩,因为人眼对亮度更敏感,对色度的变化不那么敏感。 用户提到想了解YUV的格式转换和存储,所以我应该先解释YUV的常见采样格式,比如4:4:4、4:2:2、4:2:0等。这些比例代表色度信息的采样方式。例如,4:2:0意味着在水平和垂直方向上色度分量都是亮度的一半,所以每个色度分量占用的数据量更少。这可能涉及到下采样和上采样的过程,比如从4:2:2转到4:2:0需要下采样,而反过来可能需要插值补足数据。 接下来是存储方式。YUV数据可以按照不同的平面排列,比如YUV420 Planar(I420)和YUV420 Semi-Planar(NV12/NV21)。I420将Y、U、V分别存储在不同的平面,而NV12则是Y平面和交错的UV平面。用户可能还需要了解这些格式之间的转换方法,比如如何调整UV分量的排列顺序或进行平面分离。 然后要考虑转换的具体步骤,比如下采样时如何平均或抽取色度数据,上采样时如何复制或插值。例如,引用[2]中提到4:2:2转4:2:0时对UV隔行抽样,而反向转换时则隔行拷贝补足。这部分需要详细说明,可能涉及代码示例,比如如何用Python处理这些转换。 此外,用户可能对YUV转RGB感兴趣,因为这是常见的应用场景。转换公式需要正确应用,比如使用矩阵乘法将YUV值转换为RGB,同时注意取值范围和溢出处理。引用[2]提到了NV12转RGB,这可能涉及到先处理Y平面,再处理UV平面,并将它们合并成RGB像素。 还需要注意存储结构,比如YUV数据的排列是否连续,不同格式的内存布局如何影响处理方式。例如,YUV420 Planar需要分别处理三个平面,而NV12则是两个平面,其中UV交错存储。 最后,要确保回答结构清晰,分点解释,并包含相关示例和引用。同时,生成的问题需要覆盖用户可能进一步感兴趣的方面,比如性能优化、应用场景和具体工具的使用。</think>### YUV数据格式转换与存储详解 #### 一、YUV基础概念 YUV是一种颜色编码系统,将亮度分量$Y$与色度分量$U/V$分离,相比RGB格式更便于压缩和视频处理[^1]。其核心特点为: 1. **亮度优先**:人眼对亮度敏感,$Y$分量保留全分辨率; 2. **色度下采样**:$U/V$分量通过4:2:2、4:2:0等采样方式降低数据量; 3. **存储分离**:$Y$、$U$、$V$分量可能存储在不同平面。 #### 二、主要采样格式对比 | 格式 | 亮度采样 | 色度采样 | 总数据(相对RGB) | |---------|----------|----------|-------------------| | 4:4:4 | 全采样 | 全采样 | 100% | | 4:2:2 | 全采样 | 水平半采样 | 66% | | 4:2:0 | 全采样 | 行/列半采样 | 50% | #### 三、存储格式类型 1. **Planar(平面式)** - I420(YUV420P):按$Y$→$U$→$V$顺序存储三个独立平面 - 示例内存布局: ``` YYYYYYYY YYYYYYYY UUUU VVVV ``` 2. **Semi-Planar(半平面式)** - NV12:$Y$平面 + 交错的$UV$平面 - 示例内存布局: ``` YYYYYYYY YYYYYYYY UVUVUVUV ``` #### 四、格式转换核心方法 1. **4:2:2 → 4:2:0转换** - 步骤: 1. 保持$Y$分量不变 2. 对$U/V$分量做垂直下采样(每两行取一行) - 代码片段(Python示例): ```python def yuv422_to_420(u_422, v_422): u_420 = u_422[::2] # 隔行采样 v_420 = v_422[::2] return u_420, v_420 ``` 2. **4:2:0 → 4:2:2转换** - 步骤: 1. 保持$Y$分量不变 2. 对$U/V$分量做行拷贝补足 - 示例: ```python def yuv420_to_422(u_420, v_420): u_422 = [] for line in u_420: u_422.extend([line, line]) # 复制当前行 v_422 = [line for line in v_420 for _ in (0,1)] return u_422, v_422 ``` #### 五、NV12转RGB实践 典型转换公式为: $$ \begin{cases} R = Y + 1.402(V-128) \\ G = Y - 0.344(U-128) - 0.714(V-128) \\ B = Y + 1.772(U-128) \end{cases} $$ 代码实现要点: ```python def nv12_to_rgb(y_plane, uv_plane, width, height): rgb = np.zeros((height, width, 3), dtype=np.uint8) uv = uv_plane.reshape(height//2, width//2, 2) for y in range(height): for x in range(width): # 计算UV坐标 uv_x = x // 2 uv_y = y // 2 U = uv[uv_y, uv_x, 0] V = uv[uv_y, uv_x, 1] # 应用转换公式... return rgb ``` #### 六、存储优化技巧 1. **内存对齐**:按16/32字节对齐可提升SIMD指令效率 2. **分块处理**:按64x64像素块处理减少缓存缺失 3. **零拷贝转换**:通过指针操作直接访问原始数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值