【问题标题】:How to convert YUV422 (sub sampling) to YUV?如何将 YUV422(子采样)转换为 YUV?
【发布时间】:2013-06-30 23:31:21
【问题描述】:

我正在为每一帧使用 JPEG 压缩技术对视频编解码器进行编码。到目前为止,我已经对 YUV、DCT 和量化 DCT(编码和解码)进行了编码。我也已经编码了 YUV422 编码,但我不明白如何进行逆向(解码)。

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

编码:

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

解码:

R = Y + 1.402 * (V - 128)
G = Y - 0.34414 * (U - 128) - 0.71414 * (V - 128)
B = Y + 1.772 * (U - 128)

这个方程做得很完美。

现在要进行子采样编码,我将图像编码为 YUV,然后计算 2 个相邻像素的总和,然后将结果除以 2。为 2 个像素设置结果。

例如:

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

就在下面:两个结果相同的例子。

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 像素值。有人可以帮助我吗?我真的迷路了。非常感谢您的帮助。

【问题讨论】:

    标签: compression yuv image-compression dct


    【解决方案1】:

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

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

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

    /* 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++;
        }
      }
    }
    

    希望对你有帮助。

    【讨论】:

    • 不幸的是,MPEG 代码的链接已损坏。但是很好,你把这个剪掉了。
    猜你喜欢
    • 2011-10-23
    • 2013-02-06
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多