Encoding JPEG SOF0子采样组件

Encoding JPEG SOF0子采样组件,encoding,jpeg,Encoding,Jpeg,使用JPEG snoop对图像进行4:2:2:CBCR 我在SOF0中看到了这一点: Component[1]: ID=0x01, Samp Fac=0x21 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y) Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 1), Quant Tbl Sel=0x01 (Chrom: Cb) Component[3]: ID=0x03, Samp Fac=0x11 (Su

使用JPEG snoop对图像进行4:2:2:CBCR 我在SOF0中看到了这一点:

Component[1]: ID=0x01, Samp Fac=0x21 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)
Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 1), Quant Tbl Sel=0x01 (Chrom: Cb)
Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 2 x 1), Quant Tbl Sel=0x01 (Chrom: Cr)
现在,值0x21和0x11来自哪里

我知道采样因子是这样存储的:1字节位0-3垂直,4-7水平。 但我不知道0x11与2x1和0x21与1x1之间有什么关系。 我希望看到Y组件为0x11,而不是0x21。 不确定如何得到0x21作为结果


有人能解释一下这些值以及如何计算它们吗?例如,4:2:2水平16x8?

JPEG Do it bassackwarks。这些值表示相对采样率。 最高采样率为Y 2。Cb和Cr的采样率为1。 使用最高采样率规格化为像素:

2Y=Cb=Cr。 Y=1/2 Cb=1/2 Cr

对于该方向上的每个Y像素值,使用1/2 a Cb和Cr像素值

根据JPEG标准,你甚至可以得到类似的东西

4Y=3Cb=1Cr Y=3/4Cb=1/4铬

3Y=2Cb=1Cr Y=2/3Cb=1/3Cr

但大多数解码器无法处理这个问题

像4:4:4、4:2:2和4:4:0这样的标签只是:不在JPEG标准中的标签。坦率地说,我甚至不知道这些术语是从哪里来的,它们根本不是直观的,从来没有零采样

让我用另一种方式来看待这个问题。但首先,您必须记住JPEG标准本身是不可实现的。对图像进行编码所必需的东西还没有定义,标准中充斥着不必要的东西

如果一个扫描在所有三个分量之间交错,它将以最小编码单位MCU进行编码。MCU由8x8编码块组成

采样率指定MCU中8x8块的数量

Y为2x1,Cb为1x1,Cr为1x1。这意味着MCU中总共有4个8x8块。虽然我在上面提到了其他理论值,但MCU中的最大块数是10。因此,4x4+3x3+2x2是不可能的

JPEG标准没有说明如何将这些块映射到图像中的像素。我们通常使用最大值,并说波形为2x1区域或16x8像素

但在标准下,各种各样的怪异都是可能的,例如:

Y=2x1,Cb=1x2,Cr=1x1

这可能意味着MCU映射到16x16像素块,但解码器可能不支持这一点。或者,它可能意味着MCA映射到16x8像素块,并且Cb分量在8方向上具有更多值

最后一种可行的方法是使用Y分量作为参考点。假设Y在X和Y方向上的采样率始终为1或2,可能为4,并定义Cb和Cr上的采样率为1或2。Y分量始终定义图像中的像素

这些将是现实的可能性:

 Y    Cb   Cr
 1x1, 1x1, 1x1
 2x2, 1x1, 1x1
 4x4, 1x1, 1x1
 2x1, 1x1, 1x1
 1x2, 1x1, 1x1

谢谢你的详细回答。