收藏 分享(赏)

图像的霍夫曼编码.doc

上传人:精品资料 文档编号:10635229 上传时间:2019-12-10 格式:DOC 页数:11 大小:271KB
下载 相关 举报
图像的霍夫曼编码.doc_第1页
第1页 / 共11页
图像的霍夫曼编码.doc_第2页
第2页 / 共11页
图像的霍夫曼编码.doc_第3页
第3页 / 共11页
图像的霍夫曼编码.doc_第4页
第4页 / 共11页
图像的霍夫曼编码.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、实验六 图像的霍夫曼编码一、 实验目的:1) 理解并熟练对图像进行霍夫曼编码的算法;2) 进一步加深对所学数字图像处理内容的认识;3) 能够利用各种软件对算法加以实现。二、 实验内容:1) 对数字图像进行哈弗曼编码2) 对数字图像进行算术编码3) 分析所得到的结果。三、 实验原理哈夫曼(Huffman) 编码是一种常用的压缩编码方法,是 Huffman 于 1952 年为压缩文本文件建立的。它的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。具体算法如下:1) 首先统计出每个符号出现的频率,上例 S0

2、到 S7 的出现频率分别为4/14,3/14,2/14,1/14,1/14,1/14,1/14,1/14。2) 从左到右把上述频率按从小到大的顺序排列。3) 每一次选出最小的两个值,作为二叉树的两个叶子节点,将和作为它们的根节点,这两个叶子节点不再参与比较,新的根节点参与比较。4) 重复(3),直到最后得到和为 1 的根节点。5) 将形成的二叉树的左节点标 0,右节点标 1。把从最上面的根节点到最下面的叶子节点途中遇到的 0,1 序列串起来,就得到了各个符号的编码。四、 实验过程1) 实验流程图程序入口函数W i n M a注册主窗口类M y R e g i s t e r C l a s s

3、主窗口实例化I n i t I n s t a n c e消息循环分发消息响应 W M _ C O M M A N D 消息调用 L o a d B m p F i l e 函数加载 B M P 图象文件响应 W M _ P A I N T 消息在主窗口内显示 b m p对工具栏选项进行处理 ,调用霍夫曼函数进行编码消息处理函数W n d P r o c霍夫曼编码示意图如下:2) 实验代码见实验报告附页。五、 实验结果1) 打开要进行编码的图片,如下图所示:2) 对图片进行霍夫曼编码,得到如下结果:六、 实验总结1) 通过本实验,进一步加深了对霍夫曼编码的实验原理和算法的理解和认识;2) 加强

4、了分析问题和解决问题的能力;3) 熟练了软件的使用能力,提高了利用软件对数字图像进行处理的能力。附页:实验代码:unsigned int PcxBytesPerLine;BOOL LoadPcxFile (HWND hWnd,char *PcxFileName)FILE *PCXfp;PCXHEAD header;LOGPALETTE *pPal;HPALETTE hPrevPalette; HDC hDc;HLOCAL hPal;DWORD ImgSize;DWORD OffBits,BufSize;LPBITMAPINFOHEADER lpImgData; DWORD i;LONG x,y

5、;int PcxTag;unsigned char LineBuffer6400;LPSTR lpPtr;HFILE hfbmp;if(PCXfp=fopen(PcxFileName,“rb“)=NULL) /文件没有找到MessageBox(hWnd,“File c:test.pcx not found!“,“Error Message“,MB_OK|MB_ICONEXCLAMATION);return FALSE;/读出头信息fread(char*)if(header.manufacturer!=0x0a) /不是一个合法的 PCX 文件MessageBox(hWnd,“Not a val

6、id Pcx file!“,“Error Message“,MB_OK|MB_ICONEXCLAMATION);fclose(PCXfp);return FALSE;/将文件指针指向调色板开始处fseek(PCXfp,-769L,SEEK_END);/获取颜色数信息PcxTag=fgetc(PCXfp)if(PcxTag!=12) /非 256 色,返回MessageBox(hWnd,“Not a 256 colors Pcx file!“,“Error Message“,MB_OK|MB_ICONEXCLAMATION);fclose(PCXfp);return FALSE;/创建新的 BI

