实验内容
实验环境介绍和项目使用方法
1.对sena.img、omaha.img、sensin.img等raw图像文件进行Huffman编码;
2.自行编写一段程序,对sena.img、omaha.img、sensin.img三者进行相邻像素差值计算,并输出差值图像。然后分别对输出的差值图像进行Huffman编码;
3.使用对sensin.img图像进行Huffman编码时生成的码本(编码树),对Bookshelf1.img和sena.img图像进行Huffman编码,与自身计算得到的码本的压缩效果进行对比。
实验素材
未经压缩的256 * 256像素8位灰度图,其各像素值按光栅扫描顺序存储
VSinstaller2019
1、sena.img、omaha.img、sensin.img等raw图像文件进行Huffman编码;
步骤如下:
1.将HuffmanEnc设为启动项
2.HuffmanEnc属性页——命令参数:
输入原始文件sena.img,输出编码后文件senai.img,输出码本storecode1.
设置完命令参数后启动本地Windows调试器即可完成对原始文件的编码。同理,可对sensin和omaha图像进行编码。
输出结果如下:
Huffman编码结果
图像名称 | 原始文件大小 | 压缩后大小 | 压缩率 |
---|---|---|---|
sena.img | 64.0kb | 54.9kb | 85.78% |
sensin.img | 64.0kb | 58.7kb | 91.72% |
omaha.img | 64.0kb | 55.7kb | 87.03% |
总结:由上表可知,使用Huffman编码后,文件压缩率在85%~92%之间。
2.自行编写一段程序,对sena.img、omaha.img、sensin.img三者进行相邻像素差值计算,并输出差值图像。然后分别对输出的差值图像进行Huffman编码;
编写代码imgdiff.cpp生成每个图像所对应的残差图像。残差图像的生成采用后向的DPCM,并采用8bit量化。
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
#pragma warning(disable:4996);
void dpcm_diff(unsigned char* imagebuf, unsigned char* diffbuf, int width, int height, int bitdepth)
{
for (int i = 0; i < width; i++)
{
for (int j = 1; j < height; j++)
{
diffbuf[i * width + j] = (imagebuf[i * width + j] - imagebuf[i * width + j - 1] + 255) / pow(2, (9 - bitdepth));
}
}
for (int i = 0; i < width * height; i++)
{
if (diffbuf[i] > 255)
diffbuf[i] = 255;
if (diffbuf[i] < 0)
diffbuf[i] = 0;
}
}
void main()
{
FILE* image = NULL; FILE* qyuv = NULL; FILE* diff_image = NULL;
const int width = 256; const int height = 256;
int bitdepth = 8;
if (!(image = fopen("omaha.img", "rb")))
{
printf("open file error!");
exit(-1);
}
else
{
printf("open file success");
}
if (!(diff_image = fopen("omaha_diff.img", "wb")))
{
printf("open file error!");
exit(-1);
}
else
{
printf("open file success");
}
unsigned char* imagebuf = (unsigned char*)malloc(sizeof(unsigned char) * width * height);
unsigned char* diffbuf = (unsigned char*)malloc(sizeof(unsigned char) * width * height);
fread(imagebuf, sizeof(unsigned char), width * height, image);
dpcm_diff(imagebuf, diffbuf, width, height, bitdepth);
fwrite(diffbuf, sizeof(unsigned char), width * height, diff_image);
free(diffbuf); free(imagebuf);
fclose(image);
fclose(diff_image);
}
上述代码运行结果如下图所示:
其中sensin.img,sena.img,omaha.img为输入图片,sensin_diff.img,sena_diff.img,omaha_diff.img为输出的差值图像。
然后对三个差值图像进行huffman编码,方式如题1。
生成结果大小如下:
输入图片 | 输入图片大小 | 输出图片大小 | 压缩率 |
---|---|---|---|
omaha_diff.img | 64kb | 44kb | 68.75% |
sena_diff.img | 64kb | 24kb | 37.50% |
sensin_diff.img | 64kb | 29kb | 45.31% |
使用了DPCM后再进行霍夫曼编码与单独使用霍夫曼编码相比,压缩率效果获得了很大程度的提高。
(这里压缩率=编码后图片大小/编码前图片大小)
3.使用对sensin.img图像进行Huffman编码时生成的码本(编码树),对Bookshelf1.img和sena.img图像进行Huffman编码,与自身计算得到的码本的压缩效果进行对比。
输入原始文件bookshelf1.img,输出编码后文件bookshelfi.img,输入码本storecode3,由sensin图像生成的码本。
设置完命令参数后启动本地Windows调试器即可完成对原始文件的编码。同理,可对sena进行编码。
其大小如下:
图像 名称 | 原始图片大小 | huffman码编码后文件大小 | sensin生成的码本编码后大小 |
---|---|---|---|
bookshelf1.img | 64kb | 59kb | 71kb |
sena.img | 64kb | 60kb | 60kb |
由上表可知,使用对sensin.img图像进行Huffman编码时生成的码本(编码树),对Bookshelf1.img和sena.img图像进行Huffman编码,比自身码本压缩的效果差,甚至比自身文件更大。