您的当前位置:首页正文

比特平面编码用于图像压缩的程序设计

2021-09-06 来源:步旅网
维普资讯 http://www.cqvip.com

…………………… …………………………………… . 实用第一/ 智慧密集 …… … … … … … … 一 … …………_ 。毫 ∞ 摘 要 介绍了把比特平面编码用于图像压缩, 并编写了具体程序实现读取图片、生成压缩 文件、解压缩、重建图像等功能。 关键词 无损压缩,比特平面编码,嵌入特性, 格雷码,图像压缩 块,以及0和1混合的块。统计表明,前两种结构的块最常出 一、概述 人类所获取的外界知识中约有80%以上的信息来自于视 现。一种编码做法是比较全0块和全1块出现的概率,对出现 概率高的分配比特码字0,对另一个分配比特码字11,对混合 块分配10作前缀码,其后跟pq比特,表示该块的具体图案。 若以P(0)表示全0块出现的概率,以P(1)表示全1块出现的 概率,则混合块出现的概率为1一p(O)一P(1),这个编码方案 的压缩比为: ————————————————觉,很多情况下图像所承载的信息比任何其他形式的信息都更 真切,更丰富,获取也更便捷。一幅实用的数字图像的数据量 是巨大的,这给图像的传输和存储带来相当大的困难。在保证 一定的图像质量和满足任务要求条件下,减少原始图像数据量 在无损压缩算法中,一种有效地减少像素间冗余的技术就 的处理过程也就是图像压缩是非常关键的一个步骤。 _f 一一一—— ,’、 p(O)+2p(1)+(2 pq)(1-p(O)-p(1)) 图像相邻的灰度值具有很强的相关性,所以高比特位具有 大量的全0块和全l块。相邻像素间的较小差别主要体现在低比 特位上,混合块出现的概率较高,对编码效率有一定的影响。 是单独处理图像的位平面,这种技术被称为位平面编码。它是 以将一幅多级图像分解为一系列二值图像并对每幅二值图像进 行压缩的原理为基础的。该算法应用也比较广泛,在 但是,有时像素值的一个微小改变会对比特平面的复杂程 度造成重大影响。当像素值127(01111111)与128(10000000) 相邻,全部8个比特平面都会出现从0到1的转变,从而在所 有比特平面都破坏了全0块或全l块的出现,降低了编码效 率。为了解决这一问题,我们引进格雷码,其突出特点为代表 相邻两个数值的码字只有1位发生转变。比如127,128的格 雷码分别为11000000,01000000,只有第七比特平面含有从0 到1的转变,增大了全0块全1块出现的概率,有利于编码效 率的提高。 下面,通过一个“图像比特平面编码程序”的具体实例讨 JPEG2000中,把量化后的系数组织成二进制位平面,从最高 有效位平面开始,依次对每个位平面上的小波系数位进行编 码。该编码算法的输出是按数据对重建图像质量的重要性排列 的,因此可以按一定的压缩比在任意时刻截断输出码流,而获 得当时条件下可能获得的最好质量,具有良好的灵活性和可分 级性,这就是所说的嵌入特性,可用于渐进图像传输。本文以 灰度图像为例利用这种算法进行程序设计。 二、算法简介 灰度图像的每个像素值为8比特,可以表示为以2为基底 的多项式,即: b 27+be }+b525+b4 ̄+b。23+b22%b,2'+bo2 ̄ (1) 论如何利用VC++实现图像读取、比特平面编码、生成压缩 文件、解码和重建图像的功能。具体开发环境:WindowsXP, MicrosoftVisualC++6.0。 基于这一陛质,将多值图像分解为一个二值图像序列的简 单方法是将式(1)中多项式8个系数分成8个一比特的平面。 三、程序分析 打开图像,将灰度值存人图像数组,并显示(本文中代码 省略)。 因此,一幅灰度图像可以如此变换成8幅二值图像,每幅二值 图像成为一个比特平面。第i个比特平面由所有像素的第i个 比特组成(i=0,1,…7)。由多值图像分解成一组比特平面, 这种变换是可逆的,即由这组比特平面可以完全重建原始的多 值图像。  .将图像各个像素灰度值转换为格雷码,并存人代表8个比 特平面的数组。 相应于(1)中的多项式,8比特的格雷码可由下式得到。 每一比特平面可以分成若干个P q个像素大小的块。比 特平面经过划分,出现三种不同结构的块,即全0块,全1 g三_-b ④btb  ̄ l 7=7 J (3 2008.哀鸸6:≯, 黾墨鞭程与维 i《; 维普资讯 http://www.cqvip.com

