1.1 利用自身码本进行Huffman编码
(1)步骤
在调试→调试属性→配置属性→调试→命令参数,分别输入:
-i ..\images\sensin.img -o .\out\sensin.huff
-i ..\images\omaha.img -o .\out\omaha.huff
-i ..\images\sena.img -o .\out\sena.huff
再运行程序huff_enc.c
(2)实验结果(文件大小对比)
图像 | 原图大小 | 编码后大小 | 压缩率 |
sensin.img | 64KB | 58.7KB | 91.7% |
omaha.img | 64KB | 57.0KB | 89.1% |
sena.img | 64KB | 56.1KB | 87.7% |
(3)实验结论
- 对图像进行Huffman编码后,文件有所缩小,但压缩幅度不大;
- 不同图像的压缩率相差无几。
1.2 对相邻像素之差进行Huffman编码
(1)步骤
先将原图像转化为差值图像(每行保留第一个像素,其余像素使用后向差分计算,再对差值进行8bit量化),剩下的步骤与1.1相同。
(2)实验结果(文件大小对比)
图像 | 差值图像大小 | 编码后大小 | 压缩率 |
sensin.img | 64KB | 30.1KB | 41.0% |
omaha.img | 64KB | 44.6KB | 69.7% |
sena.img | 64KB | 25.2KB | 39.3% |
(3)实验结论
- 对图像的差值进行Huffman编码,压缩效果要比直接对原图编码好得多;
- 压缩效果因图而异。omaha.img图像不如sensin.img和sena.img平滑,相邻像素之间差异大,所以压缩率没有sensin.img和sena.img低,但相比于对原图编码已经进步了不少。
2 利用sensin图像码本给其他图像进行Huffman编码
(1)步骤
生成sensin图像码本:
-i ..\images\sensin.img -o .\out\sensin.huff -s .\out\sensin.code
分别输入以下命令,进行编码:
-i ..\images\sena.img -o .\out\sena_enc_sensin_code.huff -c .\out\sensin.code
-i ..\images\bookshelf1.img -o .\out\bookshelf1_enc_sensin_code.huff -c .\out\sensin.code
(2)实验结果(文件大小对比)
图像 | 原图大小 | 编码后大小 | 压缩率 |
bookshelf1.img | 64KB | 70.8KB | 110.6% |
sena.img | 64KB | 59.5KB | 93.0% |
(3)实验结论
- 用其他图像的码本编码,压缩效果远不如用自身码本编码,甚至还可能越编越大;
- sena.img和sensin.img图像像素的整体分布较为相似,所以用sensin的码本给sena编码还是起到了一定的压缩效果。
3 附录
3.1 Huffman学习笔记
3.2 实验过程中遇到的问题及解决办法:
- 报错:无法打开源文件“stdio.h”"math.h"等头文件。解决:Windows开始菜单→Visual Studio Installer→修改→通用Windows平台开发→勾选Windows 10 SDK→启动。
- VS安装过程中,点击暂停键后无法恢复。解决:断网再重连,或连VPN,或关掉重装。
- 0x0F8AF2F6 (ucrtbased.dll) (HuffmanDec.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。解决:读某个文件却没有放入。