一。对图像进行Huffman编码
图像格式
本次编码所用图像为:
sena.img | sensin.img | omha,img |
---|---|---|
图像都为256×256大小的8比特灰度图像
Huffman编码
1.对图像本身进行编码
输入调试器的命令参数为:
-i ../images/sena.img -o ../images/sena1_huff.huff
图像 | 编码前 | 编码后 | 压缩比 |
---|---|---|---|
sena.img | 64.0kb | 56.1kb | 87.66% |
sensin.img | 64.0kb | 59.9kb | 93.59% |
omaha.img | 64.0kb | 57.0kb | 89.06% |
2.对图像的差值图像进行编码
1)首先编写代码得到原始图像的差值图像:
#include <iostream>
#include<fstream>
using namespace std;
#define height 256
#define width 256
int main()
{
ifstream fp;
fp.open("../images/omaha.img", ios::in | ios::binary);//打开图像
if (!fp)
{
cout << "img open failed" << endl;
return 0;
}
ofstream fp_out;
fp_out.open("../images/omaha_diff.img", ios::out | ios::binary);
unsigned char* buffer;
buffer = (unsigned char*)malloc(width * height);
unsigned char I[width * height];
for (int i = 0; i < width * height; i++)
{
fp.read((char*)(I + i), sizeof(unsigned char));//直接读取图像
}
//使用前向预测
for (int j = 0; j < width * height; j++)
{
if (j % 256 == 0)
{
buffer[j] = I[j];
}
else
{
int temp = I[j] - I[j - 1];
temp = (temp + 255) / 2;
if (temp > 255)
temp = 255;
if (temp < 0)
temp = 0;
buffer[j] = temp;
}
}
// 将处理后的图像数据输出至文件
fp_out.write((char*)buffer,width * height);
fp.close();
fp_out.close();
free(buffer);
return 0;
}
差值图像如图所示:
sena_diff.img | sensin_diff.img | omaha_diff.img |
---|---|---|
2)对差值图像进行Huffman编码
输入调试器的命令参数为:
-i ../images/omaha_diff.img -o ../images/omaha2_huff.huff
图像 | 编码前 | 编码后 | 压缩比 |
---|---|---|---|
sena_diff.img | 64.0kb | 25.2kb | 39.38% |
sensin_diff.img | 64.0kb | 30.1kb | 47.03% |
omaha_diff.img | 64.0kb | 44.6kb | 69.69% |
3使用sensin图像生成的码本对bookshelf和sena图像进行编码
bookshelf1.img | bookshelf2.img |
---|---|
1)首先生成sensin图像的码本
输入调试器的命令参数为:
-i ../images/sensin.img -o ../images/sensin1_huff.huff -s ../images/sensin.code
2)使用该码本对图像进行编码
输入调试器的命令参数为:
-i ../images/bookshelf1.img -o ../images/bookshelf1_huff.huff -c ../images/sensin.code
3)使用被压缩图像生成的码本
-i ../images/bookshelf1.img -o ../images/bookshelf1.huff
图像 | 编码前 | 编码后(sensin码本) | 编码后(自身码本) |
---|---|---|---|
bookshelf1.img | 64.0kb | 70.8kb | 59.5kb |
bookshelf2.img | 64.0kb | 93.5kb | 55.2kb |
sena.img | 64.0kb | 59.2kb | 56.1kb |
由上述表格可以看出,使用被压缩图像生成的码本比使用sensin图像生成的码本,图像压缩效果更好。