1

我有一个 512x512 的图像,我试图重新压缩它。这是将图像重新压缩为 jpeg 文件的步骤

    1) convert rgb to YCrCb
    2) perform down sampling on Cr and Cb
    2) convert YCrCb to DCT and Quantized according to chosen Quality
    3) perform Huffman Encoding on Quantized DCT

但是在霍夫曼编码之前,我计算了 DCT 系数的数量,它是 393216。除以 64 告诉我 DCT 块(8x8)的数量将是 6144。

现在我尝试计算像素域的 8x8 块的数量。512/8=64 这给了我 64 个水平块和 64 个垂直块。64 x 64 = 4096 不等于 DCT 块数,而像素数为 512x512 = 262144

我的问题是霍夫曼编码如何神奇地将 393216 系数转换为 262144 像素并获取每个像素值,并计算压缩图像(jpeg)的尺寸(512x512)。

提前谢谢你。:D

4

3 回答 3

2

如果您的图像是在没有颜色子采样的情况下编码的,那么 8x8 系数块与 8x8 颜色分量块的比率将为 1:1。每个 MCU(最小编码单元)将是 8x8 像素并具有 3 个 8x8 系数块。512x512 像素 = 64x64 8x8 块 x 3(Y、Cr 和 Cb 各一个)= 12288 个系数块。

既然你说你对颜色进行了二次采样(我假设在两个方向上),那么现在每个 MCU 将有 6 个 8x8 块。在下图中,最左边的图表显示了没有对颜色进行二次抽样的情况,最右边的图表显示了两个方向的二次抽样。在这种情况下,MCU 尺寸将为 16x16 像素。每个 16x16 像素块将需要 6 个 8x8 系数块来定义它(4 Y、1 Cr、1 Cb)。如果将图像划分为 16x16 MCU,您将拥有 32x32 MCU,每个 MCU 有 6 个 8x8 块 = 6144 个系数块。因此,要回答您的问题,霍夫曼编码不是改变系数数量,而是颜色子采样。在 JPEG 图像中使用颜色子采样产生的部分压缩是利用人类视觉系统的一个特征。

在此处输入图像描述

于 2012-02-23T23:40:57.713 回答
0

霍夫曼编码不会将系数转换为像素或类似的东西。至少不是我想的霍夫曼编码。所有霍夫曼编码所做的,是它需要一个令牌列表,并根据这些令牌的频率用更少的位来表示它们。

一个例子:你有标记 a、b、c 和 d

现在,未压缩的每个令牌都需要 2 位(00、01、10 和 11)。

假设 a=00、b=01、c=10 和 d=11

aabaccda将表示为000001001010110016 位

但是使用霍夫曼编码,你会a用更少的比特来表示,因为它更常见,你会用更多的比特来表示bd因为它们在以下程度上不太常见:

a=0, b=110, c=10, d=111 然后

aabaccda将表示为0011001010111014 位

于 2012-02-23T23:44:04.030 回答
0

你的图像是 512x512 像素 Y 分量是 512x512 因此 262144 像素变成了 262144 DCT 系数 Cb 和 Cr 分量被下采样了 2 因此 256x256 像素变成了 65536 DCT 系数。所有DCT系数之和为262144+65536+65536 = 393216。霍夫曼与此无关。

于 2013-03-15T19:19:26.983 回答