信源编码作业【02】Huffman编码实验

本文探讨了Huffman编码在图像压缩中的应用,首先对sena.img、omaha.img和sensin.img进行原始图像和差值图像的Huffman编码,展示了显著的压缩率提升。随后,使用sensin.img的码本对其他图像进行编码,结果揭示了不同码本对压缩效果的影响。
摘要由CSDN通过智能技术生成

实验内容
实验环境介绍和项目使用方法
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.img64.0kb54.9kb85.78%
sensin.img64.0kb58.7kb91.72%
omaha.img64.0kb55.7kb87.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.img64kb44kb68.75%
sena_diff.img64kb24kb37.50%
sensin_diff.img64kb29kb45.31%

使用了DPCM后再进行霍夫曼编码与单独使用霍夫曼编码相比,压缩率效果获得了很大程度的提高。
(这里压缩率=编码后图片大小/编码前图片大小)

3.使用对sensin.img图像进行Huffman编码时生成的码本(编码树),对Bookshelf1.img和sena.img图像进行Huffman编码,与自身计算得到的码本的压缩效果进行对比。
输入原始文件bookshelf1.img,输出编码后文件bookshelfi.img,输入码本storecode3,由sensin图像生成的码本。
设置完命令参数后启动本地Windows调试器即可完成对原始文件的编码。同理,可对sena进行编码。
在这里插入图片描述在这里插入图片描述

其大小如下:

图像 名称原始图片大小huffman码编码后文件大小sensin生成的码本编码后大小
bookshelf1.img64kb59kb71kb
sena.img64kb60kb60kb

由上表可知,使用对sensin.img图像进行Huffman编码时生成的码本(编码树),对Bookshelf1.img和sena.img图像进行Huffman编码,比自身码本压缩的效果差,甚至比自身文件更大。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值