FIASCO—开源分形图像和序列编解码器

作者:Ullrich Hafner

一张图片胜过千言万语——一句经常用来引出数字图像处理需求的话。 实际上,我们生活中方方面面都受到了数字图像的影响。 例如,在万维网上,不仅静态图片,而且小型视频序列也被用来增强网页的设计。 然而,数字图像的使用有一个主要的缺点。 每次请求图像或视频时,都必须传输和存储大量数据。

例如,一个高清晰度电视 (HDTV) 屏幕(分辨率为 1280x720 像素,每像素 24 位)的单帧未压缩帧需要超过 2MB 的内存。 当假设每秒 60 帧的显示速率 (HDTV) 时,一秒钟的视频电影已经需要超过 165MB,一部 120 分钟的电影总共需要 2,000 张光盘! 显然,即使像非对称数字用户线路 (ADSL) 这样的快速互联网连接现在越来越普及,下载如此未压缩的视频流也是不可能的。

因此,像 FIASCO 这样的图像和视频压缩系统——分形图像和视频编解码器——对于处理如此庞大的数据量是必不可少的。

图像和视频压缩

有不同的解决方案适用于压缩图像数据:例如,可以降低帧的分辨率以及帧速率。 然而,这种降低是不够的。 一般来说,图像序列通常包含三种不同类型的冗余,可以加以利用(参见“资源”部分)

  • 空间冗余,这是由于相邻像素之间的相关性造成的

  • 光谱冗余,这是由于不同颜色带(红色、绿色和蓝色分量)之间的相关性造成的

  • 时间冗余,这是由于后续视频帧之间的相关性造成的

任何图像压缩系统的目标是识别和消除这些冗余。 以下两种压缩方法被广泛使用

  • 无损或可逆:解码后的图像在数值上与原始图像相同(文件大小通常减少 50%); 如果图像需要进一步进行计算处理,这将非常有用

  • 解码后的图像包含或多或少的伪影(文件大小小于原始数据量的 10%); 这在低比特率应用(如万维网)中非常有用

因此,有损压缩对于极低比特率的互联网视频应用 (16-64KBps) 是必不可少的。 在过去的十年中,涌现了几个有损图像和视频编码标准,例如 JPEG、MPEG 和 H.263。 这些标准中的大多数都进行了改进,以纳入当前该领域研究的成果,例如 JPEG2000、MPEG-4 和 H.263+(参见“资源”部分)。 此外,还研究了许多新的算法,尽管它们非常有吸引力,但尚未成为标准。 基于小波的图像编码器目前定义了图像编码的最新技术水平。 然而,这些编解码器仍然存在解码器运行时速度慢的问题,使得(基于软件的)实时视频解码几乎不可能。 此外,大多数新方法都受到专利和专有格式的保护,禁止开源解决方案。
图像压缩算法

FIASCO——分形图像和序列编解码器——旨在替代 JPEG 和 MPEG 用于极低比特率(参见“资源”部分)。 它提供以下功能

  • 最先进的图像和视频压缩(集成在一个应用程序中)

  • 基于软件的实时解码

  • 开源实现

FIASCO 压缩图像通常比 JPEG 文件小得多(在低比特率下),同时图像质量仍然可以接受。 例如,请参见图 1,您可以在其中看到由 JPEG 和 FIASCO 压缩的图像(图 1A 和 1B 中为 1:220,图 1C 和 1D 中为 1:100 的压缩比,即原始文件大小的 0.5% 和 1%)。

FIASCO—An Open-Source Fractal Image and Sequence Codec

图 1A. FIASCO 1:220

FIASCO—An Open-Source Fractal Image and Sequence Codec

图 1B. JPEG 1:220

FIASCO—An Open-Source Fractal Image and Sequence Codec

图 1C. FIASCO 1:100

FIASCO—An Open-Source Fractal Image and Sequence Codec

图 1D. JPEG 1:100

图 1. JPEG 和 FIASCO 压缩的比较

FIASCO 的编码方法基本上是 JPEG 方法的直接推广。 JPEG 算法将图像细分为一组 8x8 像素的图像块。 然后,这些块中的每一个都通过 64 个基图像(余弦基,详见“资源”部分)的线性组合独立编码,如图 2 所示。 然后,这些块近似的系数被量化并存储在输出文件中。

FIASCO—An Open-Source Fractal Image and Sequence Codec

图 2. JPEG 压缩算法

