ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:130.72KB ,
资源ID:17596223      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17596223.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《数字图象处理入门》在线中文教程chp9Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《数字图象处理入门》在线中文教程chp9Word格式文档下载.docx

1、(3)变换编码;(4)其它方法。所谓象素编码是指,编码时对每个象素单独处理,不考虑象素之间的相关性。在象素编码中常用的几种方法有:(1)脉冲编码调制(Pulse Code Modulation,简称PCM);(2)熵编码(Entropy Coding);(3)行程编码(Run Length Coding);(4)位平面编码(Bit Plane Coding)。其中我们要介绍的是熵编码中的哈夫曼(Huffman)编码和行程编码(以读取.PCX文件为例)。所谓预测编码是指,去除相邻象素之间的相关性和冗余性,只对新的信息进行编码。举个简单的例子,因为象素的灰度是连续的,所以在一片区域中,相邻象素之间

2、灰度值的差别可能很小。如果我们只记录第一个象素的灰度,其它象素的灰度都用它与前一个象素灰度之差来表示,就能起到压缩的目的。如248,2,1,0,1,3,实际上这6个象素的灰度是248,250,251,251,252,255。表示250需要8个比特,而表示2只需要两个比特,这样就实现了压缩。常用的预测编码有调制(Delta Modulation,简称DM);微分预测编码(Differential Pulse Code Modulation,DPCM),具体的细节在此就不详述了。所谓变换编码是指,将给定的图象变换到另一个数据域(如频域)上,使得大量的信息能用较少的数据来表示,从而达到压缩的目的。变

3、换编码有很多,如(1)离散傅立叶变换(Discrete Fourier Transform,简称DFT);(2)离散余弦变换(Discrete Cosine Transform,简称DCT);(3)离散哈达玛变换(Discrete Hadamard Transform,简称DHT)。其它的编码方法也有很多,如混合编码(Hybird Coding)、矢量量化(Vector Quantize,VQ) 、LZW算法。在这里,我们只介绍LZW算法的大体思想。值得注意的是,近些年来出现了很多新的压缩编码方法,如使用人工神经元网络(Artificial Neural Network,简称ANN)的压缩编码

4、算法、分形(Fractl)、小波(Wavelet) 、基于对象(Object Based)的压缩编码算法、基于模型(Model Based)的压缩编码算法(应用在MPEG4及未来的视频压缩编码标准中)。这些都超出了本书的范围。本章的最后,我们将以JPEG压缩编码标准为例,看看上面的几种编码方法在实际的压缩编码中是怎样应用的。9.1 哈夫曼编码哈夫曼(Huffman)编码是一种常用的压缩编码方法,是Huffman于1952年为压缩文本文件建立的。它的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。举个例子

5、:假设一个文件中出现了8种符号S0,S1,S2,S3,S4,S5,S6,S7,那么每种符号要编码,至少需要3比特。假设编码成000,001,010,011,100,101,110,111(称做码字)。那么符号序列S0S1S7S0S1S6S2S2S3S4S5S0S0S1编码后变成000001111000001110010010011100101000000001,共用了42比特。我们发现S0,S1,S2这三个符号出现的频率比较大,其它符号出现的频率比较小,如果我们采用一种编码方案使得S0,S1,S2的码字短,其它符号的码字长,这样就能够减少占用的比特数。例如,我们采用这样的编码方案:S0到S7的

6、码字分别01,11,101,0000,0001,0010,0011,100,那么上述符号序列变成011110001110011101101000000010010010111,共用了39比特,尽管有些码字如S3,S4,S5,S6变长了(由3位变成4位),但使用频繁的几个码字如S0,S1变短了,所以实现了压缩。上述的编码是如何得到的呢?随意乱写是不行的。编码必须保证不能出现一个码字和另一个的前几位相同的情况,比如说,如果S0的码字为01,S2的码字为011,那么当序列中出现011时,你不知道是S0的码字后面跟了个1,还是完整的一个S2的码字。我们给出的编码能够保证这一点。下面给出具体的Huffm

7、an编码算法。(1) 首先统计出每个符号出现的频率,上例S0到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序列串起来,就得到了各个符号的编码。上面的例子用Huffman编码的过程如图9.1所示,其中圆圈中的数字是新节点产

