在使用变换的图像压缩中,如何处理变换后的系数,因为它们不是整数?

信息处理 小波 压缩 图像压缩 量化 浮点
2022-02-22 09:46:47

我是图像压缩领域的新手。在阅读各种文本时,我了解到如何使用小波变换或 DCT 将图像转换到另一个域,使其适用于有损压缩。

我一直在尝试对 MATLAB 中的示例 bmp 进行小波变换。使用 MATLAB 库函数,我使用 Daubechies 小波创建了变换系数。

现在从 bmp 读取的给定像素是uint8格式化的,即它占用了 1 个字节的内存。这是因为在大多数图像格式中,一个像素可以取的值范围是 0 到 255。然而,在小波变换之后,变换矩阵的每个元素都会得到双精度浮点数。这通常会为每个元素消耗大约 4 个字节。

我的目标是使用量化元素的量化和熵编码来尝试一些非常基本的压缩。将变换元素的低幅度值量化为零确实提供了良好的压缩。但问题是我仍然必须使用双精度浮点。当我将所有小波系数转换为某种整数格式时,与原始图像相比,重建图像的质量变得非常差。

在标准压缩技术中,如果变换后的系数不是整数格式,它们是如何处理的?由于其双精度特性,每个转换后的系数都比原始系数占用更多的字节。您能否指出已解释此问题的资源?

2个回答

通常在存储系数时会发生一些舍入。这就是为什么许多图像压缩算法是有损的,即它们在将浮点系数转换为整数格式时会丢失信息。舍入的过程称为量化。有关示例,请参阅此维基百科文章。

http://en.wikipedia.org/wiki/JPEG#Quantization

通常可以想出一个比例因子,使最大的系数具有 值255您需要为每组系数存储一次此比例因子。这为每个系数节省了 3 个字节。通常你可以在没有小于最大 1/255 的系数的情况下生活。

DC当然是个例外,应该分开处理。DC 分量可能具有相当多的空间相关性,并且可能受益于更高级别的 DCT。即,如果您有 8x8 DCT 变换,每个 8x8 像素(总共 64x64 像素),那么您也有 8x8 DC 分量,您可以再次将其馈送到 DCT。