在图 2 中,图像被细分为 8x8 像素块。 它们中的每一个都通过余弦基的线性组合来近似。 然后,近似系数(图中的 a 和 b)被量化并存储在 JPEG 文件中。 FIASCO 通过以下方式扩展了这个概念

  1. 图像被自适应地细分为不同大小的子块(正方形或矩形)。 在平滑区域中使用比困难区域更小的块。

  2. 每个图像块都由动态字典的图像块近似。 该字典不仅包含一组固定的基图像(例如,众所周知的 JPEG 余弦图像),还包含所有先前编码的图像块。 这种方法与文本压缩算法有关,文本压缩算法也使用动态生成的字典(例如,LZW 压缩)。

  3. 当编码视频时,只有后续帧之间的差异通过分层运动补偿进行编码。

FIASCO 利用单张图片以及图片序列中的自相似性来消除空间、光谱和时间冗余,使其成为典型的分形编码方法。

FIASCO 源代码包

FIASCO 软件包根据 GNU 通用公共许可证的条款发布,并由命令行应用程序和一个库组成,用于压缩、解码和可视化图像和视频。 您只需运行典型的 GNU 构建过程 (./configure;make;make install) 即可编译和安装 FIASCO 软件包。 FIASCO 完全用 ANSI C 编写,应该可以在大多数 UNIX 平台上编译。

命令行应用程序

命令行 FIASCO 编码器和解码器的使用方式类似于 IJPEG 软件包(Independent JPEG group)的 cjpegdjpeg 应用程序,它们应该是每个 Linux 发行版的一部分。

cfiasco --quality=10 --output=video.fco frame0*.ppm

以上命令使用质量等级 10 对给定的视频文件(原始 PNM 格式)进行编码,并写入单个 FIASCO 文件 video.fco。 请注意,您不能将 FIASCO 的质量设置与 JPEG 进行比较。 FIASCO 的典型质量范围是 1-100,这对应于小于 5 的 JPEG 质量。 FIASCO 仅适用于极低比特率; 也就是说,您无法计算对应于 75 的 JPEG 质量的压缩图像。

dfiasco,FIASCO 解码器,也像 djpeg 一样使用

dfiasco --output=image.ppm image.fco

这将解码给定的 FIASCO 文件,并以 PNM 格式写入新图像。 但是 dfiasco 还包含一个显示模块,用于在 X11 窗口中显示视频帧。 目前,只有一个基于 Xlib 的窗口,带有典型的一组控制按钮(播放、停止、前进等)。 希望这个简单的解码器和 FIASCO 库为开发人员提供了一个良好的起点,以在其喜爱的图像和视频程序(Mozilla、GIMP 等)中支持 FIASCO 格式。 请访问 FIASCO 的主页以获取一些压缩图像和视频(参见“资源”部分)。

压缩库

FIASCO 的编码和解码功能在一个共享库中提供。 数据类型定义和函数原型由包含文件 fiasco.h 提供,该文件安装在 $prefix/include 目录中。

您可以通过函数调用在您的应用程序中简单地压缩图像或视频

fiasco_coder (image_names, fiasco_name, quality, NULL)

此调用使用预定义的近似 quality (1.0-100.0) 压缩由数组 image_names 给出的图像文件,并创建新的 FIASCO 输出文件 fiasco_name。 可以通过使用可选的参数对象来调整几个高级压缩参数,我在这里不描述,请参阅 FIASCO 手册页以了解详细信息。

为了在您的应用程序中解码 FIASCO 文件,您必须使用构造函数 fiasco_decoder_new (fiasco_name, NULL) 的调用实例化解码器类 fiasco_decoder_t 的对象。 fiasco_name 指定要解码的文件,而第二个参数是可选的参数对象,用于调整解码器的行为。

然后通过后续调用方法 fiasco_decoder_get_frame 来解码单个帧。 这些帧以内部 FIASCO 格式返回,然后可以以不同的方式渲染以满足您的应用程序的需求。 有关压缩库的更多信息,请参阅 FIASCO 随附的手册页。

结论

FIASCO 提供了一个强大的压缩库,旨在替代 JPEG 和 MPEG 用于低比特率应用。 FIASCO 是一种非对称压缩方法; 您可以以较慢的编码时间为代价获得基于软件的实时解码。 FIASCO 特别适用于图像或视频仅压缩一次但被请求和解码多次的应用场景(例如,万维网应用程序)。 最后,如果将 FIASCO 与开源声音和语音压缩(例如 Vorbis,参见“资源”部分)结合使用,则可以免费获得完整的低比特率视频压缩系统。

资源

@aa:Ullrich Hafner (hafner@bigfoot.de, ulli.linuxave.net) 自 1999 年以来一直是德国软件管理与设计公司 (sd&m) 的软件工程师。 他为他的博士论文 Low Bit-Rate Image and Video Coding with Weighted Finite Automats (参见“资源”部分)开发了 FIASCO,时间为 1994 年至 1999 年。

FIASCO—An Open-Source Fractal Image and Sequence Codec
加载 Disqus 评论