数字图像处理:图像压缩1 基础&无损压缩

• Fundamentals

压缩率:压缩前比上压缩后

相对数据冗余:压缩比越大,相对冗余越大

 


二维灰度阵列(理解为一个个像素)是人们观察和解释图像的首选格式,并且以它作为判定所有其他表示的标准,然而,当它变成紧凑的图像表示时,这些格式就远不是最佳格式了。通常用于人类观看和解释的2-D像素阵列必须转换为一种更有效(但通常是“非视觉”)的格式

  • –Pixel differences 像素差
     
  • –Run-lengths游程长度
     
  • –A set of transform coefficients一组变换系数
    •DFT, DCT, WT, …

二维灰度阵列的三种冗余类型:编码冗余、时间和空间冗余、不相关信息也叫感知冗余(精神视觉上的冗余,就是有些图片信息以人的视觉系统根本感知不到,所以可以去除)


评价信息图像信息保真的三个客观方面

均方误差:

加^的f为压缩后的图像

信噪比:

 信息/误差

信噪比的均方误差:


编码冗余

一张图片: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%,所以一个二进制数就够了

那么图像的信息熵可以表示为

【这里该有一张图】

理论上不能用小于信息熵的编码平均长度来编码这个图像,不然会丢失信息

无损压缩中的编码平均长度不可能小于信息熵


• Image Compression Models图像压缩模型

图像压缩系统:编码器+解码器

一个器又包括两个:source和channel,前者处理图像冗余,后者加强传输抗噪性,目前只讲source的编码器和解码器


 

Mapper:将输入数据转换为(通常是非可视的)格式,以减少空间和时间冗余,刚才fundamental的第二部分介绍的就是转换的三种方式

Quantizer:降低制图者输出的准确性,以减少心理视觉冗余

Symbol coder:创建一个固定长度或可变长度的代码来表示量化器输出

• Error-Free Compression无损压缩

无损压缩就是把Quantizer部分去掉了,量化是不可逆的,量化是有损的根源,只做mapper不量化同样无损,但此时的mapper也没有意义。

所以无损压缩只能在编码方式上作文章了


会介绍到的编码方式

•Variable-Length Coding
        –Huffman coding
        –Other near optimal variable length codes
        –sua
•LZW Coding
•Bit-Plane Coding
•Lossless Predictive Coding


变长编码Variable-Length 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是信息熵


字典编码LZW Coding

这个博主的编码和解码过程都写得很好看完这个之后,下面是几个要点

源符号的变长序列分配固定长度的码字,但不需要预先知道要编码的符号出现的概率;比如灰度为256,那就要预留0~255为原符号编码区域,其余部分用灰度级序列填充字典

然后现在试着还原一下下面的编码,看你能不能得到相同的Encoded Output

位平面编码Bit-Plane Coding

分别处理图像的位平面-将多层(单色或彩色)图像分解为一系列二值图像-通过几种著名的二值压缩方法之一对每个二值图像进行压缩

比如说灰度级为256的图像,是由8bit编码的,假如一个像素的编码值为10010110

位平面编码就是将这八个bit分为八张独立的二值图——那么上面这个像素在这八张二值图里面的值分别为1,0,0,1,0,1,1,0

然后再对这八张二值图使用二值图的压缩方法进行压缩(比如游程编码)

举个例子,将该图的每个bit抽出为二值图后

 

 可以发现高阶位平面远没有低阶位平面复杂。但是大的黑白灰关系却是高阶位影响的。

下面是两种二值图常用的编码方式

constant area coding 

游程编码


预测编码Lossless Predictive Coding

因为相邻的像素之间一般不会突变,是有相似关系的,所以一个像素可以用其之前的像素,或者左上角的像素来进行预测。编码的是预测值减去实际值的误差。

感觉这个写的还不错其实也很好理解,下一篇有损压缩会更预测编码(maybe)

猜你喜欢

转载自blog.csdn.net/karonneveralone/article/details/121277914