资源描述:
《比特平面编码用于图像压缩的程序设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、比特平面编码用于图像压缩的程序设计王继林摘要本文介绍了如何把比特平面编码用于图像压缩,并编写了具体程序实现读取图片,生成压缩文件,解压缩,重建图像等功能。关键词无损压缩,比特平面编码,嵌入特性,格雷码,图像压缩一、概述人类所获取的外界知识中约有80%以上的信息来自于视觉,很多情况下图像所承载的信息比任何其它形式的信息都更真切,更丰富,获取也更便捷。一幅实川的数字图像的数据量是巨大的,这给图像的传输和存储带来相当大的凼难。在保证一定的图像质量和满足任务要求条件下,减少原始阁像数据量的处理过程也就是阁像压缩是非常关键的
2、一个步骤。在无损压缩算法屮,一种有效的减少像素间冗余的技术就是甲.独处理图像的位平面,这种技术被称为位平面编码。它是以将一•幅多级图像分解为一系列二值图像并对每幅二值图像进行压缩的原理为基础的。该算法应用也比较广泛,在JPEG2000屮,把量化后的系数组织成二进制位平面,从最高有效位平面开始,依次对每个位平面上的小波系数位进行编码。该编码算法的输出是按数据对重建阁像质垃的重要性排列的,因此可以按一定的压缩比在任意时刻截断输出码流,而获得当时条件下可能获得的最好质呈,具有良好的灵活性和可分级性,这就是所说的嵌入特性,
3、可用于渐进图像传输。以lena图像为例,保留第7位比特平血重建后的图像,和保留第7,6位比特平面重建后的图像分别如图1,图2所示。图1图2本文以灰度阁像为例利用这种算法进行程序设计。二、算法简介灰度图像的每个像素值为8比特,可以表示为以2为基底的多项式,即Z?727+Z?626+/?525+/?424+Z7323+Z?222+Z?i2i+/?020(1)基于这一性质,将多值阁像分解为一个二伉阁像序列的简单方法是将式(1)屮多项式8个系数分成8个一比特的平而。因此,一幅灰度图像可以如此变换成8幅二值图像,每幅二值图像
4、成为一个比特平面。第i个比特平面由所有像素的第i个比特组成(i=0,1,…了)。由多值图像分解成一组比特平面,这种变换是可逆的,即由这组比特平面可以完全重建原始的多值图像。每一比特平面可以分成若干个pXq个像素大小的块。比特平面经过划分,出现三种不同结构的块,即全0块,全1块,以及0和1混合的块。统计表明,前两种结构的块最常出现。一种编码做法是比较企0诀和企1诀出现的概率,对出现概率高的分配一比特码字0,对另一个分配二比特码字11,对混合块分配10作前缀码,其后跟PC!比特,表示该块的具体图案。若以P(0)表示全0
5、诀出现的概率,以p(l)表示全1块山现的概率,则混合诀出现的概率为l-p(o)-p(l),这个编码方案的压缩比力pqp(O)+2p(l)+(2+pq)(l-P(O)-p⑴)图像相邻的灰度值具有很强的相关性,所以高比特位具有大量的全0块和全1块。相邻像素间的较小差别主要体现在低比特位上,混合块出现的概率较高,对编码效率有一定的影响。但是,有时像素值的一个微小改变会对比特平面的复杂程度造成重大影响。当像素值127(01111111)与128(10000000)相邻,全部8个比特平面都会出现从0到1的转变,从而在所有比特
6、平面都破坏了全0块或全1块的出现,降低了编码效率。为了解决这一问题,我们引进格雷码,其突出特点为代表相邻两个数值的码字只有1位发生转变。比如127,128的格雷码分别为11000000,01000000,只有第七比特平面含有从0到1的转变,增大了全0块全1块出现的概率,有利于编码效率的提高。本文将通过一个“阁像比特平而编码程序”的具体实例讨论如何利用VC++实现阁像读取、比特平而编码、生成压缩文件、解码和重建图像的功能。具体幵发环境:WindowsXP,MicrosoftVisualC++6.0o二、程序实现与分析
7、1.打开图像,将灰度值存入图像数组,并显示(本文中代码省略)。2.将阁像各个像素灰度侪转换为格雷码,并存入代表8个比特平而的数组。相应于(1)中的多项式,8比特的格雷码可由下式得到。;,+,(3)8i=bifor(i=0;i〈lx*ly;i++){//ip中存储各像素灰度值a二(int)ip[i];b=a/2://当前像素对应的格雷码GrayCode=ab;//把格雷码存入8个比特平面对应的数组for(j=0;j<8;j++){iipEj][i]=GrayCode%2;GrayCode/=2;3.对各个比特平面
8、进行扫描,取p=q=4,各比特平面中p*q小块如果为全0块,开头一位放2,如果为全1块,开头一位放3,而混合块开头一位是0或1,编码吋可以相区别。同时统计全0块和全1块出现的次数,返回0或1,编码时可以区别处理。下面为进行扫描的函数。intscan(){intzero,one,i,j,z,k,binary,sign;zero=one=0:for(i=0;i<