数字图像压缩
概述
图像压缩的目的是为了减少数字图像所占用的数据量。压缩是通过去除三个基本的数据冗余来达到的: 1. 编码冗余:采用最优码字可以达到最佳编码长度,否则就存在编码冗余。 1. 像素间冗余:一幅图像的像素间存在相关性产生冗余 1. 心理视觉冗余:人类视觉对于图像数据忽略的冗余。
压缩编码框图:

若解压缩后的图像和原始图像完全相同,则称为无损(无误差或信息保持)的压缩,否则称为有损压缩。
有损压缩的误差,定义为:
\[ e(x,y)=\hat{f}(x,y)-f(x,y) \]
两幅图像之间的总误差常常用均方根误差\(e_{rms}\)来表示:
\[ e_{rms}=\left[\frac{1}{MN} \sum_{x=0}^{M-1} \sum_{y=0}^{N-1}\left[\hat{f}(x,y)-f(x,y)\right]^2\right]^{1/2} \]
压缩比:
\[ C_R=\frac{n_1}{n_2} \]
编码冗余
假设一幅4色图像,各个象素级出现的概率和编码如下:

第一种编码为定长编码,平均每个像素需要用2个比特来表示。第二种编码是变长编码,平均每个像素需要的比特数为:
\[ L_{avg}=\sum_{k=1}^{4}l_2(k)p_r(r_k)=3\times 0.1875+1\times 0.5+3\times 0.125+2 \times 0.1875=1.8125 \]
压缩比为
\[ C_r = 2 / 1.8125 = 1.103 \]
表示一幅图像,至少需要多少比特?概率为P(E)的随机事件E包含的信息量为:
\[ I(E) = log\frac{1}{P(E)} = -log P(E) \]
一组不相关的随机事件,所包含的总信息量为:
\[ H=-\sum_{j=1}^{J}P(a_j)log P(a_j) \]
对于图像来说,平均每个像素所包含的信息量为
\[ H = -\sum_{k=1}^{L}p_r(r_k)log p_r(r_k) \]
霍夫曼码

计算码表
p = [0.1875 0.5 0.125 0.1875];
c = huffman(p)
对图像进行编码
hf = mat2huff(f);
解码
f = huff2mat(hf);
像素间冗余

计算两幅图像的信息熵,以及比较霍夫曼编码后的压缩比,可以发现两幅图像的信息熵和压缩比都是差不多的。但是我们观察图像明显可以发现,下图中的火柴排列明显有规律,应该有更多的信息冗余。

其中
\[ e_n=f_n-\hat{f}_n \]
\(\hat{f}_n\)可以由各种方法生成。通常:
\[ \hat{f}_n=round\left[ \sum_{i=1}^{m} \alpha_i f_{n-i} \right] \]

心理视觉冗余
例如将256级灰度图像压缩成16级灰度图像。采用不同的量化方法,产生不同的效果:

igs的原理是将前一个像素的量化误差,在下一个像素的量化中进行弥补。
q = quantize(f, 4, 'igs');
综合前面的方法,我们可以进一步提高压缩效率:
q = quantize(f, 4, 'igs');
qs = double(q) / 16;
e = mat2lpc(qs);
c = mathuff(e);
imratio(f, c)
JPEG压缩

- 把图像分割成8x8的像素块。
- 所有像素减去2^(m-1)
- 进行二维离散余弦变换
- 得到的系数进行归一化和量化\(\hat{T}(u,v)=round\left[\frac{T(u,v)}{Z(u,v)}\right]\)

