我有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
但是在Huffman编码之前我计算了DCT系数的数量并且它是393216.除以64告诉我DCT块的数量(8x8)将是6144。
现在我尝试计算像素域的8x8块的数量。 512/8 = 64,水平64块,垂直64块。 64 x 64 = 4096,不等于DCT块数,而像素数为512x512 = 262144
我的问题是霍夫曼编码如何神奇地将393216个系数转换为262144个像素并获取每个像素值,并计算压缩图像(jpeg)的尺寸(512x512)。
提前谢谢你。 :d
答案 0 :(得分: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图像中使用颜色子采样产生的部分压缩是利用人类视觉系统的一个特征。我们的眼睛对亮度的变化比色度更敏感。
答案 1 :(得分:0)
霍夫曼编码不会将系数转换为像素或类似的东西。至少不是我想到的霍夫曼编码。所有霍夫曼编码都是,它需要一个令牌列表,并根据这些令牌的频率用较少的位表示它们。
一个例子:你有令牌a,b,c和d
现在,未压缩,每个令牌都需要2位(00,01,10和11)。
假设a = 00,b = 01,c = 10,d = 11
aabaccda
将表示为0000010010101100
16位
但是使用霍夫曼编码时,您使用较少位代表a
因为它更常见,并且您将b
和d
代表更多,因为它们不太常见程度:
a = 0,b = 110,c = 10,d = 111然后
aabaccda
将表示为00110010101110
14位
答案 2 :(得分:0)
您的图片为512x512像素 Y分量是512×512,因此262144个像素变成262144个DCT系数 Cb和Cr分量被下采样2,因此每个256x256像素变为65536个DCT系数。 所有DCT系数的总和是262144 + 65536 + 65536 = 393216。 霍夫曼与此毫无关系。