Image processing 将YUV420(NV12)上采样到YUV422的正确方法是什么?

Image processing 将YUV420(NV12)上采样到YUV422的正确方法是什么?,image-processing,yuv,Image Processing,Yuv,我有一个YUV420图像(NV12图像,但这不重要)。我想把它的样本增加到YUV422 问题是我无法找到需要为YUV420中的UV样本提供的正确权重,以计算YUV422图像中的UV x -> Y 0 -> UV YUV420 YUV422 x x x x x x x x o o o o x x x x x x x x to o o x x x x x x x x o o

我有一个YUV420图像(NV12图像,但这不重要)。我想把它的样本增加到YUV422

问题是我无法找到需要为YUV420中的UV样本提供的正确权重,以计算YUV422图像中的UV

x -> Y 
0 -> UV

YUV420       YUV422
x x x x      x x x x
o   o        o   o  
x x x x      x x x x
         to  o   o 
x x x x      x x x x
o   o        o   o
x x x x      x x x x
             o   o 
现在我只是重复UV样本,但这不是正确的方法。所以,问题是,有没有标准的方法来进行色度上采样?有人能告诉我这个理论吗

注意:我想实现这一点,但对能够实现这一点的工具不感兴趣。有兴趣的话,你能告诉我这些工具的源代码,它们是根据某种标准来实现的(假设有一个:D)


谢谢

只需将
U
V
平面的每个字节加倍即可。或者可以取连续字节之间的平均值


您还可以尝试在libswscale(来自ffmpeg)中逐步使用调试器来查看它们的功能。如果对您来说很困难或者您不知道如何做到这一点,您可以拍摄一些图片并将其转换为YUV 420,然后将YUV420转换为YUV422,然后从源U帧打印几个字节,从结果U帧打印几个字节,然后查看完成了哪种计算。最有可能的是,简单地加倍,你会得到视觉上可接受的结果。

你基本上是在问,如果我有一个由N个(其中N=高度/2)[垂直]样本组成的数组(碰巧是U-或者V),我如何通过正确的插值将其转换为一个由N*2个样本组成的数组?答案是肯定的。由于你的问题的范围,我将忽略横向方面,但这也应该很容易理解

首先:色度定位。假设我有一个N*2y[垂直]样本的数组,而U(或V)大小的数组只有N。很明显,色度子采样意味着每2y样本,只有一个U(或V)样本[垂直]。但它没有告诉你U/V样本的位置。在yuv422[垂直]中,很明显,每个U(或V)的垂直位置与Y样本的垂直位置完全对齐。但是对于二次抽样的yuv420?第一个U值的垂直位置的中心是否与第一个Y值的垂直位置对齐[“顶部”]?或者正好在第一个和第二个Y样本之间[“中间”]?或者(这很奇怪,但理论上可能发生)第二个Y样本的中心[“底部”]


Y1 U您的图像也是隔行扫描的吗?不,它不是隔行扫描的
Y1 U <- top    Y1                Y1
.              .  U <- center    .
Y2             Y2                Y2 U <- bottom
Y1 U1in <- top               Y1 U1out=U1in
.                            .
Y2                           Y2 U2out=U1in?
.                 becomes    .
Y3 U2in                      Y3 U3out=U2in
.                            .
Y4                           Y4 U4out=U2in?
Y1                              Y1 U1out=U1in
.  U1in <- center               .
Y2                              Y2 U2out=U1in
.                    becomes    .
Y3                              Y3 U3out=U2in
.  U2in                         .
Y4                              Y4 U4out=U2in
Y1 U1in <- top               Y1 U1out=U1in
.                            .
Y2                           Y2 U2out=(U1in+U2in)/2
.                 becomes    .
Y3 U2in                      Y3 U3out=U2in
.                            .
Y4                           Y4 U4out=(U2in+U3in)/2
Y1                              Y1 U1out=U1in
.  U1in <- center               .
Y2                              Y2 U2out=(U1in*3+U2in)/4
.                    becomes    .
Y3                              Y3 U3out=(U1in+U2in*3)/4
.  U2in                         .
Y4                              Y4 U4out=(U2in*3+U3in)/4