2017-04-05 117 views
0

与JPEG探听用于图像的4:2:2 HOR(YYCbCr) 我看到这在SOF0:JPEG 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) 

现在哪里的值0×21和0×11来的?我知道采样因子是这样存储的:(1byte)(位0-3垂直,4-7水平。) 但我看不出0x11与2x1和0x21到1x1的关系。 我期望看到0x11的Y分量,而不是0x21。 (不知道你如何得到0x21的结果)。

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

回答

1

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

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

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

你甚至可以根据JPEG标准来做类似的事情。

4Y =板3Cb =林前 Y = 3/4CB = 1/4铬

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标准没有说明这些块如何映射到图像中的像素。我们通常使用最大的值,并说波2×1区或16×8像素。

但是各种古怪的是可能的标准下,如:

Y = 2×1,CB = 1×2和Cr = 1x1的

这可能意味着一个MCU映射到16×16像素块但你的解码器可能不会支持这个。或者,它可能意味着MCA映射到16x8像素块,并且Cb组件在8方向上具有更多值。

查看这个(最实用的方法)的最后一种方法是使用Y分量作为参考点。假设Y总是有1或2(也许是4)作为X和Y方向上的采样率,并且定义Cb和Cr上的比率将是1(也许是2).Y分量总是定义图像中的像素。然后

这将是现实的可能性:

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

感谢这个伟大的详细的解答。 – juFo