JPEG SOF0 子采样组件

JPEG SOF0 subsampling components

使用 JPEG 侦听图像 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) (bit 0-3 vertical., 4-7 horizo​​ntal.) 但我看不出 0x11 与 2x1 以及 0x21 与 1x1 有何关系。 我希望看到 Y 分量为 0x11 而不是 0x21。 (不确定结果如何得到 0x21)。

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

JPEG 做到了 bassackwarks。这些值表示相对采样率。 Y (2) 的采样率最高。 Cb 和 Cr 的采样率为 1。 使用最高采样率归一化为像素:

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

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

您甚至可以根据 JPEG 标准获得类似的东西。

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

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

但大多数解码器无法处理。

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

让我添加另一种看待这个问题的方式。但首先,您必须记住 JPEG 标准本身是不可实施的。编码图像所需的东西未定义,标准中充斥着不必要的东西。

如果扫描是交织的(所有三个分量),它会以最小编码单元 (MCU) 进行编码。一个 MCU 由 8x8 编码块组成。

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

你有 2x1 的 Y + 1x1 的 Cb 和 1x1 的 Cr。这意味着一个 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