在许多数据压缩示例中,我们在稀疏基础上取信号的S个 最大系数(例如,最大 DCT 系数的 1%)并将其余的设置为零。
我们如何实际表示压缩信号?在上面的示例中,一旦将最小系数设置为零,信号就会直接转换回时域并与原始信号进行比较。如果我们想存储数据怎么办?
换句话说,我们如何简洁地存储归零系数的索引?
在许多数据压缩示例中,我们在稀疏基础上取信号的S个 最大系数(例如,最大 DCT 系数的 1%)并将其余的设置为零。
我们如何实际表示压缩信号?在上面的示例中,一旦将最小系数设置为零,信号就会直接转换回时域并与原始信号进行比较。如果我们想存储数据怎么办?
换句话说,我们如何简洁地存储归零系数的索引?
你的问题非常准确。仅存储来自稀疏变换(DCT、小波等)的最大系数(例如 1%)是傻瓜式的,因为您(更重要的是解码器)不知道它们所在的位置。
并且存储它们的二进制索引抵消了稀疏化的压缩增益。因此,应该在理论稀疏性和存储之间进行权衡。对于图像,在 JPEG 中,使用低频到高频解析方案(之字形)。量化后,大量归零系数与块结束符号压缩在一起。在 JPEG 2000 中,经常使用多尺度和逐位路径,并且使用类似 EZM-SPIHT 的编码压缩归零系数,执行零位平面的矢量编码。
因此,基于对信号或图像结构的先验知识,一些预先确定的解析系数的方式通常对实际压缩有用,并且适用于特定类别的数据。
好的,但这是一个非常实际的问题。因此,我将说明 JPEG 算法中 DCT 系数会发生什么:
一旦整个 8 位灰度图像被划分为 8 x 8 = 64 像素的相邻块。每个块都独立地被 DCT 转换为 8 x 8 频率系数并且通过掩码进一步加权它实现了量化。这将设置很多高频系数典型图像为零。不管怎样,然后量化系数被锯齿形扫描并转换成一串 64 个量化系数。然后这个字符串是根据两个非零系数之间的零个数编码的各种游程长度。最后一组连续的零定义了块符号 EOB 的结尾。然后为运行长度代码分配一个预先设计的Huffman前缀 VLC 代码。这形成了与给定块相关联的比特流。每个块都是独立编码的(每个块的 DC 电平除外,它是从块到块的差分编码)。RLC 和霍夫曼编码阶段执行实际的比特减少机制。当量化阶段执行信息缩减。