矩阵在内存中是如何存储的?

4
注意 - 可能更与计算机组织相关,而非软件,不确定。
我正在尝试理解与数据压缩有关的内容,比如 JPEG 照片。基本上,一个非常密集的矩阵通过离散余弦变换被转换成一个更加稀疏的矩阵。据说是存储这个稀疏矩阵。请看这个链接:

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

将原始的8x8子块图像示例与矩阵“B”进行比较,该矩阵经过转换具有整体较低的幅度值和更多的零值。矩阵B如何存储,以使其在原始矩阵上节省更多的内存?
原始矩阵显然需要8x8(条目数)x 8位/条目,因为值可以随机从0到255变化。所以我认为我们需要64字节的内存来存储它。另一方面,矩阵B,最好的情况是值范围从-26到+5,因此最多一个条目(如-26)需要6位(5位用于形成26,1位用于符号)。那么你就可以存储8x8x6位= 48字节。
我看到的另一个可能性是矩阵按从左上角开始的“之”字形顺序存储。然后我们可以指定起始和结束地址,沿着对角线不断存储直到只剩下零。假设这是一个32位机器;那么2个地址(起始+结束)将构成8个字节;对于其他非零条目,每个6位,我们必须沿着几乎所有顶部对角线前进,以存储28个元素的总和。总体而言,这种方案需要29个字节。
总结一下我的问题:如果JPEG和其他图像编码器声称通过使用算法使图像矩阵更少密集来节省空间,那么这额外的空间如何在我的硬盘上实现?
干杯

维基百科文章的下一节,“熵编码”,正是关于这个的。您可能想回顾一下那一节,并询问您不理解的内容。 - Kevin Reid
好的,实际上它将以那种锯齿形式存储。现在我的问题是,每个条目是否仍将使用8位,还是可以降至6位? - JDS
霍夫曼编码可以处理之字形模式,因为它取决于事件发生的频率,而不是它们是否连续。 - rasmus
你是在指zig-zag作为前缀码吗?如果是这样,你应该知道高频出现的情况下有更短的前缀码,并且使用更少的位数进行存储。 - rasmus
4个回答

2

JPEG使用哈夫曼编码的一种变体。


1

最简单的压缩方法是利用符号(零)的重复序列。内存中的矩阵可能如下所示(假设为十进制系统)

0000000000000100000000000210000000000004301000300000000004

在压缩后,它可能会变成这样。
(0,13)1(0,11)21(0,12)43010003(0,11)4
(Symbol,Count)...

1

正如“熵编码”中所述,使用了一种Zig-Zag模式,以及RLE,这将为许多情况下已经减小了大小。然而,据我所知,DCT本身并没有提供稀疏矩阵。但它通常会增强矩阵的熵。这是压缩变得有损的地方:输入矩阵通过DCT传输,然后对值进行量化,最后使用哈夫曼编码。


1
据我所知,JPEG不仅可以压缩图像,还可以丢弃数据。在8x8块转换到频域后,它会丢弃不重要的(高频)数据,这意味着它只需要保存重要的6x6甚至4x4数据。这样就可以比非无损方法(如gif)获得更高的压缩率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接