## page was renamed from 图像如何压缩 ## page was renamed from 图像如何编码 == 概述 == 图像压缩的目的是为了减少数字图像所占用的数据量。压缩是通过去除三个基本的数据冗余来达到的: 1. 编码冗余:采用最优码字可以达到最佳编码长度,否则就存在编码冗余。 1. 像素间冗余:一幅图像的像素间存在相关性产生冗余 1. 心理视觉冗余:人类视觉对于图像数据忽略的冗余。 压缩编码框图: {{attachment:figure81.png}} 若解压缩后的图像和原始图像完全相同,则称为无损(无误差或信息保持)的压缩,否则称为有损压缩。 有损压缩的误差,定义为:{{{#!latex $$e(x,y)=\hat{f}(x,y)-f(x,y)$$ }}} 两幅图像之间的总误差常常用均方根误差<>来表示:{{{#!latex $$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}$$ }}} 压缩比: {{{#!latex $C_R=\frac{n_1}{n_2}$ }}} == 编码冗余 == 假设一幅4色图像,各个象素级出现的概率和编码如下: {{attachment:figure82.png}} 第一种编码为定长编码,平均每个像素需要用2个比特来表示。第二种编码是变长编码,平均每个像素需要的比特数为:{{{#!latex $$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$$ }}} 压缩比为{{{#!latex $$C_r = 2 / 1.8125 = 1.103$$ }}} 表示一幅图像,至少需要多少比特?概率为P(E)的随机事件E包含的信息量为:{{{#!latex $$I(E) = log\frac{1}{P(E)} = -log P(E)$$ }}} 一组不相关的随机事件,所包含的总信息量为:{{{#!latex $$H=-\sum_{j=1}^{J}P(a_j)log P(a_j)$$ }}} 对于图像来说,平均每个像素所包含的信息量为{{{#!latex $$H = -\sum_{k=1}^{L}p_r(r_k)log p_r(r_k)$$ }}} === 霍夫曼码 === {{attachment:figure83.png}} 计算码表 {{{ p = [0.1875 0.5 0.125 0.1875]; c = huffman(p) }}} 对图像进行编码 {{{ hf = mat2huff(f); }}} 解码 {{{ f = huff2mat(hf); }}} == 像素间冗余 == {{attachment:figure84.png}} 计算两幅图像的信息熵,以及比较霍夫曼编码后的压缩比,可以发现两幅图像的信息熵和压缩比都是差不多的。但是我们观察图像明显可以发现,下图中的火柴排列明显有规律,应该有更多的信息冗余。 {{attachment:figure85.png}} 其中{{{#!latex $$e_n=f_n-\hat{f}_n$$ }}} <>可以由各种方法生成。通常:{{{#!latex $$\hat{f}_n=round\left[ \sum_{i=1}^{m} \alpha_i f_{n-i} \right]$$ }}} {{attachment:figure86.png}} == 心理视觉冗余 == 例如将256级灰度图像压缩成16级灰度图像。采用不同的量化方法,产生不同的效果: {{attachment:figure87.png}} 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压缩 == {{attachment:figure88.png}} * 把图像分割成8x8的像素块。 * 所有像素减去2^(m-1) * 进行二维离散余弦变换 * 得到的系数进行归一化和量化<> * {{attachment:figure89.png}} {{attachment:figure810.png}}