数字图像处理知识点梳理——第八章 图像压缩

本文详细介绍了图像压缩的基本原理,包括编码冗余、空间冗余和时间冗余的概念。通过霍夫曼编码、算术编码和LZW编码等方法实现数据压缩,以及预测编码利用像素间相关性减少数据量。此外,还探讨了数字图像水印在版权保护中的应用。
摘要由CSDN通过智能技术生成

基础知识

什么是图像压缩?

数据压缩指的是对一定的信息量(发生概率的对数值),我们用少量的数据量来进行表示。其中,相同数量的信息可以用不同数量的数据表示。

从信息论的角度来看,描述信息源的数据是信息和数据冗余之和,包含不相关或重复信息的表示称之为冗余数据
数 据 冗 余 : R = 1 − 1 / C 数据冗余:R=1-1/C R=11/C

压 缩 率 : C = b / b ′ 压缩率:C=b/b' C=b/b

二维灰度阵列有三种主要类型的数据冗余:

  1. 编码冗余
  2. 空间和时间冗余
  3. 不相关信息

我们在对图像进行处理的时候,希望能用少量的数据表示定量的信息,因此就需要尽可能减少数据冗余,进行数据压缩。

1、编码冗余

编码冗余指在大多数灰度阵列中,用于表示灰度的8比特编码所包含的比特数要比表示该灰度所需要的比特数多。

建设一个离散随机变量表示图像的灰度,每个变量发生的概率为
p r ( r k ) = n k M N , k = 0 , 1 , 2 , ⋯   , L − 1 p_{r}\left(r_{k}\right)=\frac{n_{k}}{M N}, k=0,1,2, \cdots, L-1 pr(rk)=MNnk,k=0,1,2,,L1
则每个像素所需的平均比特数为:
L a v g = ∑ k = 0 L − 1 l ( r k ) p r ( r k ) L_{\mathrm{avg}}=\sum_{k=0}^{L-1} l\left(r_{k}\right) p_{r}\left(r_{k}\right) Lavg=k=0L1l(rk)pr(rk)
即给各个灰度级分配的码字的平均长度,可通过对用于表示每个灰度的比特数与该灰度出现的概率的乘积求和来得到。

等长编码:所有的带编码的信息都用同样长的编码表示

变长编码:因为带编码的事物出现的频率不一样,频繁出现的用短的编码,不频繁出现的用长的编码。变长编码可能使解码产生二义性。

例如:
在这里插入图片描述

在此例中,如果使用8比特定长编码表示4种可能的灰度,则编码的平均比特数是8比特,数据冗余是77.4%,采用变长编码时,平均比特数是1.81比特,压缩率减少,数据冗余变大。

当用自然二进码表示一幅图像的灰度时,编码冗余几乎总是存在,当对事件集合(例如灰度值)分配码时,如果不取全部事件概率的优势,就会出现编码冗余。

2、空间冗余和时间冗余

空间冗余(帧内预测)指大多数二维灰度阵列中,由于每个像素类似于或取决于相邻像素,所以一些像素的信息就被重复定义了,造成了冗余。

在静态图片中,规则物体和规则背景的表面的物理特性都有相关性,可根据某一像素的信息预测周围像素的信息,因此可进行数据压缩。

时间冗余(帧间预测)指在视频序列中,时间相关的像素的信息被重复定义,造成冗余。

在连续图像中,位于时间轴区间的连续画面,相邻帧或相邻场的图像中,在对应位置的像素之间,亮度和色度信息之间有极强的相关性,所以可根据当前帧的信息预测后一帧的信息,因此可进行数据压缩。

3、不相关的信息

不相关的信息指大多数二维灰度阵列中,一些被人类视觉系统忽略或与用途无关的信息,因为没有被利用,所以视为冗余。

压缩准则及压缩过程

1. 信息的度量

我们把某个信息出现的不确定性的大小定义为自信息(自信息同时表示这个信息所包含的信息量,也就是最大能够给予收信者的信息量),用这个信息出现的概率的对数的负值来表示:
I ( E ) = log ⁡ 1 P ( E ) = − log ⁡ P ( E ) I(E)=\log \frac{1}{P(E)}=-\log P(E) I(E)=logP(E)1=logP(E)
信息熵表示信源的平均不确定性的大小,定义为自信息的统计平均:
H = − ∑ j = 1 J P ( a j ) log ⁡ P ( a j ) H=-\sum_{j=1}^{J} P\left(a_{j}\right) \log P\left(a_{j}\right) H=j=1JP(aj)logP(aj)
香农第一定理(即无失真变长信源编码定理)是一个关于码长的极限定理,将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。

2. 保真度准则:

为了量化丢失的图像信息,我们引入客观保真度准则和主观保真度准则。

3. 图像压缩模型:

通信系统模型图:

在这里插入图片描述

图像压缩由两个不同的功能部分组成:编码器和解码器。

编码器进行压缩,解码器进行解压缩。

信源编码提高通信系统的有效性

信道编码提高通信系统的可靠性

通用图像压缩系统的功能方框图:
在这里插入图片描述

基本的压缩方法

在这里插入图片描述

本节中我们主要列出了霍夫曼编码、算术编码、LZW编码、预测编码。

