首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将YUV422 (子采样)转换为YUV?

如何将YUV422 (子采样)转换为YUV?
EN

Stack Overflow用户
提问于 2013-07-03 18:11:35
回答 1查看 6K关注 0票数 4

我正在使用JPEG压缩技术为每一帧编码一个视频编解码器。到目前为止,我已经编码了YUV,DCT和量化的DCT (编码和解码)。我也已经编写了YUV422编码,但我不知道如何进行反转(解码)。

为了计算每个像素的YUV,我使用了以下公式:

编码:

代码语言:javascript
复制
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.1687 * R - 0.4187 * G + 0.5 * B + 128
V = 0.5 * R - 0.4187 * G - 0.0813 * B + 128

解码:

代码语言:javascript
复制
R = Y + 1.402 * (V - 128)
G = Y - 0.34414 * (U - 128) - 0.71414 * (V - 128)
B = Y + 1.772 * (U - 128)

这个方程做了完美的工作。

现在,为了进行二次采样编码,我将我的图像用YUV编码,然后计算两个相邻像素的和,并将结果除以2。结果是为这两个像素设置的。

例如:

为了简单起见,我将采用0到255之间的像素值(不使用RGB分量)。

下面是两个相同结果的例子。

代码语言:javascript
复制
Pixel_1 = 15, Pixel_2 = 5 -> (Pixel_1 + Pixel_2) / 2 = 10

Pixel_3 = 10, Pixel_4 = 10 -> (Pixel_3 + Pixel_4) / 2 = 10

如果我将这个等式应用于YUV图像的所有像素,我将得到一个新图像,但这次是以YUV422子采样编码的。

所以我想知道如何从YUV422图像中恢复YUV图像。我上面的例子表明,不可能恢复原始的YUV图像,因为有很多组合导致相同的结果(这里是10)。然而,我认为有一种方法可以获得或取几个相同的原始YUV像素值。有人能帮帮我吗?我真的迷路了。非常感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2013-07-10 04:52:06

这就是4:2:0和4:2:2像素的放置方式(通常)

这是在4:2:2和4:2:0之间插入色度的正确方法(亮度已经处于正确的分辨率)

代码可以从文件readpic.c下载到下面的http://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html代码

代码语言:javascript
复制
/* vertical filter and 2:1 subsampling */
static void conv422to420(src,dst)
unsigned char *src, *dst;
{
  int w, i, j, jm6, jm5, jm4, jm3, jm2, jm1;
  int jp1, jp2, jp3, jp4, jp5, jp6;

  w = width>>1;

  if (prog_frame)
  {
    /* intra frame */
    for (i=0; i<w; i++)
    {
      for (j=0; j<height; j+=2)
      {
        jm5 = (j<5) ? 0 : j-5;
        jm4 = (j<4) ? 0 : j-4;
        jm3 = (j<3) ? 0 : j-3;
        jm2 = (j<2) ? 0 : j-2;
        jm1 = (j<1) ? 0 : j-1;
        jp1 = (j<height-1) ? j+1 : height-1;
        jp2 = (j<height-2) ? j+2 : height-1;
        jp3 = (j<height-3) ? j+3 : height-1;
        jp4 = (j<height-4) ? j+4 : height-1;
        jp5 = (j<height-5) ? j+5 : height-1;
        jp6 = (j<height-5) ? j+6 : height-1;

        /* FIR filter with 0.5 sample interval phase shift */
        dst[w*(j>>1)] = clp[(int)(228*(src[w*j]+src[w*jp1])
                             +70*(src[w*jm1]+src[w*jp2])
                             -37*(src[w*jm2]+src[w*jp3])
                             -21*(src[w*jm3]+src[w*jp4])
                             +11*(src[w*jm4]+src[w*jp5])
                             + 5*(src[w*jm5]+src[w*jp6])+256)>>9];
      }
      src++;
      dst++;
    }
  }
}

希望能有所帮助。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17445230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档