2)有效的信源编码可使输出码元概率均匀化。
在哈夫曼编码过程中,对缩减信源符号按概率由大到小的顺序重新排列时,应使合并后的新符号尽可能排在靠前的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。
缺点:
(1)由于编码长度可变。因此译码时间较长,使得霍夫曼编码的压缩与还原相当费时。
(2)编码长度不统一,硬件实现有难度。
(3) 对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100%的编码效率;若信号源符号的概率相等,则编码效率最低。
4.3香农-弗诺编码
4.3.1香农-弗诺编码对话框
CdlgShannon是一个新创建的对话框类,该对话框主要功能是计算指定序列的香农-弗诺编码表,同时计算图像熵、平均码字长度和编码效率。
在图像处理的主窗口的菜单栏"图像编码"下添加"香农-费诺编码"项,如图4.6所示。对应的处理函数是CDImageProcessView视图类中的"OnCodeShannon()"函数。"OnCodeShannon()"函数实现了图像灰度概率的计算和编码对话框的调用,向PicCodingView.cpp中加入香农-弗诺编码的调用函数"OnCodeShannon()"。
图4.9建立香农-弗诺编码对话框
首先函数将统计各个灰度值出现的概率,然后将概率按从小到大的顺序排列,并使用冒泡法计算计算该图像的熵值、平均码字长度及编码效率。
资源文件DlgShannon.cpp是香农-费诺编码的算法程序。与霍夫曼算法相似地从视图类中得到每个灰度值出现的概率,针对这个概率进行编码。首先用冒泡法从小到大对概率进行排序,从概率大于0处开始进行编码,对概率区间进行分割,然后对每个灰度值对应的编码数组进行追加字符,初始时追加为1,当超出概率总和的一半时,追加的字符改为0,接着继续对上半部分的区间进行分割,此时概率的总和就改为上半部分的概率总和了,重复上述操作,完成整幅图像的编码。
以下是创建香农编码对话框的部分代码:
CDlgShannon dlgPara; // 创建对话框
dlgPara.m_fFreq = fFreq; // 初始化变量值
dlgPara.m_iColorNum = iColorNum;
dlgPara.DoModal(); // 显示对话框
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 解除锁定
EndWaitCursor(); // 恢复光标 }
4.3.2香农-弗诺编码结果演示
DlgShannon.h为对话框头文件,里面包含了对话框的声明等代码。
对256色位图图像"sdkd.bmp"进行香农-弗诺编码压缩,如下图4.7所示。编码效率约为94.5%,平均码长为2.92,图像熵值2.76。
香农编码方法易于实现,且对于具有单调减小概率的输入信号相当有效。但是冗余度稍大,相较于其他编码方法实用性较差,但研究香农编码法有重要的理论意义。码长不同,需要用数据缓冲单元收集可变比特率的代码,使用不便。
图4.10香农-弗诺编码运行结果
4.4行程编码
4.4.1行程编码对话框
利用行程编码原理实现PCX图像文件的读写,在图像处理的主窗口菜单栏"图像编码"下添加"行程编码"项,并在"行程编码"下添加"保存成PCX文件"菜单和"加载PCX文件"菜单。如图4.8所示。行程编码对应的处理函数是CDImageProcessView视图类中的OnRleCoding()函数。
函数PCXCoding()将指定的256色DIB对象保存为256色PCX文件。参数LPSTR lpDIBBits是指向DIB对象像素的指针; 参数LONG ImageWidth 是源图像宽度(像素数,必须是4的倍数);参数LONG ImageHeight是源图像高度(像素数);参数CFile& file是要保存的文件。
创建PCX文件的部分代码:
strFilePath = dlg.GetPathName(); // 获取用户指定的文件路径
CFile file; // CFile和CFileException对象
CFileException fe;
if (!file.Open(strFilePath, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive, &fe)) // 尝试创建指定
的PCX文件
图4.11建立行程编码对话框
4.4.2行程编码结果演示
行程编码是将256色位图图像,即以".bmp"为后缀的图像保存为以".PCX"为后缀的文件格式。如下图4.9-4.11所示。
图4.12保存为以.PCX为后缀的文件
若保存成功,则弹出对话框提示成功保存,如图4.10所示。
图4.13成功保存提示对话框
保存成PCX文件后,其压缩程度可从属性中看出来,如图4.11所示。压缩前图像大小为88.9KB,压缩后图像大小为29.1KB。压缩比为67.3%。
图4.14行程编码后压缩程度对比
该压缩编码技术相当直观和经济,运算也相当简单,因此解压缩速度很快。RLE压缩编码尤其适用于计算机生成的图形图像,对减少存储容量很有效果。
4.5 LZW 编码
4.5.1 LZW编码对话框
利用LZW编码原理实现GIF图像文件的读写功能。在图像处理的主窗口菜单栏"图像编码"下添加"LZW编码"项,并在"LZW编码"下添加"保存为GIF文件"菜单和"加载GIF文件"菜单。如下图4.12所示。对应的处理函数是CDImageProcessView视图类中的OnCodeIlzw()函数。
图4.15建立LZW编码对话框
要对图像进行LZW-GIF编码,首先要对GIF图像格式进行定义,这样我们的编码平台才能识别".GIF"格式的图像并打开。在本次试验中,我们首先构造了自己的GIF函数库,即类似于与设备无关位图(DIB)函数库。编程过程中,我们要把GIF函数库加入到工程中才行。"GIFAPI.cpp"即为构造的函数库。
创建GIF文件的部分代码:
strFilePath = dlg.m_strFilePath; // 获取用户指定的文件路径
bInterlace = dlg.m_bInterlace;
// CFile和CFileException对象
CFile file;
CFileException fe;
if (!file.Open(strFilePath, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive, &fe))// 尝试创建指定的GIF文件
4.5.2 LZW编码结果演示
LZW编码是将256色位图图像,即以".bmp"为后缀的图像保存为以".GIF"为后缀的文件格式。如下图4.13所示。
图4.16保存为以.GIF为后缀的文件
若保存成功,则弹出对话框提示成功保存,如图4.14所示。
图4.17成功保存提示对话框
保存成GIF文件后,其压缩程度可从属性中看出来,如图4.15所示。压缩前图像大小为88.9KB,压缩后图像大小为17.9KB。压缩比79.9%。
图4.18行程编码后压缩程度对比
LZW码能有效利用字符出现频率冗余度进行压缩,但通常不能有效地利用位置冗余度。
(1)LZW压缩技术对于可预测性不大的数据具有较好的处理效果,常用于TIF格式的图像压缩,其平均压缩比在2:1以上,最高压缩比可达到3:1。
(2)对于数据流中连续重复出现的字节和字串,LZW压缩技术具有很高的压缩比。
(3)对于任意宽度和像素位长度的图像,都具有稳定的压缩过程。压缩和解压缩速度较快。
4.6本章小结
本章为论文的重点部分,本章节从MFC下对话框结构建立方法入手,详细说明了对话框建立的方法,以及具体的参数配置。后面分别介绍了霍夫曼编码对话框的建立、对话框代码的配置以及编码运行结果;香农-弗诺编码对话框的建立的流程、对话框代码的配置以及编码运行结果;行程编码对话框的建立、对话框代码的配置以及编码运行结果;LZW编码对话框的建立、对话框代码的配置以及编码运行结果。对于对话框建立以及配置过程配合图片进行了详细的演示。四种编码方式分别对同一幅256色位图"sdkd.bmp"进行压缩,编码结果可以通过图片直观的看到。
5总结
随着计算机技术的发展和现代通信要求的不断提高,图像的传输和存储单纯的依靠提高硬件是非常不划算的,因此图像压缩编码技术正可以大显身手。本文主要讨论了图像压缩编码的几种方法的基本理论和实现的步骤,并侧重讨论了如何在Visual C++
上一篇:
施工组织设计(小农水工程2011)
下一篇:
超市进销存管理系统的开发