《信息论与编码》实验报告
1 实验目的
(1) 理解信源编码的基本原理;
(2) 熟练掌握Huffman编码的方法;
(3) 理解无失真信源编码和限失真编码方法在实际图像信源编码应用中的差异。
2 实验设备与软件
(1) PC计算机系统
(2) VC++6.0语言编程环境
(3) 基于VC++6.0的图像处理实验基本程序框架imageprocessing
(4) 常用图像浏览编辑软件Acdsee和数据压缩软件winrar。
(5) 实验所需要的bmp格式图像(灰度图像若干幅)
3 实验内容与步骤
(1) 针对“图像1.bmp”、“图像2.bmp”和“图像3.bmp”进行灰度频率统计(即计算图像灰度直方图),在此基础上添加函数代码构造Huffman码表,针对图像数据进行Huffman编码,观察和分析不同图像信源的编码效率和压缩比。
(2) 利用图像处理软件Acdsee将“图像1.bmp”、“图像2.bmp”和“图像3.bmp”转换为质量因子为10、50、90的JPG格式图像(共生成9幅JPG图像),比较图像格式转换前后数据量的差异,比较不同品质因素对图像质量的影响;
(3) 数据压缩软件winrar将“图像1.bmp”、“图像2.bmp”和“图像3.bmp”分别生成压缩包文件,观察和分析压缩前后数据量的差异;
(4) 针对任意一幅图像,比较原始BMP图像数据量、Huffman编码后的数据量(不含码表)、品质因素分别为10、50、90时的JPG文件数据量和rar压缩包的数据量,分析不同编码方案下图像数据量变化的原因。
4 实验总结分析
实验步骤(1):
实验代码:
void CImageProcessingDoc::OnImageHuffman()
{
// TODO: Add your command handler code here
int m_Width, m_Height, m_SaveWidth;
int i,j,k;
int *b;
double *a,acl=0,size=0,ratio=0,ce=0,e=0;//acl:average code length(平均码长);ce:code efficiency(编码效率);e:entropy (信息熵);size:图像大小;ratio:压缩比;
long s=0;
b=new int[256];
a=new double[256];
for (i=0; i<256; i++)
{
b[i]=0;a[i]=0;
}
m_Width = m_pDibInit->GetWidth();
m_Height = m_pDibInit->GetHeight();
m_SaveWidth = m_pDibInit->GetSaveWidth();
for(j=0;j<m_Height;j++)
for(i=0;i<m_Width;i++)
{
k=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];
b[k]+=1;
}//图像统计灰度个数
for (i=0; i<256; i++)
a[i]=(double)b[i]/((double)m_Width*m_Height);//灰度概率统计//霍夫曼编码程序段
Huffm huffm(256);
huffm.Huffman(a);
huffm.HuffmanCode();
for (i=0; i<256; i++)
{
acl+=a[i]*(256-huffm.code[i].start);//编码后的平均码长
s+=(256-huffm.code[i].start)*b[i];
}
for (i=0; i<256; i++)
{
if (a[i]>0.000001)
e+=-1.0*a[i]*log10(a[i])/log10(2.0);//图像信息熵
}
ce=e/acl;//霍夫曼编码效率
size=s/(1024.0*8.0);//图像大小
ratio=((double)m_Height*(double)m_Width*8.0)/s;//图像信源的压缩比
ss.Format("信息熵:%.3f 平均码长:%.3f 编码效率:%.3f%% 压缩比:%.3f 图像大小:%.3f kB ",e,acl,ce*100,ratio,size);
}
实验结果图:
图像1 图像2 图像3 名称
类型
信息熵(比特/符号) 5.928 4.410 6.709 编码效率99.468% 99.237% 99.628% 压缩比 1.342 1.800 1.188
实验分析:不同图像信源的霍夫曼编码效率都很高,都超过了99%,这与编码方式有关,因为霍夫曼编码是一种高效的编码方式,应用了最优码的构造方式,所得的是最短的平均码长的码字,是一种最优码;编码后的图像压缩比与图像信息熵有关,信息熵越大,图像的平均信息量较大,霍夫曼编码后压缩比越小。
实验步骤(2):
实验结果图:
图像1.bmp质量因子90、50、10的jpg格式图像依次分别为:
图像2.bmp质量因子90、50、10的jpg格式图像依次分别为:
图像3.bmp质量因子90、50、10的jpg格式图像依次分别为:
图像1 图像2 图像3 转换前后
数据量对比
质量因子10 301.1/34.5 301.1/31.8 301.1/51.9 质量因子50 301.1/52.0 301.1/94.9 301.1/78.0 质量因子90 301.1/141.4 301.1/113.2 301.1/174.1
一张图片作不同品质因素对图像质量的影响(相对图像1、2、3容易看出变化):原图像:
图像质量因子90、50、10依次分别为(为了便于比较图像质量已将其尺寸大小相同规格改变):
原图像质量因子10 质量因子50 质量因子90 数据量268kB 21.5kB 27.5kB 63.1kB
实验分析:由上可以看出质量因子小的与原图差距较大,得出结论:质量因子越小的图像,其数据量越小,其图像失真越大,图像的质量越差。
实验步骤(3):
实验结果图:
压缩前后数据量:
实验分析:由上表可以看出在数据量相同的图像中,熵越大,灰度分布比较均匀,可压缩的程度越小,winrar压缩压缩后的数据量越大。
实验步骤(4):
实验分析:
在各种压缩图像中,由于压缩(编码)原理不同,形成的图像数据量也各不相同。
在霍夫曼编码中,由于其采用无失真数据压缩,直接应用最优码的构造策略得到最优码,所得的平均码长最短,失真最少,但是数据量相对较大,如果信源符号集中的符号数目越大,则编码处理的复杂程度将急剧增加;
在JPEG压缩中,它是有损压缩,但压缩丢失的部分是人眼不容易察觉到的部分,由于一般人可感知的电磁波的波长为400到700纳米之间,故JPEG压缩利用了人眼对色彩中的高频信息部分不敏感而设计的,减少了处理的信息量,压缩后的数据也相对较少,属于限失真编码;
在winrar压缩中,将字典压缩技术应用其中,通过算法把重复的数据、文字信息信息归纳一个信息处理(用简短编码代替),尽可能地缩小文件大小,文件内部重复率越高,压缩比就越高。
故压缩后的量在无失真情况下比霍夫曼编码好。
5 实验心得
(1)实验加深了对C语言应用的理解,特别之前不怎么熟悉的结构体和指针等C语言实际常用类型,对变量的设置也比之前简单学习C更科学合理了,
否则后续实验将因为变量的混淆而发生错误;
(2)不足之处在于对新函数了解太少,对其英文帮助理解相对比较困难,而一些函数,犹如Format函数,搜很多资料也没有把如何显示换行,以原C
语言函数printf的方法大同小异,而就在这种不同之处无从下手,咨询
了同学,他们说的方法似乎有些麻烦,而且没有理解;
(3)实验中加注释用处较大,一是方便别人尽快地读懂程序,二是方便自己在操作中尽快地找到目标程序段;
(4)在实际操作过程中加深了对Huffman编码的掌握和理解,特别是其编码过程;
(5)无失真信源编码和限失真编码方法在实际图像信源编码应用中各不相同,在人眼识别范围内没有必要对图像无失真信源编码,既节省内存,
又减小运算量。