Compression 如何将YUV422(子采样)转换为YUV?
我正在为每一帧使用JPEG压缩技术对视频编解码器进行编码。在此之前,我已经对YUV、DCT和量化DCT(编码和解码)进行了编码。我已经编写了YUV422编码,但我不知道如何进行反向(解码) 为了计算每个像素的YUV,我使用了以下等式: 编码:Compression 如何将YUV422(子采样)转换为YUV?,compression,yuv,image-compression,dct,Compression,Yuv,Image Compression,Dct,我正在为每一帧使用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
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个像素
例:
为了简单起见,我将采用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像素值。有人能帮我吗?我真的迷路了。非常感谢您的帮助。这是4:2:0和4:2:2(通常)的像素放置方式 这是在4:2:2和4:2:0之间插值色度的正确方法(亮度已处于正确的分辨率) 代码可以从 下面的代码来自文件
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++;
}
}
}
/*垂直滤波器和2:1子采样*/
静态无效CONV422TO 420(src、dst)
无符号字符*src,*dst;
{
int w,i,j,jm6,jm5,jm4,jm3,jm2,jm1;
int jp1、jp2、jp3、jp4、jp5、jp6;
w=宽度>>1;
if(程序帧)
{
/*帧内*/
对于(i=0;i)而言,指向MPEG代码的链接不幸被破坏。但很好,您发布了此剪贴。