数字图像处理第8章——图像压缩

目录

引言:

一、基础知识        

1.1 编码冗余

1.2 空间冗余和时间冗余

1.3 不相关的信息

1.4 图像信息的度量

1.5 保真度准则 

1.6 图像压缩模型 

二、一些基本的压缩方法

2.1 霍夫曼编码

2.2 Golomb编码

2.3 算术编码 

2.4 基于符号的编码

2.5 比特平面编码

2.6 块变换编码 

2.7 小波编码 

2.8 JPEG-2000


引言:

        图像压缩是一种减少描绘一幅图像所需数据量的技术核科学,是数字图像处理领域中最有用也是商业上最成功的技术之一。使用720*480*24比特的像素阵列来描绘2小时的标准清晰度电视电影所需的数据量。数字电影是一个视频帧序列,其中每一帧都是一幅全彩色静止图像,视频播放时会以近于每秒30帧的速度连续的显示这些帧。本章就数字图像压缩的理论和时间进行介绍并描述使这些技术更有用的工业标准。

一、基础知识        

        数据压缩是指减少表示给定信息量所需数据量的处理。在这种定义中,数据和信息是不相同的事情,数据是信息传递的手段,相同数据的信息可以由不同数量的数据表示,包含不相关或重复信息的表示就被称为冗余数据 。令b和b^{'}代表相同信息的两种表示中的比特数,b比特表示的相对数据冗余就是:

C为压缩率:

C=10,说明数据内有90%的冗余存在。

三种数据冗余类型: 

        1、编码冗余:(编码是用于表示信息实体或事件集合的符号系统(字母、数字、比特和类似的符号等)。每个信息或事件被赋予一个编码符号的序列,称之为码字。每个码字中的符号数量就是该码字的长度。在多数二维灰度阵列中,用于表示灰度的8比特编码所包含的比特数要比表示该灰度所需要的比特数多。

        2、空间和时间冗余:因为多数二维灰度阵列的像素是空间相关的(即每一个像素类似于或取决于相邻像素),在相关像素的表示中,信息被没有必要地重复了.在视频序列中,时间相关的像素(即类似于或取决于相邻帧中的那些像素)也是重复的信息。

        3、不相关的信息:多数二维灰度阵列中包含有一些被人类视觉系统忽略或与用途无关的信息。从没有被利用的意义上看,它是冗余的。

1.1 编码冗余

        之前我们学过了通过直方图处理进行图像增强的技术,这里同样利用类似的表示方法进行信息编码。

        区间[0,L-1]内的一个离散随机变量r_{k}表示为一幅M*N大小图像的灰度,则每个r_{k}发生的概率为:

其中,L是灰度级数,n_{k} 是第k级灰度在图像中出现的次数,若用于表示每个r_{k}值的比特数为l(r_{k}),则表示每个像素所需的平均比特数为:

即各个灰度级分配的码字平均长度可以通过对用于表示每个灰度的比特数与该灰度出现的概率的乘积求和得到,当对事件集合分配码的时候,如果不取全部事件概率的优势,就会出现编码冗余,也就是说如果编码的码字数大于最佳编码的码字数则就会产生编码冗余。

1.2 空间冗余和时间冗余

数字图像处理第8章——图像压缩_第1张图片

上图是由计算机生成的恒定灰度线的集合,在对应的二维灰度阵列中:

        1、所有256种灰度都是等概率的,图像的直方图是均匀的。

        2、因为每条线的灰度是随机选择的,在垂直方向上,每条线的像素彼此是独立的。

        3、因为沿每条线的像素是相同的,因此在水平方向上它们是最大相关的(完全互相依赖)。

也就是说,当使用传统的8比特灰度阵列来表示时,上图不能单一的使用变长编码来压缩。多数图像里,像素是空间(在x和y方向) 和时间相关,多数像素灰度可根据相邻像素灰度进行合理的预测,因此单个像素携带的信息较少。因此如果一个像素可以由其相邻的像素推断出来那么它的大多数数据量就是冗余的。一般情况下为了减少空间和时间相关的像素涉及的冗余,二维灰度阵列必须变换成更有效但通常不可见的表示。

1.3 不相关的信息

        压缩数据集最简的方法之一就是从集合中消除多余的数据,在数字图像压缩方面被人的视觉系统所忽视的信息或与图像预期应用无关的信息就是删除的候选者。不相关的信息的冗余度与先前讨论的冗余度是不同的。消除冗余是可能的,因为这种信息本身对于正常的视觉处理和/或期望的图像用途并不是本质的。由于去除这些信息会导致定量信息的损失,因此将其称为量化。,这是一种不可逆的操作。

1.4 图像信息的度量

        一个具有概率P(E)的随机事件E可以说成是包含:

单位的信息。当事件E必发生时,I(E)=0。并且认为该事件无信息。 上式中的对数底数决定看度量信息所用的单位。例如,以m为底的对数,其度量就称为m元单位,当m=2时,单位就是比特。

        对于一个离散集合,给定一个统计独立随机事件的信源,其每个信号输出的平均信息称为该信源的熵:

a_{j}为信源符号,是统计独立的,信源本身称为零记忆信源。

       将一幅图考虑为一个零记忆“灰度信源”的输出,可以通过观察图像直方图来估计信源的符号概率,此时,灰度的信源熵为:

1.5 保真度准则 

        去除“与视觉不相关”信息会导致真实的或一定数量的的图像信息的丢失。因为信息的丢失因此需要一种量化这种丢失的本质的方法。两类准则:(1)客观保真度准则 (2)主观保真度准则。

        信息损失可以表示为压缩处理的输入和输出数字函数时,称其是以客观保真度准则为基础的。令f(x,y)是输入图像,则与它的近似之间的差为:

则两幅图像之间的总误差为:

e_{rms}为均方根误差:

输出图像的均方信噪比可以表示为:

数字图像处理第8章——图像压缩_第2张图片

        虽然客观保真度准则提供了一种简单方便的评估信息损失的方法,但解压后的图像还是由我们人来观察的,所以使用人的主观评估来衡量图像的质量更为恰当一些。主观评估是通过向观察者显示解压缩的图像,并将他们的评估结果进行平均得到的。评估可使用一个绝对等级尺度或借助于f(x,y)和它的近似的并排比较来获得。数字图像处理第8章——图像压缩_第3张图片

图示的表为电视配置研究组织的等级尺度,值为并排比较的值 

1.6 图像压缩模型 

数字图像处理第8章——图像压缩_第4张图片

        上图给出了图像压缩系统,由两部分组成,一个编码器和一个解码器。编码器执行压缩操作解码器执行解压的互补操作。两部分可以由软件执行也可以使用硬件和固件相结合的形式执行。

编码或压缩的过程

        上图编码器被设计成通过一系列三个独立操作去除冗余度的形式,在编码处理的第一个阶段,映射器把输入变换为设计来减低空间和时间冗余的形式,这个是一个可逆操作。

        量化器会根据预设的保真度准则来降低映射器输出的精度,以排除压缩表示的无关信息、这个操作是不可逆的,若想进行无误差的压缩,这一步必须要省略。

        信源编码是最后阶段是利用符号编码器生成一个定长编码或变长编码来表示量化器的输出。并根据该编码来变换输出。

解码或解压缩过程

        解码器仅包含两个部分,符号解码器和反映射器,以与编码器相反的顺序排放,执行相关操作。由于量化会导致不可逆的信息损失,因此反量化器模块并不存在于通常的解码器模型里。

二、一些基本的压缩方法

2.1 霍夫曼编码

        霍夫曼编码在单独的对信源符号进行编码时,每个信源符号产生的是可能最小数量的编码符号。

        第一步:通过对所考虑符号的概率进行排序,并将具有最小概率的符号合并成一个符号来替代下次信源化简过程中的符号,从而创建一个简化信源系列。下图为霍夫曼信源化简:

数字图像处理第8章——图像压缩_第5张图片

        第二步:对每个化简后的信源进行编码,从最小的信源开始,直到遍历原始信源。

        霍夫曼编码过程中对一组符号产生最佳编码,其概率服从一次智能对一个符号进行编码的限制、在编码建立之后,编码和/或无误差解码就简单地以查找表的方式完成。编码本身是一种瞬时的、唯一可解码的块编码。

数字图像处理第8章——图像压缩_第6张图片

霍夫曼编码分配过程

通过python实现霍夫曼编码

import queue
class Node:
    def __init__(self, x, k=-1, l=None, r=None, c=''):
        self.freq = x
        self.key = k
        self.left = l
        self.right = r
        self.code = c
    def __lt__(self, otr):
        return self.freq < otr.freq
def huffman_code(data):
    freqTable = {}
    nodeList = []
    que = queue.PriorityQueue()
    codeTable = {}
    for n in data:
        if n in freqTable:
            freqTable[n] += 1
        else:
            freqTable[n] = 1
    for k, v in freqTable.items():
        nodeList.append(Node(v, k))
        que.put(nodeList[-1])
    while que.qsize() > 1:
        n1 = que.get()
        n2 = que.get()
        n1.code = '1'
        n2.code = '0'
        nn = Node(n1.freq + n2.freq, l=n1, r=n2);
        nodeList.append(nn);
        que.put(nodeList[-1])
    def bl(p, codestr=[]):
        codestr.append(p.code)
        if p.left:
            bl(p.left, codestr.copy())
            bl(p.right, codestr.copy())
        else:
            codeTable[p.key] = ''.join(codestr)
    bl(nodeList[-1])
    print(str(codeTable))
    return codeTable
if __name__ == '__main__':
    data = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5]
    huffman_code(data)

从结果我们可以清晰的看出霍夫曼编码的过程。

2.2 Golomb编码

        是一种具有指数衰减概率分布输入的非负的整数编码,这种编码是计算上比霍夫曼编码还要简单的一类编码。\left \lfloor x \right \rfloor表示小于等于x的最大整数,\left \lceil x \right \rceil表示大于等于x的最小整数,x mod y表示x被y除的余数。Golomb编码的构建如下:

      步骤一、形成商\left \lfloor n/m \right \rfloor的一元编码

      步骤二、令k=\left \lceil log_{2}m\right \rceil,c=2^{k}-m,r = n mod m,计算截短的余数r',使其满足:

      步骤三、连接步骤一和步骤二的结果 

整数0-9的几种Golomb码

数字图像处理第8章——图像压缩_第7张图片

2.3 算术编码 

        不同于前两节的变长编码,算术编码生成的是非块码。信源符号与码字之间不存在一一对应的关系,反而是给信源符号的整个序列分配了一个单元的算术码字。这个码字定义了一个介于0和1之间的实数间隔。当消息中的符号数量增加时,用于表示消息的间隔会变小,而表示该间隔所需的信息单位(假设为比特)的数量则会变大。消息的每个符号根据其出现的概率来减小该区间的大小。

数字图像处理第8章——图像压缩_第8张图片

     算术编码的基本过程,使用了3个十进制数字来表示这个五符号信息

自适应上下文相关的概率估计

数字图像处理第8章——图像压缩_第9张图片

        a给出了二值信源符号的自适应上下文相关算术编码步骤。当对二值符号编码时,通常使用算术编码。当对每个符号开始编码过程时,其上下文由a的的上下文决定模块的形成。

2.4 基于符号的编码

        在基于符号或基于记号的编码中,一幅图像被表示为多幅频繁发生的子图像的一个集合,称为符号。每个这样的符号都存储在一个符号字典中,且该图像以一个三元组 

[(x_{1},y_{1},t_{1}),(x_{2},y_{2},t_{2).....]的集合来编码,其中,每个(x_{i},y_{j})对规定了图像中一个符号的位置,而记号t_{1}是该符号或子图像在字典中的地址。即每个三元组表示图像中的一个字典符号的一个实例。通过仅存储一次重复的符号,可以有效地压缩图像通,特别是在文档存储和检索应用中,符号通常是重复多次的字符位图。

数字图像处理第8章——图像压缩_第10张图片

        以上图的a为例,这是简单的两级灰度图像,包含了单词banana,由三个单一符号组成a,b,n

假如b是在编码过程中识别的符号,其9*7位图存储在符号字典中的位置0内,上图b给出了标识,这样,在编码后的图像表示中,第一个三元组是(0,2,0),它指出表示b符号的矩形位图的左上角在解码图像中被放在了(0,2)上,对于a,n符号的位图被识别之后加到字典上,图像的其余部分可使用5个附加的三元组编码。只要用于定义图像中的符号的6个三元组及定义它们的3个位图小于原图像就可实现压缩。

2.5 比特平面编码

         先前提及的编码技术多用于处理多于两级灰度的图像,比特平面编码基于如下技术:把一幅多级图像分解位一系列二值图像,并使用几种熟知的二值压缩方法之一来压缩每幅二值图像。

        一幅m比特单色图像的灰度可以表示为:

基于这种特性,可以将该图像分解为二值图像集的一种简单方法是把该多项式的m个系数分离为m个1比特的比特平面。一般来讲,每个比特平面都由给其像素置一个来自原始图像每一像素的合适的比特值或多项式系数来重建。例如,一个灰度为127(二进制为:01111111)的像素与一个灰度为128(二进制:10000000)的像素相邻,每个比特平面将包含一个对应0到1的转换。

        亦或者可以通过m比特格雷码编码替代比特平面编码,其计算公式为:

二进制编码和格雷编码比特平面的JBIG2无损编码结果 

数字图像处理第8章——图像压缩_第11张图片

2.6 块变换编码 

        这项技术可以将图像分成大小相等且不重叠的小块,并使用二维变换单独地处理这些块。在块变换编码中,用一种可逆线性变换将每个块或子图像映射为变换系数集合,之后对这些变换系数进行量化和编码。

数字图像处理第8章——图像压缩_第12张图片

        上图为块变换编码系统,解码器执行(除了量化功能外)与编码器相反顺序的步骤。编码器执行4种相对简单的操作:子图像分解、变换、量化和编码。一幅大小为M×N的输人图像首先被分解为大小为n×n的子图像,然后变换这些子图以生成MNIn2个子图像变换阵列,每个阵列的大小为n×n。变换处理的目的是对每幅子图像中的像素进行去相关,或用最少数量的变换系数包含尽可能多的信息。然后,在量化阶段,以一种预定义的方式有选择性地消除或更粗略地量化那些携带最少信息的系数。这些系数对重建的子图像质量的影响最小。通过对量化后的系数进行编码来结束编码过程。

2.7 小波编码 

        小波编码基于以下概念:对图像的像素解除相关的变换系数进行编码比对原图像像素本身进行编码的效率更高。

数字图像处理第8章——图像压缩_第13张图片

        上图为一个典型的小波编码系统,为了对一幅大小为2^{J}*2^{J}的图像进行编码,选择一种分析小波\psi和最小分解级别J-P,并用于计算图像的离散小波变换。当小波具有互补的尺度函数时,可以使用快速小波变换。由于许多计算的系数携带很少的视觉信息,这些系数可以以最小的系数和编码冗余来量化和编码。

小波选择

        上图中正变换和逆变换的基所选择的小波影响着小波编码系统的设计和性能的各个方面,它们直接影响到变换的计算复杂性,或间接影响压缩和重建具有可接受误差的图像系统能力。基于小波的压缩广泛使用的展开函数是Daubechies小波和双正交小波。

分解级别的选取    

        变换分解级别的疏朗是影响小波编码计算复杂性和重建误差的另一种因素。

数字图像处理第8章——图像压缩_第14张图片

        图示展示了小波编码时分解级别对其的影响。由于P尺度快速小波变换涉及P个滤波器组的迭代,正变换和反变换计算中的操作次数会随分解级数的增加而增加。在许多应用中,存储或传送图像的分辨率和最低可用近似的尺度通常决定了变换级别的数量。

量化器设计

        影响小波编码压缩和重建误差的最重要因素是系数量化.尽管最广泛使用的量化器是均匀的,但量化的效果可以通过以下方法进一步改进:(1引入一个以零为中心的较大量化间隔,称为死区,或从一个尺度到另一个尺度自适应调整量化间隔的大小。不论哪种情况,选择的量化间隔都必须随着编码图像的比特六传送给解码器。

使用小波变换编码将原图像转换成水平的、垂直的、和对角方向的形式,并得到重构图片

img = cv2.imread('D:\\picture\\tupian.jpg', 0)

# 对img进行haar小波变换:,haar小波
cA, (cH, cV, cD) = dwt2(img, 'haar')

# 小波变换之后,低频分量对应的图像:
a = np.uint8(cA / np.max(cA) * 255)
# 小波变换之后,水平方向高频分量对应的图像:
b = np.uint8(cH / np.max(cH) * 255)
# 小波变换之后,垂直平方向高频分量对应的图像:
c = np.uint8(cV / np.max(cV) * 255)
# 小波变换之后,对角线方向高频分量对应的图像:
d = np.uint8(cD / np.max(cD) * 255)

# 根据小波系数重构回去的图像
rimg = idwt2((cA, (cH, cV, cD)), 'haar')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('原始图像'), plt.axis('off')
plt.subplot(232), plt.imshow(a, 'gray'), plt.title('低频分量'), plt.axis('off')
plt.subplot(233), plt.imshow(b, 'gray'), plt.title('水平方向高频分量'), plt.axis('off')
plt.subplot(234), plt.imshow(c, 'gray'), plt.title('垂直平方向高频分量'), plt.axis('off')
plt.subplot(235), plt.imshow(d, 'gray'), plt.title('对角线方向高频分量'), plt.axis('off')
plt.subplot(236), plt.imshow(rimg, 'gray'), plt.title('重构图像'), plt.axis('off')
plt.show()

数字图像处理第8章——图像压缩_第15张图片

2.8 JPEG-2000

        JPEG-2000扩充了流行的JPEG标准,在连续色调静止图像的压缩和压缩数据的访问方面提供了更大的灵活性。该标准以小波编码技术为基础,系数量化与单一尺度和子带相适应,并在比特平面的基础上对量化后的系数进行算术编码。

        编码过程的第一步是,通过减去2^{Size-1},对被编码的Size比特的无符号图像的样本进行直流电平平移。如果图像具有多于一个的分量:如彩色图像的红色、绿色和蓝色平面,则单独平移每个分量。如果恰好有三个分量,就可用使用一个可逆的或非可逆的线性组合来对它们有选择的进行去相关处理。

        图像经过级别平移和选择性去相关后,其分量可以被分成多个像块,这些像块是被单独处理的像素的矩形阵列。之后计算每个像块分量的行和列的一维离散小波变换,对于无误差压缩,这种变换是以双正交、5-3系数尺度-小波向量为基础的。对于非整数值变换系数还定义了一个四舍五入过程。在有损应用中,采用了9-7系数尺度-小波向量。

你可能感兴趣的:(图像处理,计算机视觉)