图像压缩研究

来源:互联网 发布:华元宠物用品淘宝真假 编辑:程序博客网 时间:2024/05/27 10:44

常用的图像的压缩方法有以下几种:

1、  行程长度编码(RLE)

 

  行程长度编码(run-lengthencoding)是压缩一个文件最简单的方法之一。

它的做法就是把一系列的重复值(例如图象像素的灰度值)用一个单独的值再加上

一个计数值来取代。比如有这样一个字母序列aabbbccccccccdddddd它的行程长度

编码就是2a3b8c6d。这种方法实现起来很容易,而且对于具有长重复值的串的压缩

编码很有效。例如对于有大面积的连续阴影或者颜色相同的图象,使用这种方法压

缩效果很好。很多位图文件格式都用行程长度编码,例如TIFF,PCX,GEM等。

 

2、LZW编码

 

  这是三个发明人名字的缩写(Lempel,Ziv,Welch),其原理是将每一个字节

的值都要与下一个字节的值配成一个字符对,并为每个字符对设定一个代码。当同

样的一个字符对再度出现时,就用代号代替这一字符对,然后再以这个代号与下个

字符配对。

LZW编码原理的一个重要特征是,代码不仅仅能取代一串同值的数据,也能够代替

一串不同值的数据。在图像数据中若有某些不同值的数据经常重复出现,也能找到

一个代号来取代这些数据串。在此方面,LZW压缩原理是优于RLE的。

 

3、霍夫曼编码

 

  霍夫曼编码(Huffmanencoding)是通过用不固定长度的编码代替原始数据来

实现的。霍夫曼编码最初是为了对文本文件进行压缩而建立的,迄今已经有很多变

体。它的基本思路是出现频率越高的值,其对应的编码长度越短,反之出现频率越

低的值,其对应的编码长度越长。

 

  霍夫曼编码很少能达到8∶1的压缩比,此外它还有以下两个不足:①它必须精

确地统计出原始文件中每个值的出现频率,如果没有这个精确统计,压缩的效果就

会大打折扣,甚至根本达不到压缩的效果。霍夫曼编码通常要经过两遍操作,第一

遍进行统计,第二遍产生编码,所以编码的过程是比较慢的。另外由于各种长度的

编码的译码过程也是比较复杂的,因此解压缩的过程也比较慢。②它对于位的增

删比较敏感。由于霍夫曼编码的所有位都是合在一起的而不考虑字节分位,因此增

加一位或者减少一位都会使译码结果面目全非。

 

4、预测及内插编码

 

  一般在图象中局部区域的象素是高度相关的,因此可以用先前的象素的有关灰

度知识来对当前象素的灰度进行预计,这就是预测。而所谓内插就是根据先前的和

后来的象素的灰度知识来推断当前象素的灰度情况。如果预测和内插是正确的,则

不必对每一个象素的灰度都进行压缩,而是把预测值与实际象素值之间的差值经过

熵编码后发送到接收端。在接收端通过预测值加差值信号来重建原象素。

 

  预测编码可以获得比较高的编码质量,并且实现起来比较简单,因而被广泛地

应用于图象压缩编码系统。但是它的压缩比并不高,而且精确的预测有赖于图象特

性的大量的先验知识,并且必须作大量的非线性运算,因此一般不单独使用,而是

与其它方法结合起来使用。如在JPEG中,使用了预测编码技术对DCT直流系数进行

编码,而对交流系数则使用量化+游程编码+霍夫曼编码。

 

5、矢量量化编码

 

  矢量量化编码利用相邻图象数据间的高度相关性,将输入图象数据序列分组,

每一组m个数据构成一个m维矢量,一起进行编码,即一次量化多个点。根据仙农率

失真理论,对于无记忆信源,矢量量化编码总是优于标量量化编码。

 

  编码前,先通过大量样本的训练或学习或自组织特征映射神经网络方法,得到

一系列的标准图象模式,每一个图象模式就称为码字或码矢,这些码字或码矢合在

一起称为码书,码书实际上就是数据库。输入图象块按照一定的方式形成一个输入

矢量。编码时用这个输入矢量与码书中的所有码字计算距离,找到距离最近的码字

,即找到最佳匹配图象块。输出其索引(地址)作为编码结果。解码过程与之相反

,根据编码结果中的索引从码书中找到索引对应的码字(该码书必须与编码时使用

的码书一致),构成解码结果。由此可知,矢量量化编码是有损编码。目前使用较