霍夫曼编码

霍夫曼编码过程对一组符号产生最佳编码,其概率服从一次只能对一个符号进行编码的限制,是一种分组码。

编码思路:根据频率的不同使用变长编码,高频率用短编码,低频率用长编码。

二元霍夫曼编码不唯一:

每次对信源缩减时,概率最小的两个信源符号0和1是可以互换的,所以可得到不同的霍夫曼码;

对信源缩减时,如果两个概率最小的信源符号合并后的概率与其他信源符号的概率相同,则在缩减信源中进行概率排序的次序可以是任意的,因此可得到不同的霍夫曼码。

算术编码

霍夫曼编码虽然是个比较实用、高效的编码方法,但对于信源符号个数不多且概率分布比较均匀的信源,需要对较长的信源符号序列进行编码才能得到较高的编码效率,所以需要预先计算信源符号序列的概率分布。因此引出算术编码。

算术编码是一种非分组码,可以直接对输入的信源符号序列编码输出。

编码思路:给出一个区间,当消息中的符号数量增加时,用于表示消息的间隔会变小,而表示该间隔所需的信息单位的数量会变大,即消息的每个符号根据其出现的概率来减少该区间的大小。

LZW编码

霍夫曼码和算数码的编码效率已经非常高,而且实现也不是很困难,但在信源统计特性不可知时就需要用到自适应性能的通用编码方法,LZW就是一种高效的通用编码,是一种基于字典的编码方法。这种编码方法现在已成6为计算机文件压缩的标准算法。

编码思路:LZW编码使用的时定长编码,通常将几个值合并在一起使用一个编码来降低总长度,即将输入的变长模式(字符串)生成一张定长的编码编译表。

对于非平稳信源具有较好的处理效果;

对于平滑且噪声小的信源具有较高的压缩比,且压缩解压缩速度快;

对于数据流中连续重复出现的字节和字串,具有有很高的压缩比

常用于图像数据的压缩处理和文本程序等领域的数据压缩。

预测编码

预测编码不需要较大的计算开销就可以实现较好的压缩效果,并且可以是无误差的或有损的压缩。

编码思路:利用前面的一个或多个信号对下一个信号进行预测,然后对实际值和预测值的差(预测误差)进行量化编码。参与预测的符号越多,预测越准确,该信元的不确定性越小,数码率就可以降的越低。

编译器输出的不是样本的真实值,而是真实值与预测值的差。在译码端,译码器将接收到的这一差值与译码器的预测值相加,从而恢复信源符号。

数字图像水印

将一条或多条信息项插入到潜在的易受攻击的图像中,可阻止非法复制图片,这个信息项就称为水印,水印不能从图像本身分离出来。

数字图像水印涉及信息编码,前面压缩的内容时减少用于图像的数据量,水印处理时在图像上添加信息和数据。

水印本身可以是完全可见或不可见的。

可见水印是一幅不透明的或半透明的子图像,或放在另一幅图像之上的图像。表示为未加水印图像f和水印w的线性组合:
f w = ( 1 − α ) f + α w f_{w}=(1-\alpha) f+\alpha w fw=(1α)f+αw
常数α控制水印和衬底图像的相对可见性。α∈[0,1],α=1时,水印不透明,衬底图像完全是暗的;α越接近于0,会逐渐看到更多的衬底图像和更少的水印。

在这里插入图片描述

import cv2
from PIL import Image
import matplotlib.pyplot as plt

def add_watermark_to_image(image, watermark):
  rgba_image = image.convert('RGBA')
  rgba_watermark = watermark.convert('RGBA')
  
  image_x, image_y = rgba_image.size
  watermark_x, watermark_y = rgba_watermark.size
  
  # 缩放水印图片
  scale = 3
  watermark_scale = max(image_x / (scale * watermark_x), image_y / (scale * watermark_y))
  new_size = (int(watermark_x * watermark_scale), int(watermark_y * watermark_scale))
  rgba_watermark = rgba_watermark.resize(new_size, resample=Image.ANTIALIAS)
  # 透明度
  rgba_watermark_mask = rgba_watermark.convert("L").point(lambda x: min(x, 180))
  rgba_watermark.putalpha(rgba_watermark_mask)
  # 水印位置
  rgba_image.paste(rgba_watermark, (image_x - watermark_x,image_y - watermark_y ), rgba_watermark_mask) 
  return rgba_image

im_before = Image.open('C:/Users/13121/Desktop/0.jpg')

plt.subplot(131)
plt.imshow(im_before)
plt.title("Origin picture")

im_watermark = Image.open('C:/Users/13121/Desktop/1.jpg')


plt.subplot(132)
plt.imshow(im_watermark)
plt.title("watermark picture")

im_after = add_watermark_to_image(im_before, im_watermark)


plt.subplot(133)
plt.imshow(im_after)
plt.title("after picture")

plt.tight_layout()
plt.show()

不可见水印是裸眼看不见的,需要一个合适的解码算法才能恢复。不可见性是通过作为可见的冗余信息插入水印来保证的。表示为:
f w = 4 ( f 4 ) + w 64 f_{w}=4\left(\frac{f}{4}\right)+\frac{w}{64} fw=4(4f)+64w

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值