7、TMAPFILEHEADER 和 BITMAPINFOHEADERmemset(char *) memset(char *)/填写 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

8、;NumColors=256;LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);ImgSize=(DWORD)LineBytes*bi.biHeight;/填写 BITMAPFILEHEADER 头信息bf.bfType=0x4d42;bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;bf.bfOffBits=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMA

9、PFILEHEADER)+sizeof(BITMAPINFOHEADER);/为新图分配缓冲区if(hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize)=NULL)MessageBox(hWnd,“Error alloc memory!“,“ErrorMessage“,MB_OK|MB_ICONEXCLAMATION);fclose(PCXfp);return FALSE;lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImg

10、Data); /拷贝头信息memcpy(lpImgData,(char *)lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);/为 256 色调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors* sizeof(PALETTEENTRY);pPal =(LOGPALETTE *)LocalLock(hPal);pPal-palNumEntries =256;pPal-palVersion = 0x300;for (i = 0; i palPalEntryi.peRed=(BYTE)fge

11、tc(PCXfp);pPal-palPalEntryi.peGreen=(BYTE)fgetc(PCXfp);pPal-palPalEntryi.peBlue=(BYTE)fgetc(PCXfp);pPal-palPalEntryi.peFlags=(BYTE)0;*(lpPtr+)=(unsigned char)pPal-palPalEntryi.peBlue;*(lpPtr+)=(unsigned char)pPal-palPalEntryi.peGreen;*(lpPtr+)=(unsigned char)pPal-palPalEntryi.peRed;*(lpPtr+)=0;/产生新的

12、逻辑调色板hPalette=CreatePalette(pPal);LocalUnlock(hPal);LocalFree(hPal);hDc=GetDC(hWnd);if(hPalette)hPrevPalette=SelectPalette(hDc,hPalette,FALSE);RealizePalette(hDc);/解码行所占的字节数PcxBytesPerLine=(unsigned int)header.bytes_per_line;/将文件指针指向图象数据的开始处fseek(PCXfp,(LONG)sizeof(PCXHEAD),SEEK_SET);/缓冲区大小OffBits=b

13、f.bfOffBits-sizeof(BITMAPFILEHEADER);/BufSize 为缓冲区大小BufSize=OffBits+bi.biHeight*LineBytes;for(y=0;ybi.biHeight;y+)/指向新图中相应的位置lpPtr=(char *)lpImgData+BufSize-LineBytes-y*LineBytes;/解码该行,放在数组 LineBuffer 中ReadPcxLine(LineBuffer,PCXfp);for(x=0;xbi.biWidth;x+)*(lpPtr+)=LineBufferx; /将该行存储到位图数据中/创建新的位图hBi

14、tmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);if(hPalette RealizePalette(hDc);hfbmp=_lcreat(“c:pcx2bmp.bmp“,0);_lwrite(hfbmp,(LPSTR) _lwrite(hfbmp,(LPSTR)lpImgData,BufSi

15、ze);_lclose(hfbmp);fclose(PCXfp); /释放内存和资源ReleaseDC(hWnd,hDc);GlobalUnlock(hImgData);return TRUE; /对每一行进行解码,结果存储到指针 p 指向的内存中void ReadPcxLine(unsigned char *p,FILE *fp)unsigned int n=0,i;char c;memset(p,0,PcxBytesPerLine);do/读出一个字节c=fgetc(fp)if(c/下一个字节为实际的图象数据c=fgetc(fp);while(i-) pn+=c; /填充连续的 i 个字节到 p 中else pn+=c; /否则是实际的图象数据,直接填入到 p 中while (nPcxBytesPerLine); /共读取 PcxBytesPerLine 个字节

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报