JPEG SOF0子采样组件

时间:2017-04-05 08:09:37

标签: encoding jpeg

使用JPEG snoop获取图像4:2:2 hor(YYCbCr) 我在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来自哪里?

我知道采样因子的存储方式如下:(1byte)(位0-3垂直,4-7水平。) 但我不知道0x11如何与2x1和0x21与1x1相关。 我希望Y组件看到0x11而不是0x21。 (不确定如何得到0x21)。

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

1 个答案:

答案 0 :(得分:1)

JPEG就是这样做的。值表示相对抽样费率。 最高采样率是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 / 4Cr

3Y = 2CB =林前 Y = 2 /板3Cb = 1 / 3CR

但是大多数解码器无法解决这个问题。

标签如" 4:4:4"," 4:2:2"和" 4:4:0"就是这样:不符合JPEG标准的标签。坦率地说,我甚至不知道这些术语来自哪里,而且根本不直观(从来没有零采样)。

让我再添一个看待这个问题的方法。但首先,您必须记住JPEG标准本身是不可实现的。编码图像所需的东西是未定义的,标准是不必要的东西。

如果扫描是交错的(所有三个组件),则以最小编码单元(MCU)进行编码。 MCU由8x8编码块组成。

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

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

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

但是在标准下可能存在各种奇怪现象,例如:

Y = 2×1,Cb = 1×2且Cr = 1×1

这可能意味着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