跳转到内容

英文维基 | 中文维基 | 日文维基 | 草榴社区

图像压缩

本页使用了标题或全文手工转换
维基百科,自由的百科全书

图像压缩数据压缩技术在数字图像上的应用,目的是减少图像数据中的冗余信息,从而用更加高效的格式存储和传输数据。

压缩的原理

[编辑]

资料越一致,代表统计特性越集中,包括傅立叶转换域(Fourier transform domain)、直方图(histogram)、特征值(eigenvalue)......等方面的集中度。压缩的通则即是利用资料的一致性,越一致的资料,越能够进行压缩。除此之外,也可利用资料的规则性与可预测性来对其作压缩。通常而言,若可以用比较精简的自然语言来描述一个东西,那么也就越能够对这个东西作压缩。

利用资料的特性作压缩

[编辑]
  • 文章:常用字或字母(字母多出现E,少出现QXZ)。
  • 歌曲:重复的旋律、频率的倍频关系、节拍内频率的稳定。
  • 声音:能量多集中在低频、频率在短区间内的稳定。
  • 卡通:每块区域的边缘(edge)资讯与颜色(color)、边缘(edge)资讯可以用较少参数编码(如果边缘(edge)是几何图案)。

资料压缩范例

[编辑]
  • 声音:MP3(.mp3),压缩率约1/3。
  • 图片:JPEG(.jpg),压缩率约1/10(灰阶)或1/20(彩色,利用4:2:0)。
  • 影片:MPEG(H.264、H.265),压缩率约1/30(灰阶)或1/60(彩色)。

影像的一致性

[编辑]

空间上的一致性

[编辑]

影像中每一点的值,会和相邻的点的值非常接近。

直方图(histogram)是统计出现次数的一种方法,它会去计算一个向量(vector)或一个矩阵(matrix)当中,有多少个点会等于某一个值。

举例来说,

的直方图(histogram)为

将影像相临值的差异,利用直方图(histogram)来统计,会发现值几乎都落在0附近。

频率上的一致性

[编辑]

一张影像的频谱大多集中在低频的地方。 影像的“频率”是在空间域(space domain)作分析:

  • 低频成分代表变化较为缓和的地方,对应的是影像的“颜色”(color)“强度”(intensity)
  • 高频成分代表变化较为剧烈的地方,对应的是影像的“边缘”(edge)“杂讯”(noise)


常用影像压缩技术

[编辑]

压缩的技术分成两种:失真压缩(lossy compression)的压缩率较高,但无法重建原来的资料,例如:DFT、DCT、KLT(搭配量化(quantization)与截断(truncation))、4:2:2或4:2:0、多项式曲线的近似(polynomial approximation);无失真压缩(lossless compression)的压缩率较低,但可以重建原来的资料,例如:二元编码(binary coding)、霍夫曼编码(Huffman coding)、算术编码(arithmetic coding)、格伦布编码 (Golomb coding)。

4:2:2或4:2:0

[编辑]

此技术运用的是空间上的一致性

将像素(pixel)的RGB值,利用以下的公式转换成YCbCr

Y = 0.299 R + 0.578 G + 0.114 B

Cb = -0.169 R - 0.331 G + 0.500 B ( Cb = 0.565 (B - Y) )

Cr = 0.500 R - 0.419 G - 0.081 B ( Cr = 0.713 (R - Y) )

其中 Y 是亮度(Luminance),Cb是蓝色色差(chrominance) ,Cr 是红色色差(chrominance)。

人类的视觉系统,对于亮度比较敏感,而对于彩度比较不敏感。 因此我们可以利用人类视觉的特性,减少Cb、Cr的取样个数,取样格式有4:2:2 与 4:2:0两种。

假设一张图片原本压缩前(即4:4:4)的Y、Cb、Cr各有M×N个值,4:2:2的压缩Y保留为M×N个值、Cb、Cr则取样到各剩下M/2×N个值;4:2:0的压缩Y同样保留为M×N个值、Cb、Cr则进一步取样到各剩下M/2×N/2个值。 从4:4:4到4:2:2,压缩率约为2/3;从4:4:4到4:2:0,压缩率约为1/2。 从4:4:4压缩到4:2:2,再压缩到4:2:0,单一像素(pixel)储存的bit 数可以等效为:24 bits/pixel → 16 bits/pixel → 12 bits/pixel。

还原时,则是利用插值(interpolation)的方式:

= 1/2 ×( + )


8×8 离散馀弦转换(DCT)

[编辑]

此技术运用的是频率上的一致性

通常我们会将影像切成8×8的方格作离散馀弦转换(DCT),原因如下:

  • 一张影像的每个区块,其高低频成分都不一样,对整张影像直接作离散馀弦转换(DCT),多少会有高频成分的出现。如果切成8×8的方格,则对大部分的方格几乎都没有高频成分。
  • 降低记忆体的需要量
  • 降低运算量

经过离散馀弦转换(DCT)后的8×8矩阵称为DCT矩阵。DCT矩阵最左上角的系数称为直流(DC)成分,而其他63个系数则称为交流(AC)成分。越靠近DC值的AC值系数表示频率较低的部分,而越往右下角方向的AC值代表的频率则越高。

2D的8×8 DCT的输出通常会按照"zigzag"的顺序,将2D转为1D的型态。按照此顺序排列,能量可能较大的会被摆在前面,而后面的高频成分从某个值开始后几乎为零,以符号EOB(end of block)表示,指后面的高频的部分经过量化(quantization)之后皆为0。

差分编码(Differential coding)

[编辑]

此技术运用的是空间上的一致性

