预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共11页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验六图像的霍夫曼编码 实验目的: 理解并熟练对图像进行霍夫曼编码的算法; 进一步加深对所学数字图像处理内容的认识; 能够利用各种软件对算法加以实现。 实验内容: 对数字图像进行哈弗曼编码 对数字图像进行算术编码 分析所得到的结果。 实验原理 哈夫曼(Huffman)编码是一种常用的压缩编码方法,是Huffman于1952年为压缩文本文件建立的。它的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。具体算法如下: 首先统计出每个符号出现的频率,上例S0到S7的出现频率分别为4/14,3/14,2/14,1/14,1/14,1/14,1/14,1/14。 从左到右把上述频率按从小到大的顺序排列。 每一次选出最小的两个值,作为二叉树的两个叶子节点,将和作为它们的根节点,这两个叶子节点不再参与比较,新的根节点参与比较。 重复(3),直到最后得到和为1的根节点。 将形成的二叉树的左节点标0,右节点标1。把从最上面的根节点到最下面的叶子节点途中遇到的0,1序列串起来,就得到了各个符号的编码。 实验过程 实验流程图 霍夫曼编码示意图如下: 实验代码 见实验报告附页。 实验结果 打开要进行编码的图片,如下图所示: 对图片进行霍夫曼编码,得到如下结果: 实验总结 通过本实验,进一步加深了对霍夫曼编码的实验原理和算法的理解和认识; 加强了分析问题和解决问题的能力; 熟练了软件的使用能力,提高了利用软件对数字图像进行处理的能力。 附页: 实验代码: unsignedintPcxBytesPerLine; BOOLLoadPcxFile(HWNDhWnd,char*PcxFileName) { FILE*PCXfp; PCXHEADheader; LOGPALETTE*pPal; HPALETTEhPrevPalette; HDChDc; HLOCALhPal; DWORDImgSize; DWORDOffBits,BufSize; LPBITMAPINFOHEADERlpImgData; DWORDi; LONGx,y; intPcxTag; unsignedcharLineBuffer[6400]; LPSTRlpPtr; HFILEhfbmp; if((PCXfp=fopen(PcxFileName,"rb"))==NULL){//文件没有找到 MessageBox(hWnd,"Filec:\\test.pcxnotfound!","ErrorMessage", MB_OK|MB_ICONEXCLAMATION); returnFALSE; } //读出头信息 fread((char*)&header,1,sizeof(PCXHEAD),PCXfp); if(header.manufacturer!=0x0a){//不是一个合法的PCX文件 MessageBox(hWnd,"NotavalidPcxfile!","ErrorMessage", MB_OK|MB_ICONEXCLAMATION); fclose(PCXfp); returnFALSE; } //将文件指针指向调色板开始处 fseek(PCXfp,-769L,SEEK_END); //获取颜色数信息 PcxTag=fgetc(PCXfp)&0xff; if(PcxTag!=12){//非256色,返回 MessageBox(hWnd,"Nota256colorsPcxfile!","ErrorMessage", MB_OK|MB_ICONEXCLAMATION); fclose(PCXfp); returnFALSE; } //创建新的BITMAPFILEHEADER和BITMAPINFOHEADER memset((char*)&bf,0,sizeof(BITMAPFILEHEADER)); memset((char*)&bi,0,sizeof(BITMAPINFOHEADER)); //填写BITMAPINFOHEADER头信息 bi.biSize=sizeof(BITMAPINFOHEADER); //得到图象的宽和高 bi.biWidth=header.xmax-header.xmin+1; bi.biHeight=header.ymax-header.ymin+1; bi.biPlanes=1; bi.biBitCount=8; bi.biCompression=BI_RGB; ImgWidth=bi.biWidth; ImgHeight=bi.biHeight; NumColors=256; LineBytes=(DWORD)WIDTHBYTES(bi.biWidth