【实验一】rgb与yuv色彩空间的互相转换
一、实验原理
1、rgb与yuv的互相转换公式
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4kTNxQTNwEjM0IjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
为了使色差信号的动态范围控制在 [-0.5,0.5] 之间,需要进行归一化,对色差信号引入压缩系数。
2、量化和码电平分配
【Y】
【CB】
【CR】
在进行8 bit量化时,Y的动态范围为16—235,U、V的动态范围为16—240,超出动态范围的部分作为信号超越动态范围的保护带。
二、实验过程
将RGB转化成YUV时,由于YUV取样为4:2:0(即U、V在水平和垂直方向上均只有Y的一半),因此要下采样。
以256x256RGB转YUV为例,RGB文件中R、G、B各有256x256个样值,每个样值8bit量化。根据上述实验原理中RGB与YUV的互相转换公式,暂时得到的Y、U、V仍各是256x256个样值。而根据YUV4:2:0取样格式,我们应想办法得到Y是256x256个样值,U和V是128x128个样值。
// RGB2YUV的下采样从4:4:4到4:2:0
//uBuf444、vBuf444是还未下采样之前的缓冲区
for (int i = 0; i < h; i += 2)
{
for (int j = 0; j < w; j += 2)
{
uBuf[i / 2 * w / 2 + j / 2] = uBuf444[i * w + j];
vBuf[i / 2 * w / 2 + j / 2] = vBuf444[i * w + j];
}
同理从YUV转换到RGB要上采样
// YUV2RGB的上采样从4:2:0到4:4:4
for (int i = 0; i < h / 2; i++)
{
for (int j = 0; j < w / 2; j++)
{
uBuf444[2 * i * w + 2 * j] = uBuf[i * w / 2 + j];
uBuf444[2 * i * w + 2 * j + 1] = uBuf[i * w / 2 + j];
uBuf444[2 * i * w + 2 * j + w] = uBuf[i * w / 2 + j];
uBuf444[2 * i * w + 2 * j + w + 1] = uBuf[i * w / 2 + j];
vBuf444[2 * i * w + 2 * j] = vBuf[i * w / 2 + j];
vBuf444[2 * i * w + 2 * j + 1] = vBuf[i * w / 2 + j];
vBuf444[2 * i * w + 2 * j + w] = vBuf[i * w / 2 + j];
vBuf444[2 * i * w + 2 * j + w + 1] = vBuf[i * w / 2 + j];
}
}
三、实验结果
【RGB原图】大小为192KB
【转换的YUV】大小为96KB
【转换的RGB】大小为192KB