这个是我的毕设,某些地方可能还有借鉴价值,拿出来大家看看吧,转载注明出处,谢谢
第3章 block coding方法的改进
如果以2进制位对一些数字进行表示的时候,为了达到能够用较少表示位表示较多不同标识,必须采用一定的方式。例如,当需要表示的内容为1,2,-1,0的时候,如何表示能够使需要的位数最小,例如:可以用10,110,111,01或是00,11,101,100来分别表示1,2,-1,0。在这样的编码情况下,都不需要其它任何位,就可以进行明确的解码。但是这样是要浪费一些比特位的,如何能够更简单的进行表示,这是这节要说明的问题。
当需要表示0,1,2的时候
如果用用3个比特位进行表示的时候,最多表示的可能性为8种,即000,001,010,011,100,101,110,111。如果需要表示的是1,2,-1,0四种,可以用00,01,10,11表示,但这种只对于平均分位比较有效的方法,对于一些出现频率有所差别的表示,则不会达到较好的效果,假设其有1,2,-1,0出现的频率由高到低分别为0,1,2,-1,那么
后一种表示方法会更符合出现的频率的规则,然而这种组合是怎么出来的?
其中3个比特为最多能够表示8种情况,如果我们只用1位0表示1种情况,那么3个比特为最多还能表示100,101,110,111四位,也就是0开头的4位不能在表示了。如果再用11去表示1,那么110,111这两种表示也不能再使用了,因而0,11,100,101正好在3位比特位的限制之内。简单的说如果要用一位较低的比特位进行表示,就需要去掉比此高位的一半位置。
图像存在着很多种格式,为了图像分析的方便所用的原始图像都采用 BMP位图,BMP的4个组成部分:
1.文件头信息块
0000-0001:文件标识,为字母ASCII码“BM”。
0002-0005:文件大小。
0006-0009:保留,每字节以“ 00” 填写。
000A -000D:记录图像数据区的起始位置。各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。
2.图像描述信息块
000E-0011:图像描述信息块的大小,常为28H。
0012-0015:图像宽度。
0016-0019:图像高度。
001A -001B:图像的plane总数(恒为1)。
001C -001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。
0022-0025:图像区数据的大小。
0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002A -002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。
3.颜色表
颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。
4.图像数据区
颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像素的位数)/8。
然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这是为什么呢?原因有两个:
1.BMP文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。接下来的一个字节将开始记录下一行的信息。
2.为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。如果显示模式为16色,当图像宽为19时,存储时每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。如果显示模式为256色,当图像宽为19时,每行也要补充4-19%4=1个字节
图像主要分为2,4,8,16位,以及彩色图像,后面处理到的都是按照2位色图像处理。
在进行处理的时候,基础的图像采用bmp图像,首先把bmp图像转化称需要的矩阵模式,例如后面试验用到的128*128的图像,写成map[128*128] 的格式,用来存贮所有的象素点,在此基础上,对此矩阵进行变换,得到需要的格式,最后压缩成2进制编码格式。转化方法参照具体的程序,这里不再累述。
在进行一些压缩时,一般都要先对图像矩阵进行一定的变换。在block coding中,一般都先要将其中的由1组成的矩形型块提取出来,再以一定的方式标注位置,一般是标注左下和右上顶点就足够表示一个矩形。这种方法是将图像中的1点划分为不重叠的矩形块,如下图所示,只需表示矩形的左上和右下顶点的变形,顶点用1和2的方式进行表示。
图3-1 分块的表示
具体的步骤用略复杂的样式进行说明,如图类似于3 -2a 所示的图像,它中唯一的区域主要集中在两个部分,进行压缩时
1. 先对图像块逐行进行扫描,只到遇到第一个1位,记录这个位置,并把它作为第一个矩形的左上顶点。
2. 从这个顶点出发,对其左边的点进行检索如果为1,则把这个矩形向右扩展
,这样就变成了2*1的矩阵,如不成功则取消向右的扩展。
3. a)如果步骤2扩展不成功,那么以后只进行向下的扩展,对于m*n的矩形,检查下一行对应的m个像素是否都为1,如果都是1则把矩阵向下扩展,每次扩展都会把m*n的矩阵变为m*(n+1)的矩阵,同时执行步骤4的检查。如果不成功则说明不能向下扩展。
b)如果步骤2扩展成功,对于m*n的矩形,检查下一行对应的m个像素是否都为1,如果都是1同时通过4的检查,则把矩阵向下扩展,扩展会把m*n的矩阵变为m*(n+1)的矩阵。然后再进行类似步骤2,不过这次是把M*N的矩阵试着扩展成(M+1)*N,然后重复进行步骤2,3,直到向右和向下都不能扩展为止。
4. 为了形成优化的分块,这里有特殊情况,在进行向下扩展时,如果下一行的前一位和其后一位也为1,则取消此次扩展。例如在对左上顶点在M*N的,大小为 m*n的矩阵进行扩展检查第N+n+1行如果从M-1到M+m的m+2个像素都为1,则取消此次向下的扩展,可以参看下图中的g到h的过程。
5. 由于是不重叠的矩形提取方法,每次提一个矩形之后,下一个矩形便不能重复取这个矩形中包含过的点。简单的做法就是记录矩形的位置之后,把该矩形包含所有的点置为0再进行下一个矩形的提取。提取之后可以以一定的结构体记录这些矩形的长和宽,以及位置。同时利用左上顶点标记为1,右下顶点标记为2,孤立点为-1的规则进行记录。
根据上述方法所得到的结果就是不重叠的NPC的分块提取方法,这是一种近似最优的不重叠分块方法,虽然有一种OPC的最优分块方法,不过要经过比较复杂的步骤,所以本文中的分块方法都采用这种方法。
在编码的时候为了尽量缩短编码的总量,用相对距离方法能得到更好的压缩比,相对距离的方法根据前一非0点到其所在段的结尾的长度作为下个非0点编码所需要表示长度的预测值。而解压时一旦解出前一点,它到所在段的结尾也可以计算出了,所以不需要任何其它编码,下一编码所占的位数也可以计算出,因此也是可解得,如此可得到所有的解码,而不需要其它多余的位。
1. 如果某row中只有唯一的非0位,那么它需要的记录长度的位数为 ,n为row的长度。
2. 如果在某row中存在多个非0点,那个第一个非0点需要记录位置的bit位为 ,其后的非0位需要的 ,c为其前一非0点在row中的位置。
以上图为例进行说明,在上图中,利用11表示1,101表示2,100表示-1。在第一行中第一个1在6位置,由于长是8,所以需要的表示位 位,它在6位,3位bit位表示的是从000-111的数值
000—1
001—2
010—3
011—4
100—5
101—6
110—7
111—8
从如上对应关系中可以得到第6位的位置编码为101。第2个非0位是在第7位的2,它需要的长度表示位数为 位,所以第2的非0位2的长度表示为0,总的表示为1010。其余的行也可以由此方法推导出,不在累述,后面的压缩方法在编码时也多用到这种方法。
第4章 线形编码
ZA编码也是一种针对二进制图像的压缩编码方式,整体的想法比较简单。ZA编码把图像中点的0,1值变成一个长序列,通过分析其中的黑点和白点的比例进行分块,根据导数的方法取极值点,得到最优的分块数,再对各块进行压缩。其特点是压缩方式简单,整个的算法过程和相应需要的内存空间都比较小,同时它也有一定的试用范围,只有在黑点和白点相差比较悬殊的时候才是有效的,在文献[7]中指出p为二进制图像中1点所占的比率
时,block coding的方法较好
时,ZA编码的方式比较好
时,坐标点记录的方法比较好
在一定的比率下ZA压缩的方法比较好,如果把1和0的比率这个概念进行扩展。令
这样就可以把原有方法的原理用在其它的方法上,这样只要非0点满足p的有效范围,这个方法就可以有效。下节是一个改进方法。
线形编码比分块编码简单,同时也能取得不错的压缩效果,这里用记录一个1的长串首位的方法加少
同时这里也要用到根据导数分组的方法,和相对位置记录长度的方法。线形编码的步骤如下
1. 先把图像中的所有像素按照序列的顺序排成line[width*height]的长串,用作处理的基础。
2. 从第一位开始顺序遍历,每个1111…1的部分开头一位记为1,结尾一位记为2。遇到第一个1将其记为1如果下一位为0,那么遇到下一个1记为1。即对每个长度大于1的串,开头和结尾分别记为1和2,孤立的点记为1(可以根据下一标记点是0还是1,来分辨是孤立点还是成串的部分)。下面是一段的示例:
3. 经过步骤2,这个序列里面的值只可能步骤中先统计图像中总的点的个数,逐行扫描生成一维序列。这个1维序列中假设包含像素的个数 。把生成的bit位序列分成 块,每一块包含 位的像素;从中我们可以得到M=a+b,分块数 由公式
得出,其中 ,p为其中的非0点,1,2,-1 的总和占总点数的百分比。
以 10->1
11->2
这样编码的原因可以根据前面得出,这里不再说明,在每两个相邻的块之间编一个“ 0 ” 作为间隔位。
(a)如果在一分块中没有任何1的话,那么其中不需要任何的编码,只需要块的分割标示“0”。
(b)如果在某分块中存在多个非0点,那个第一个非0点需要记录位置的bit位为 ,其后的非0位需要的 ,c为其前一非0点在分块中的位置。产生的编码整合起来就是整体的编码。
在解码的时候可以根据遇到1后下一个遇到的是1还是2来判断是孤立点,还是一个1的长串,所以不需要其它的编码就可以完成解压。
|
MF |
fore-back MF |
P-MF |
ZA |
ZA改进 |
序列压缩 |
边缘压缩 |
Clock |
7871 |
7668 |
6210 |
14641 |
13257 |
5698 |
11709 |
Car |
5531 |
5458 |
3605 |
17294 |
17294 |
3005 |
5737 |
Tower |
5064 |
4995 |
3499 |
8916 |
7820 |
2647 |
5433 |
Horse |
5049 |
4987 |
3364 |
14005 |
12471 |
2815 |
4060 |
English Text |
5956 |
5832 |
4891 |
8332 |
7548 |
4897 |
10163 |
Persian Text |
4420 |
4316 |
3158 |
5074 |
4642 |
3178 |
5771 |
具体参考这几篇
[1] Gengsheng Zeng, and Nasir Ahmed A block coding technique for encoding sparse binary patterns IEEE Trans. on ASSP vol. 37 no. 5 pp. 778-780 May 1989
[2] Sherif A. Mohamed and Moustafa M. Fahmy Binary image compression using efficient partitioning into rectangular regions IEEE Trans. on Comm., vol. 43, No.5, pp.1888-1893, 1995.
[3] Saif Zahir, Mehmood Naqvi A Near Minimum Sparse Pattern Coding Based Scheme for Binary Image Compression IEEE 2005
[4] Jacob Augustine Wen Feng James Jacob Logic Minimization Based Approach for Compressing Image Date IEEE 1995
[5] Ian. H. Witten, Aliaster Moffat, and Timothy C. Bell Managing Gigabytes Morgan Kaufmann Publishing San Francisco May 1999
图好像没贴上,明天继续整理,还有要研究下blog怎么贴附件。