差分编码指的是,除第一个元素外,将其中各元素都表示为各该元素与其前一元素的差的编码。

,是针对 - 去编码, 而不是直接对作编码。

霍夫曼编码(Huffman coding)

[编辑]

霍夫曼编码(Huffman coding)的编码原则:(Greedy Algorithm)

  • 所有的码皆在编码树(coding tree)的端点,再下去没有分枝。满足唯一可解译码(uniquely decodable code)即时可解码(instantaneous decodable code)
  • 机率越大的,编码长度(code length)越短;机率越小的,编码长度(code length)越长。
  • 假设 是第L层的节点(node), 是第L+1层的节点(node),则 >= 必须满足。

不满足以上的条件则往上推一层。

算术编码(Arithmetic coding)

[编辑]

霍夫曼编码(Huffman coding)是将每一笔资料分开编码,算术编码(Arithmetic coding)则是将多笔资料一起编码,因此压缩效率比霍夫曼编码(Huffman coding)更高,近年来的压缩资料大多使用算术编码(Arithmetic coding)。

  • 范例:

假设要对X来作二进位的编码,且经过事先的估计, 的机率为0.8, 的机率为0.2。

若实际上输入的资料为

Initial():lower =0,upper=0.8

When i = 2 ():lower =0,upper=0.64

When i = 3 ():lower =0,upper=0.512

When i = 4 ():lower =0.4096,upper=0.512

When i = 5 ():lower =0.4096,upper=0.49152

When i = 6 ():lower =0.4096,upper=0.475136

由于 lower =0.4096,upper=0.475136

lower <= 14* < 15* <= upper

所以编码的结果为

动态影像之编码

[编辑]

MPEG(Moving Picture Experts Group)为动态影像编码的国际标准。 动态影像编码的使用原理为:不同时间,同一个像素(pixel)之间的相关度通常极高,只需对有移动的物件(objects)记录移动向量(motion vector)

:时间为t的影像

如何由 来预测

(1)移动向量

(2)预测

=

(3)计算“预测误差”

= -

对预测误差 作编码。

影像档案的处理(Matlab)

[编辑]

基本概念

[编辑]
  • 灰阶影像在Matlab 当中是一个矩阵,彩色影像在Matlab 当中是三个矩阵,分别代表红色(Red)、绿色(Green)、蓝色(Blue)。

.bmp: 没有经过任何压缩处理的图档

.jpg: 有经过JPEG 压缩的图档

  • 要对影像做运算时,要先变成double的格式,否则电脑会预设影像为integer 的格式,在做浮点运算时会产生误差。

例如,若要对影像做2D离散傅立叶转换(Discrete Fourier transform):

im=imread('C:\Program Files\MATLAB\pic\Pepper.bmp');

im=double(im);

Imf=fft2(im);

基本指令

[编辑]
  • Image 档读取: imread
  • Image 档显示: imshow, image, imagesc
  • Image 档制作: imwrite
  • Video 档读取: aviread

范例

[编辑]
  • 黑白影像

im=double(imread('C:\Program Files\MATLAB\pic\Pepper.bmp'));

(如果Pepper.bmp 是个灰阶图,im 将是一个矩阵)

size(im);

(用size 这个指令来看im 这个矩阵的大小)

image(im);

colormap(gray(256));

  • 彩色影像

im2=double(imread('C:\Program Files\MATLAB\pic\Pepper512c.bmp'));

size(im2);

(由于这个图档是个彩色的,所以im2 将由三个矩阵复合而成)

压缩方法

[编辑]

图像压缩可以是有损数据压缩也可以是无损数据压缩。常见的应用有raw和tiff格式等。gif和jpeg是有损压缩。通过DCT变换后选择性丢掉人眼不敏感的信号分量,实现高压缩比率。

无损压缩

[编辑]

对于如绘制的技术图、图表或者漫画,优先使用无损压缩,这是因为有损压缩方法,尤其是在低的位速条件下,将会带来压缩失真,如医疗图像或者用于存档的扫描图像……等,这些有价值的内容的压缩也尽量选择无损压缩方法。

有损压缩

[编辑]

有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。

特性

[编辑]

图像压缩的目的就是在给定位速或者压缩比下实现最好的图像质量。但是,还有一些其它的图像压缩机制的重要特性:

  • 可扩展编码 :又称渐进编码、嵌入式位流,通常表示操作位流和文件产生的质量下降(没有解压缩和再压缩)。尽管具有不同的特性,在无损编码中也有可扩展编码,它通常是使用粗糙到精细像素扫描的格式。尤其是在下载时预览图像(如浏览器中)或者提供不同的图像质量访问时(如在数据库中)可扩展编码非常有用,有几种不同类型的可扩展性:
    • 质量渐进:又称层渐进,位流渐进更新重建的图像。
    • 分辨率渐进:首先在低分辨率编码图像,然后编码与高分辨率之间的差别。
    • 成分渐进:首先编码灰度数据,然后编码彩色数据。
  • 感兴趣区域编码:图像某些部分的编码质量要高于其它部分,这种方法可以与可扩展编码组合在一起(首先编码这些部分,然后编码其它部分)。
  • 元数据信息:压缩数据可以包含关于图像的信息用来分类、查询或者浏览图像。这些信息可以包括颜色、纹理统计信息、小预览图像以及作者和版权信息。

压缩方法的质量经常使用峰值信噪比来衡量,峰值信噪比用来表示图象有损压缩带来的噪声。但是,观察者的主观判断也认为是一个重要的、或许是最重要的衡量标准。

参见

[编辑]

参考文献

[编辑]

Jian-Jiun Ding, “Advanced Digital Signal Processing”, NTU, 2021.