天天看点

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

【实验一】rgb与yuv色彩空间的互相转换

一、实验原理

1、rgb与yuv的互相转换公式

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

为了使色差信号的动态范围控制在 [-0.5,0.5] 之间,需要进行归一化,对色差信号引入压缩系数。

2、量化和码电平分配

【Y】

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

【CB】

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

【CR】

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

在进行8 bit量化时,Y的动态范围为16—235,U、V的动态范围为16—240,超出动态范围的部分作为信号超越动态范围的保护带。

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换
【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换
【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

二、实验过程

将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

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换
【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

【转换的YUV】大小为96KB

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换

【转换的RGB】大小为192KB

【实验一】rgb与yuv色彩空间的互相转换【实验一】rgb与yuv色彩空间的互相转换