…… 踟隅PHICS PROGR^啊……………………………………… ……… ……………………………………… else for(i=0 i<Ix¥ly:i++) ( //ip中存储各像素反度值 a; nt\ip[i] b a/2: - | | 、| one 、。瀛 | | 。 //当前像素对应的格雷码 GrayCode=  -+ 。 0//把格雷码存入8个比特平面对应的数组 for《j=0 <8:j++) ( |I≤ 。 l|||lll || ne>z色【Q\ e n1 else return I.pIj】【i】=GrayCode%2: |GrayCode/=2 全1块,如果出现概率高,分配1比特码字0;如果出现概率 . . 对各个比特平面进行扫描,取p=q=4,各比特平面中 p q小块如果为全0块,开头一位放2,如果为全1块,开头 一位放3,而混合块开头一位是0或1,编码时可以相区别。 同时统计全0块和全1块出现的次数,返回0或1,编码时可 以区别处理。下面为进行扫描的函数: }ntscan《) intzero one 、 z,k binary sign; -zero:one=0: 。 for(i=0 i<《ly/p).i++) ≮C一F ile每\\telsIt C ̄ da t", File::d mo d e C|reat e  I=C.IF|ile :Mv Fjle1( D: : modeW rit e): _for(j=0;j<《l×/q):j++) { . ncQde=nN;Ql ’ //编码从高位比特平面到低位比特平面 ● fo ̄(il;11 il>;Q l、一一、 forI、=Q i≮ ly/p1 i++、| binary=lip[1】【i P Ix+j q】:sign=O: IlllJ断是否为混合块,一旦有不相等的数值,跳出循环 for《Z=O:Z<p Z++) ( for《k=O k<q:k++) fo ; \< Ix/q \+十、 if《binary!:lip【l】【《 P+z) Ix+《j q+k)1) { sign=1=break; ) ) bi=i i1、、 p*Ix+\ 。 //该块为全0或全1块且出现的概率高,分配 比特码字0 If《《《bi:=2)&&《G【il】I=:01)l II《《∞ ==3)&&(c if(sign==1)break; ) //是全0块或全1块 If《《z==P)&&《k==q))・ ’ MyFlie . rite void*) &nCode) 4、t if《binary=:O) n 《《 ^ 。 zero++://0计数力口1 . iip[… P*Ix+ q】=2://全0块标志  。|I,/|/  1该特鬻0块码为字全或  1  1全块 且出现拣的 概率低,分 -配 。2比| 0 I-I 维普资讯 http://www.cqvip.com

………………………… ………………… …………… 实用第_ 智慧密集 … … … else|f((《bi==2)&&《c【il】==1))l l(《bi==3) &&(C【il】 =0))) for(I:0:l<2:l+4-) { nCode+=1: Ⅵ/-、 、,/、 . Ⅵ, 1 MyFile1.c、losel、 由压缩文件解码,重建图像。解码为编码的逆过程,实现 的核心代码如下: CFileMyFile2《 D:\\test dat CFile::modeRead): While(1) ( MyFile1.Write《《void )(&nCode),4): + MyFile2.Read《(void )《&nCode1),4) n1三31: nN++: _f《nN==32) f nN=O: nCode=0: ) else //把编码拆入数组 一 whlie《n1>=O) ( nCode<<;1: ) ) st【n1一一】=nCode1%2:nCodel/=2: ) f6 i=O l<32;i +) 1 . if《readI==1) ( //混合块先写入前缀码10,再写入该块具体图案 else ( //写入10 for《I=O:I<2:I++) ( nCode+=《1一1):nN++: if(nN==32) oop【num】【n++】=st【i .f(n==P q)  ‘( n=0:num++:read=O: t if(num==《《Ix/q)}《ly/p))) ( ( MyFile1.Write《《void¥)《&nCode),4) nN=O:nCode=O: ) else trans()://一个比特平面解码完成,存入数组相应位置 -f(nu==一 ( sig= break; nCode<<=1: ) ) else //写入该块具体图案 for《Z=O:Z<p:Z++) ( for《k=O:k<q;k++) f ‘ num=O:S1=c【nu s2=1一sl: ) } 】 nCode+=iip【il】【《i P+z) Ix+j q 4-k】: nN++: ) elseif《con==1) If(nN==32) ( ( if(st…==1) MyFile1.Write((void )《&nCode),4) ( oop[num++】【0】;s2+2; jf(num==(《lX/q) (1y/p))) — nN=0:nCode=O: ) else nCode<<=1: trans(); )//k )//z \? elSe //一个比特平面解码完成,存入数组相应位置 if(n ==一1) ( ¨6 电 与 维普资讯 http://www.cqvip.com

