解释从文件中读取的 JPEG 色度子采样

Interpreting JPEG Chroma Subsampling read from file

我想找出图片是由哪个 MCU(8x8、16x8 和 16x16)制成的。为此,我解析存储色度子采样因子的帧开始 (SOFn) 标记。 我找到了以下内容:

Number of Img components = 3
Component[1]: ID=0x01, Samp Fac=0x22 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)
Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cb)
Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cr)

我对如何解释感到困惑。阅读 this 我开始相信 1x1 代表 4:4:4 采样,因此导致 8x8 像素 MCU,2x1 代表 4:2:2 -> 16x8 像素 MCU,2x2 代表 4:2:0 - > 16x16 像素单片机。

每个采样率都决定了组件如何存储在熵编码数据中,从而导致 MCU。但是现在每个组件(Y、Cb、Cr)都有自己的子采样率。

如何解释我从 JPEG 标记读取的日期以判断整个图像使用了哪个 MCU?

在 JPEG 中,不同的组件通常以不同的方式采样。这是因为人眼对亮度的变化比对颜色(色度)的变化更敏感。

在您的示例中,亮度以全频率采样(对于 JPEG 总是如此),而两个色度分量都以 2x2 二次采样(如果您愿意,也可以在水平和垂直方向进行二次采样)。这意味着对于每个色度样本,有 4 个亮度样本。

类似于(其中 C = Cb,c = Cr):

YCcY  YCcY...
Y  Y  Y  Y... 
YCcY  YCcY...
Y  Y  Y  Y... 
.  .  .  .
.  .  .  .

(这些是像素,样本可能在流中存储为 YYYYCcYYYYCc...

那么,您的问题是:所有组件中最大的子采样因子将决定 MCU 的大小。在你的情况下 16x16.