8、生的顺序。可见,我们上面给出的编码就是这么得到的。图9.1 Huffman编码的示意图产生Huffman编码需要对原始数据扫描两遍。第一遍扫描要精确地统计出原始数据中,每个值出现的频率,第二遍是建立Huffman树并进行编码。由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。源程序就不给出了,有兴趣的读者可以自己实现。9.2 行程编码行程编码(Run Length Coding)的原理也很简单:将一行中颜色值相同的相邻象素用一个计数值和该颜色值来代替。例如aaabccccccddeee可以表示为3a1b6c2d3e。如果一幅图象是由很多块颜色

9、相同的大面积区域组成,那么采用行程编码的压缩效率是惊人的。然而,该算法也导致了一个致命弱点,如果图象中每两个相邻点的颜色都不同,用这种算法不但不能压缩,反而数据量增加一倍。所以现在单纯采用行程编码的压缩算法用得并不多,PCX文件算是其中的一种。PCX文件最早是PC Paintbrush软件所采用的一种文件格式,由于压缩比不高,现在用的并不是很多了。它也是由头信息、调色板、实际的图象数据三个部分组成。其中头信息的结构为:typedef struct char manufacturer;char version;char encoding;char bits_per_pixel;WORD xmin

10、,ymin;WORD xmax,ymax;WORD hres;WORD vres;char palette48;char reserved;char colour_planes;WORD bytes_per_line;WORD palette_type;char filler58; PCXHEAD;其中值得注意的是以下几个数据:manufacturer为PCX文件的标识,必须为0x0a;xmin为最小的x坐标,xmax最大的x坐标,所以图象的宽度为xmax-xmin+1,同样图象的高度为ymax-yin+1;bytes_per_line为每个编码行所占的字节数,下面将详细介绍。PCX的调色板在

11、文件的最后。以256色PCX文件为例,倒数第769个字节为颜色数的标识,256时该字节必须为12,剩下的768(2563)为调色板的RGB值。为了叙述方便,我们针对256色PCX文件,介绍一下它的解码过程。编码是解码的逆过程,有兴趣的读者可以试着自己来完成。解码是以行为单位的,该行所占的字节数由bytes_per_line给定。为此,我们开一个大小为bytes_per_line的解码缓冲区。一开始,将缓冲区的所有内容清零。从文件中读出一个字节C,若C0xc0,说明是行程(Run Length)信息,即C的低6位表示后面连续的字节个数(所以最多63个连续颜色相同的象素,若还有颜色相同的象素,将在

12、下一个行程处理),文件的下一个字节就是实际的图象数据(即该颜色在调色板中的索引值)。若CpalNumEntries =256;palVersion = 0x300; for (i = 0; i palPalEntryi.peBlue;palPalEntryi.peGreen;palPalEntryi.peRed; *(lpPtr+)=0; /产生新的逻辑调色板 hPalette=CreatePalette(pPal); LocalUnlock(hPal); LocalFree(hPal); hDc=GetDC(hWnd); if(hPalette)hPrevPalette=SelectPale

13、tte(hDc,hPalette,FALSE); RealizePalette(hDc); /解码行所占的字节数 PcxBytesPerLine=(unsigned int)header.bytes_per_line; /将文件指针指向图象数据的开始处 fseek(PCXfp,(LONG)sizeof(PCXHEAD),SEEK_SET); /缓冲区大小OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);/BufSize为缓冲区大小 BufSize=OffBits+bi.biHeight*LineBytes; for(y=0;ybi.biHeight;y

14、+) /指向新图中相应的位置 lpPtr=(char *)lpImgData+BufSize-LineBytes-y*LineBytes; /解码该行,放在数组LineBuffer中 ReadPcxLine(LineBuffer,PCXfp); for(x=0;xbi.biWidth;x+) *(lpPtr+)=LineBufferx; /将该行存储到位图数据中 /创建新的位图 hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS); if(hPalette & hPrevPalette) SelectPalette(hDc,hPrevPalette,FALSE); hfbmp=_lcreat(c:pcx2bmp.bmp,0); _lwrite(hfbmp,(LPSTR)&bf,sizeof(BITMAPFILEHEADER); _lwrite(hfbmp,(LPSTR)lpImgData,BufSize); _lclose(hfbmp); /释放内

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1