…… GRAPHICS PROG脯啊……………………………… ……………………………………… ………………~ sig=1=break; 、 else num=0;sl=c、nu、 s2=1一sl else| |j| j ||1 l con=0: |? | 强 ≤ | } 、//i if(sig;;1、break; } MyFiIe2 Close(): 以下为解码过程中用到的一个转换函数,作用为把各个比 特平面的数组全0块,全1块全部填入0或1,混合块填入具 体图案。 怕ns j>.oii _、|| { intd1,d2,i, z fOr(i=Olli<(1y/P):i++) 、op l l i]_n\ | foI \=g 、‘ 奴 q、 、++、 维普资讯 http://www.cqvip.com

…~ ……… ……” …… … …一……… … ……… 实用第一 智慧密集 、 … …… … … … … … … … … …… 四、结语 对256 256像素(64KB)的几幅灰度图像进行测试,结果 如下。 sun tree b ̄boon Iena c破 图所示。 懈鹳前匿静 解码后匿静 34.8l( 53.4K 61.I4I( 50. 52.3K 对512 512像素(256KB)的几幅灰度图像进行测试,结 果如下。 goldh… 207l( I en§ 189I( barbara 21 2l( boat 208I( b ̄boon 243I( 解码前后的图像对比图 对于上述结果可以进一步处理。如果~一个编码块中比特数 值大部分为0,只有很少的l,利用人的视觉心理特性,可将 该块视为全0块处理。此时视觉上可能感觉不到明显的失真而 予以接受。反之也町将l很多而0很少的块视为全l块处理。 这种利用视觉心理特性的编码,尤其在低位的比特平面上使 用,不会引起明显的可察觉失真(因其产生的客观失真量 参考文献 l冈萨雷斯.数字图像处理.北京:电子工业出版社,2004. 2张春田,苏育挺,张静.数字图像压缩编码.北京:清华大 学出版社,2006. (收稿日期:2008年3月1日) 小),可收到较好效果。上述处理使全0块全l块出现的概率 p(O)P(1)上升,从而提高压缩效率。解码前后的图像对比如下 (上接第57页) return ds; 序中,包含WebService.h然后生成相关的对象,就可以对远程 的WebService进行调用了。简要步骤如下:在客户端工程文件 中右击引用,点添加Web引用,输入WebService地址,如: http://l0calh0st/remote/remoservice.asmx,只要保证输入的 } [WebMethod(DescriptionI= Web服务提供的方法, 将客户端的上传的添加数据保存在服务器上 y】 public DataSet insertDataToServer(DataSet ds) DataO Deration dp=new DataOperation(): DataSet returnDs=new DataSet(): string tableName= : WebService存在,然后弓I用即可。需要注意的是Web引用名将 作为加入的Webservice的名字空间.比如Web引用名输入了: Tremote,服务的实例化将是这样:Tremote.remoservice serviceA= newTremote.remoservice();(remoserviee是服务的类名),在这 里不做具体阐述了。 inttableCount=ds.Tables.CoUnt: fo r (inti=O:i<tableCount;i++)f tableName=ds.Tables Ii】-TableName; returnDs.Tables Add(dp.insertData 五、结语 Webservice以其独特的特点,在数据传输与通信等方面, 发挥了巨大的作用,通过本文对申报系统的实现阐述,希望能 够对广大读者对Webservice的理解能够有所帮助。 《tableName,ds.Tables…)): ’ return returnDs; } 、 参考文献 2.WebService的使用 1孙永强,杨丽坤.VisualC≠}.NET中文版Web服务开发基础 .Visual Studio.Net内建提供了对WebService的调用。在 清华大学出版社,2002年8月. VC.NET中,调用WebService只需要简单的几个步骤即可。只 要找到WebService的发布地址,将地址引入到VC工程中。这 2刘晓华.NETWeb服务开发指南.电子工业出版社,2002年 l0月.  ‘时,编译器会预先编译一次,自动生成和WebService相关的头 文件(也可以叫Web代理文件)WebService.h。在客户端程 (收稿日期:2008年1月16日) '一一,电脑娲程622008 ̄ 6与|.E 《 

因篇幅问题不能全部显示,请点此查看更多更全内容