首页 文章

霍夫曼编码如何从dct系数构造图像(jpeg)?

提问于
浏览
0

我有一个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

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

    enter image description here

  • 0

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

    例如:你有令牌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

    您的图像是512x512像素Y分量是512x512因此262144像素变成262144 DCT系数Cb和Cr分量被下采样2,因此每个256x256像素变成65536个DCT系数 . 所有DCT系数的总和是262144 65536 65536 = 393216.Huffman与此无关 .

相关问题