多的矢量量化编码方案主要是随机型矢量量化,包括变换域矢量量化,有限状态矢

量量化,地址矢量量化,波形增益矢量量化,分类矢量量化及预测矢量量化等。

 

6、变换编码

 

  变换编码就是将图象光强矩阵(时域信号)变换到系数空间(频域信号)上进

行处理的方法。在空间上具有强相关的信号,反映在频域上是某些特定的区域内能

量常常被集中在一起,或者是系数矩阵的分布具有某些规律。我们可以利用这些规

律在频域上减少量化比特数,达到压缩的目的。由于正交变换的变换矩阵是可逆的

且逆矩阵与转置矩阵相等,这就使解码运算是有解的且运算方便,因此运算矩阵总

是选用正交变换来做。

 

  常用的变换编码有K-L变换编码和DCT编码。K-L变换编码在压缩比上优于

DCT编码,但其运算量大且没有快速算法,因此实际应用中广泛采用DCT编码。

 

7、模型法编码

 

  预测编码、矢量量化编码以及变换编码都属于波形编码,其理论基础是信号理

论和信息论;其出发点是将图象信号看作不规则的统计信号,从象素之间的相关性

这一图象信号统计模型出发设计编码器。而模型编码则是利用计算机视觉和计算机

图形学的知识对图象信号的分析与合成。

 

  模型编码将图象信号看作三维世界中的目标和景物投影到二维平面的产物,而

对这一产物的评价是由人类视觉系统的特性决定的。模型编码的关键是对特定的图

象建立模型,并根据这个模型确定图象中景物的特征参数,如运动参数、形状参数

等。解码时则根据参数和已知模型用图象合成技术重建图象。由于编码的对象是特

征参数,而不是原始图象,因此有可能实现比较大的压缩比。模型编码引入的误差

主要是人眼视觉不太敏感的几何失真,因此重建图象非常自然和逼真。

 

  此外,近些年来,分形编码编码和小波变换的技术也越来越多的应用在图像压

缩的领域中,但是大多仍处于研究阶段,常见的图像压缩方法仍以前面介绍的为主

。当然,在实际的应用中,多种图像压缩方法往往是结合起来使用的,如JPEG等。

 

几种图像压缩库:

1、 Thumbnailator 

Clauncher中使用了此库。

Thumbnailator 是一个用来生成图像缩略图的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。

支持:图片缩放,区域裁剪,水印,旋转,保持比例。

示例代码:

Thumbnails.of(new File("original.jpg"))

        .size(160, 160)

        .rotate(90)

        .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("watermark.png")), 0.5f)

        .outputQuality(0.8f)

        .toFile(new File("image-with-watermark.jpg"));

Thumbnailator 有多种不同的图片压缩模式,不同模式下使用不同算法,从而达到不同的压缩效果(试验中)

 

2、 ImageMagick

ImageMagick是用C语言开发图片处理程序。可以对图片进行改变大小、旋转、锐化、减色或增加特效等操作。对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。ImageMagick 的官网是:http://www.imagemagick.org/script/index.php

  直接使用java通过JNI技术调用ImageMagick的C语言接口是不行的。因为ImageMagick开发时没有使用java JNI生成的头文件。可以使用jmagick解决,jmagick是由c语言开发的,开发时使用了java JNI生成的头文件,所以java可以通过JNI技术调用jmagick。jmagick再调用ImageMagick。但是jmagick不适用于web项目,会造成tomcatcrash,因此建议使用IM4JAVA来替代jmagick。

imagemagick,尤其在linux服务器上,应该是处理图片的第一选择,因此,如果我们要建立单独的图片处理服务器的话,可以考虑使用imagemagick。

3、java-image-scaling (http://www.oschina.net/p/java-image-scaling)

可用来生成高质量的图像缩略图。但是经过试验,产生的缩略图在锐化后噪点比较严重

java.lang.NoClassDefFoundError: com/jhlabs/image/UnsharpFilter问题解决: https://code.google.com/p/java-image-scaling/issues/detail?id=12


经过试验,发现通过Thumbnailator 进行压缩后再使用ImageMagick 进行锐化,会达到最理想效果


推荐:Java 图形/图像处理开源软件    http://www.oschina.net/project/lang/19/java?tag=141&os=0&sort=time&p=1


0 0
原创粉丝点击