0

我有一个512x512图像,我试图重新压缩它。下面是步骤的图像重新压缩为JPEG文件霍夫曼编码如何从dct系数构造图像(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块(8×8)的数量这将是6144.

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

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

非常感谢您。 :D

+0

你是否真的手动做过霍夫曼编码,或者你在使用某个库吗? – 2012-02-23 23:27:49

+0

我为整个压缩过程使用了一个库 – 2012-02-23 23:37:34

回答

1

如果您的图像没有进行颜色子采样编码,那么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块每个MCU = 6144个系数块。所以,为了回答你的问题,霍夫曼编码不是改变系数的数量,它是颜色子采样。在JPEG图像中使用彩色二次采样所产生的部分压缩是利用人类视觉系统的一个特征。我们的眼睛比亮度对亮度变化更敏感。

enter image description here

0

霍夫曼编码不变换系数像素或类似的东西。至少不是我想到的霍夫曼编码。所有的huffman编码都是,是否需要一个令牌列表,并根据这些令牌的频率用较少的位表示它们。

一个例子:你有令牌的a,b,c和d

现在,未压缩的,每个令牌将需要2个比特(00,01,10,和11)。

假设A = 00,B = 01,C = 10,和d = 11

aabaccda将作为0000010010101100 16位

但与霍夫曼编码你代表a用较少的比特来表示因为这是比较常见的,而且你代表bd更因为他们是不常见的东西的程度:

A = 0,b = 110,C = 10,d = 111,然后

aabaccda将表示为00110010101110 14比特

0

你的图像是512×512像素 Y成分是512×512,因此262144个像素变成262144个DCT系数 的Cb和Cr分量通过2个因此256×256像素被向下取样变成65536 DCT每个系数。 所有DCT系数的总和是262144 + 65536 + 65536 = 393216. 霍夫曼与此无关。