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 horizontal.)
但我看不出 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
使用 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 horizontal.) 但我看不出 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