YUV 4:20:0 与 RGB 转换说明
### YUV 4:2:0 与 RGB 转换说明 #### 一、YUV 4:2:0 格式概述 **YUV 4:2:0** 是一种广泛应用于视频处理和存储的颜色空间标准。在这个标准中,“Y”代表亮度或灰度值,“U”和“V”则分别代表两个色度分量,通常也称为色差信号。“4:2:0”的命名方式指出了这种颜色空间中亮度和色度信号的采样比率。具体来说: - **4** 表示每个像素都有一个亮度(Y)样本。 - **2** 和 **0** 表示每四个相邻像素共用一个U和一个V样本,这实际上是一种2:1的水平和垂直下采样。 #### 二、YUV 4:2:0 的布局和存储 对于YUV 4:2:0 格式,常见的布局有两种:**YUV交错存储** 和 **YUV平面存储**。 - **交错存储**:每个像素的亮度值按顺序存储,之后是所有像素的U分量,最后是所有像素的V分量。 - **平面存储**:首先连续存储所有像素的Y分量,接着是U分量,最后是V分量。其中U和V分量是按照4:2:0的比例下采样得到的。 例如,在6x4像素的图像中(即24个像素),亮度Y会存储24个样本,而U和V各自只存储6个样本,因为每4个像素共享一对UV值。 #### 三、RGB 到 YUV 4:2:0 的转换 **RGB** 是一种基于红、绿、蓝三种原色的色彩模型,它在显示器等设备上非常常见。RGB到YUV 4:2:0的转换涉及几个关键步骤: 1. **RGB到YUV的转换公式**: - Y = (66 * R + 129 * G + 25 * B + 128) >> 8 + 16 - U = (-38 * R - 74 * G + 112 * B + 128) >> 8 + 128 - V = (112 * R - 94 * G - 18 * B + 128) >> 8 + 128 2. **下采样**:将转换后的U和V分量按4:2:0的比例进行下采样,即每4个像素共用一组UV值。 3. **存储**:根据选择的布局(交错或平面),将YUV值存储到相应的数组中。 #### 四、YUV 4:2:0 到 RGB 的转换 从YUV 4:2:0格式转换回RGB,同样遵循一定的公式: - R = 1.166f * (Y - 16) + 1.596f * (V - 128) - G = 1.164f * (Y - 16) - 0.813f * (V - 128) - 0.391f * (U - 128) - B = 1.164f * (Y - 16) + 2.018f * (U - 128) 需要注意的是,这些转换过程中可能会出现数值范围溢出,因此在实际应用中往往还需要对结果进行裁剪,确保颜色值位于0到255之间。 #### 五、实际应用场景 YUV 4:2:0格式因其高效的存储和传输特性而在视频编码领域中得到了广泛应用,特别是在移动设备和互联网视频传输中尤为重要。例如,在Android平台上,相机预览的视频流通常使用的就是YUV 4:2:0格式。 #### 六、代码示例 下面是一个简单的RGB到YUV 4:2:0转换的Java代码示例: ```java public byte[] rgbToYUV420(int[] pixels, int width, int height) { int frameSize = width * height; byte[] yuv = new byte[frameSize * 3 / 2]; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { int yIndex = j * width + i; int uvIndex = frameSize + (j / 2) * width + i / 2; int pixel = pixels[j * width + i]; int r = (pixel & 0xff0000) >> 16; int g = (pixel & 0xff00) >> 8; int b = pixel & 0xff; yuv[yIndex] = (byte) ((66 * r + 129 * g + 25 * b + 128) >> 8 + 16); if (i % 2 == 0) { yuv[uvIndex] = (byte) ((-38 * r - 74 * g + 112 * b + 128) >> 8 + 128); yuv[uvIndex + 1] = (byte) ((112 * r - 94 * g - 18 * b + 128) >> 8 + 128); } } } return yuv; } ``` 此代码实现了RGB到YUV 4:2:0的转换过程,包括亮度和色度分量的计算、下采样以及最终的存储。
剩余6页未读,继续阅读
- 粉丝: 52
- 资源: 31
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助