如何使jpeg编码器变得更有效率

时间:2014-03-06 16:59:47

标签: jpeg codec

之前我读过mozjpeg。 Mozilla的一个项目,用于创建更高效​​的jpeg编码器,即创建更小的文件。

据我所知(jpeg)编解码器,jpeg编码器需要创建使用编码方案的文件,该编码方案也可以由其他jpeg编解码器解码。那么如何在不破坏与其他编解码器的兼容性的情况下改进编解码器呢?

Mozilla确实提到他们的编码器的第一步是添加可以检测特定图像的最有效编码方案的功能,这不会破坏兼容性。但是,他们打算添加更多功能,首先是“网格量化”,这似乎是一个高度技术化的算法来做某事(我不明白)。

我也不完全确定这个队列属于堆栈溢出,它也可能适合超级用户,因为问题不是专门针对编程。因此,如果有人认为应该是超级用户,请随意移动此问题

2 个答案:

答案 0 :(得分:1)

JPEG有点独特,因为它涉及一系列压缩步骤。有两种方法可以减少图像的大小。

首先是抽样。在JPEG中,通常从RGB转换为YCbCR。在RGB中,每个组件的值相等。在YCbCr中,Y组分比Cb和Cr组分重要得多。如果以4比1对后者进行采样,则4x4像素块将从16 + 16 + 16减少到16 + 1 + 1。通过采样,您将要压缩的数据大小减少了近1/3。

另一种是量化。您可以获取采样的像素值,将它们分成8x8块并对它们执行离散余弦变换。在8bpp中,这需要8x8 8位数据并将其转换为8x8 16位数据(此时反向压缩)。

DCT过程往往会在右上角产生较大的值,在左下角产生较小的值(接近于零)。右上系数比左下系数更有价值。

然后“量化”16位值(用英文划分)。

压缩过程定义了8x8量化矩阵。将DCT系数中的相应条目除以量化矩阵中的值。因为这是整数除法,所以小值将变为零。使用游程压缩来组合长时间的零值。你获得的连续零越多,压缩就越好。

通常,左下角的量化值远高于右上角的量化值。你试图将这些DCT系数强制为零,除非它们非常大。

这是大部分损失(尽管不是全部)都来自JPEG。

权衡取舍是尽可能多地使用零而不会明显降低图像质量。

量化矩阵的选择是压缩的主要因素。大多数JPEG库为用户提供“质量”设置。这转化为编码器中的量化矩阵的选择。如果有人可以设计更好的量化矩阵,你可以获得更好的压缩。

本书用简单的英语解释了JPEG过程:

http://www.amazon.com/Compressed-Image-File-Formats-JPEG/dp/0201604434/ref=sr_1_1?ie=UTF8&qid=1394252187&sr=8-1&keywords=0201604434

答案 1 :(得分:1)

JPEG为您提供了多种选择。例如。您可以使用标准的霍夫曼表格,也可以生成适合特定图像的霍夫曼表格。量化表也是如此。您也可以切换到使用算术编码而不是霍夫曼编码进行熵编码。涉及JPEG中使用的算术编码的专利已经过期。所有这些选项都是无损的(没有额外的数据丢失)。 Mozilla使用的选项之一是使用渐进式JPEG压缩而不是使用基线JPEG压缩。您可以播放每次扫描中的频率(SS,频谱选择)以及每个频率使用的位数(SA,逐次逼近)。连续扫描将为每个频率提供额外的频率和/或附加位。所有这些不同的选择都是无损的。对于用于JPEG切换到逐行编码的标准图像,改进了从每张图像41 KB到37 KB的压缩。但这仅适用于SS和SA的一个设置。鉴于当今计算机的速度,您可以自动尝试许多不同的选项并选择最佳选项。

虽然几乎没有使用原始的JPEG标准有一个无损模式。预测变量有7种不同的选择。今天你将使用7种选择中的每一种进行压缩并选择最佳选择。对我上面概述的内容使用相同的原则。并记住他们没有遇到额外的数据丢失。在它们之间切换是无损的。