压缩率:压缩前比上压缩后
相对数据冗余:压缩比越大,相对冗余越大
二维灰度阵列(理解为一个个像素)是人们观察和解释图像的首选格式,并且以它作为判定所有其他表示的标准,然而,当它变成紧凑的图像表示时,这些格式就远不是最佳格式了。通常用于人类观看和解释的2-D像素阵列必须转换为一种更有效(但通常是“非视觉”)的格式
二维灰度阵列的三种冗余类型:编码冗余、时间和空间冗余、不相关信息也叫感知冗余(精神视觉上的冗余,就是有些图片信息以人的视觉系统根本感知不到,所以可以去除)
评价信息图像信息保真的三个客观方面
均方误差:
信噪比:
信噪比的均方误差:
一张图片:M*N=n个像素
灰度范围:[0,L-1]; 灰度级数为L;rk为某一个灰度值∈[0,L-1];Pr(rk)为每个rk发生的概率
如果用于表示每个rk值的比特数为l(rk),则表示每个像素所需的平均比特数为
有时候像素的灰度信息不需要那么多比特数来支持,就会出现冗余,自然编码一般会比变长编码所用的bit数更多或相同
本章要求会计算一张图使用某种编码方式的平均比特数和比特数,以及压缩率和相对冗余
所以到底多少个bit编码会更加合适呢?
图像信息的度量
信息熵H:
假如一件事情发生的概率P(E),那么定义这件事情的信息为
I(E)=-log(P(E))——对数的底决定了度量信息所用的单位,比如是2的话,就是用二进制表示
也挺好理解的,比如说一件事情发生的概率P=0.5,并且我要用二进制表示,那么这件事情的信息就是I=1,也就是说用一个二进制数就可以表示整个事件的信息,事实也确实如此,因为该事件要么为0要么为1各占50%,所以一个二进制数就够了
那么图像的信息熵可以表示为
【这里该有一张图】
理论上不能用小于信息熵的编码平均长度来编码这个图像,不然会丢失信息
无损压缩中的编码平均长度不可能小于信息熵
图像压缩系统:编码器+解码器
一个器又包括两个:source和channel,前者处理图像冗余,后者加强传输抗噪性,目前只讲source的编码器和解码器
Mapper:将输入数据转换为(通常是非可视的)格式,以减少空间和时间冗余,刚才fundamental的第二部分介绍的就是转换的三种方式
Quantizer:降低制图者输出的准确性,以减少心理视觉冗余
Symbol coder:创建一个固定长度或可变长度的代码来表示量化器输出
无损压缩就是把Quantizer部分去掉了,量化是不可逆的,量化是有损的根源,只做mapper不量化同样无损,但此时的mapper也没有意义。
所以无损压缩只能在编码方式上作文章了
会介绍到的编码方式
•Variable-Length Coding
–Huffman coding
–Other near optimal variable length codes
–sua
•LZW Coding
•Bit-Plane Coding
•Lossless Predictive Coding
变长编码的思路就是给概率最大的情况赋予最短的码字,以此类推
但变长编码要求知道信源的概率分布
霍夫曼编码
由下至上构建哈夫曼树,然后左右树杈代表0,1由上至下编码。可以自行百度很好理解。
哈夫曼解码的时候相当于一个查表的过程
截断的霍夫曼编码&B-code&others
效果那肯定还是哈夫曼最好(见下面avg length),但为了减少计算的复杂性提高效率,截断就是说前面一些频率高的用哈夫曼编码,后面的就正常编码好了(或者参考后两行的方法直接加111or00),这张图的截断系数为12(见右侧)
算数编码Arithmetic coding
统计每个灰度的概率(probablility)同时在0~1中分配属于他们概率的区域,如下面图的第一列;当第一个数字为a1时,将a1部分的长度再次细分,同样按照每个灰度的概率进行分配,第二个数字是a2,于是将a2部分继续细分,一次类推,最后输出的是 “ 当前间隔 ” 的下边界,就是该给定事件序列的算术编码。比如下图给a1a2a3a3a4编码的输出是0.06752
如何解码?
0.06752属于0~1的a1部分——解出a1
0.06752属于0~0.2的a2部分——解出a2
0.06752属于0.04~0.08的a3部分——解出a3
……
随着被编码序列长度的增加,所得到的算术编码接近无噪声编码理论所确定的界限(信息熵长度)
lA为平均编码长度,m随着编码序列长度的增加而增加,H是信息熵
这个博主的编码和解码过程都写得很好看完这个之后,下面是几个要点
为源符号的变长序列分配固定长度的码字,但不需要预先知道要编码的符号出现的概率;比如灰度为256,那就要预留0~255为原符号编码区域,其余部分用灰度级序列填充字典
然后现在试着还原一下下面的编码,看你能不能得到相同的Encoded Output
分别处理图像的位平面-将多层(单色或彩色)图像分解为一系列二值图像-通过几种著名的二值压缩方法之一对每个二值图像进行压缩
比如说灰度级为256的图像,是由8bit编码的,假如一个像素的编码值为10010110
位平面编码就是将这八个bit分为八张独立的二值图——那么上面这个像素在这八张二值图里面的值分别为1,0,0,1,0,1,1,0
然后再对这八张二值图使用二值图的压缩方法进行压缩(比如游程编码)
举个例子,将该图的每个bit抽出为二值图后
可以发现高阶位平面远没有低阶位平面复杂。但是大的黑白灰关系却是高阶位影响的。
下面是两种二值图常用的编码方式
constant area coding
游程编码
因为相邻的像素之间一般不会突变,是有相似关系的,所以一个像素可以用其之前的像素,或者左上角的像素来进行预测。编码的是预测值减去实际值的误差。
感觉这个写的还不错其实也很好理解,下一篇有损压缩会更预测编码(maybe)