视频压缩:离散余弦变换是什么?

17

我已经实现了一种称为离散余弦变换的图像/视频转换技术。这种技术在MPEG视频编码中被使用。我基于以下URL中提出的思想来设计我的算法:

http://vsr.informatik.tu-chemnitz.de/~jan/MPEG/HTML/mpeg_tech.html

现在我可以转换黑白图像的8x8部分,例如:
0140 0124 0124 0132 0130 0139 0102 0088
0140 0123 0126 0132 0134 0134 0088 0117
0143 0126 0126 0133 0134 0138 0081 0082
0148 0126 0128 0136 0137 0134 0079 0130
0147 0128 0126 0137 0138 0145 0132 0144
0147 0131 0123 0138 0137 0140 0145 0137
0142 0135 0122 0137 0140 0138 0143 0112
0140 0138 0125 0137 0140 0140 0148 0143
将其转换为带有所有重要信息的右上角的图像。 转换后的块如下所示:
1041  0039  -023  0044  0027  0000  0021  -019  
-050  0044  -029  0000  0009  -014  0032  -010  
0000  0000  0000  0000  -018  0010  -017  0000  
0014  -019  0010  0000  0000  0016  -012  0000  
0010  -010  0000  0000  0000  0000  0000  0000  
-016  0021  -014  0010  0000  0000  0000  0000  
0000  0000  0000  0000  0000  0000  0000  0000  
0000  0000  -010  0013  -014  0010  0000  0000
现在,我需要知道如何利用这种转换?我想检测同一图像(或另一张图像)中表示良好匹配的其他8x8块。
此外,这个转换给了我什么?为什么转换后图像的右上角存储的信息很重要?
6个回答

14
使用离散余弦变换(DCT)的结果是将原始源转换成频域。左上角的条目存储“振幅”、“基础”频率,频率沿着水平和垂直轴增加。DCT的结果通常是一组更常见的低频振幅(左上象限)和较少的高频条目。通常只需将这些高频数值清零,因为它们通常只占源文件的非常小的部分。但是,这会导致信息丢失。为了完成压缩,通常使用无损压缩在DCT后的源文件上。这就是压缩的方式,因为所有这些零运行都被打包到几乎没有什么东西。

使用DCT查找相似区域的一个可能优势是可以对低频值(左上角)进行第一次匹配。这减少了需要匹配的值的数量。如果找到低频值的匹配项,则可以逐步比较高频值。

希望这有所帮助。


4

我从《数据压缩书》中学到了关于DCT的一切。除了是数据压缩领域的绝佳入门教材外,它还在结尾附近有一章介绍了有损图像压缩,其中介绍了JPEG和DCT。


2
这些转换背后的概念最好从一维情况开始理解。图像(这里)展示了一个方波和无限级数的前几项。观察它,注意如果将项的函数相加,它们开始逼近方波的形状。添加的项越多,逼近效果越好。但是,要从近似到精确信号,必须求和无限多项。原因是方波是不连续的。如果将方波视为时间的函数,则其在零时间内从-1变为1。表示这样的东西需要无限级数。再看一下系列术语的图表。第一个是红色的,第二个是黄色的。连续的项具有更多的“上下”转换。这些来自每个术语频率的增加。坚持将方波作为时间函数,并且将每个级数项作为频率函数,则有两种等效表示:时间函数和频率函数(1 /时间)。

在现实世界中,没有方波。没有事情会在零时间内发生。例如,音频信号占据20Hz至20KHz范围,其中Hz为1 /时间。此类内容可以用有限级数表示。

对于图像,数学是相同的,但有两个不同之处。首先,它是二维的。其次,时间的概念毫无意义。在一维情况下,方波仅是一个函数,为我们称之为时间的参数提供某些数值。 (静态)图像是一个函数,为每对行、列索引提供数值。换句话说,图像是2D空间的函数,即矩形区域。这样的函数可以用其空间频率表示。要理解空间频率是什么,请考虑8位灰度级图像和一对相邻像素。图像中可能发生的最突然的转换是从0(比如黑色)到255(比如白色)在1个像素的距离内。这直接对应于系列表示的最高频率(最后)项。

图像的二维傅里叶(或余弦)变换结果是一个值数组,大小与图像相同,表示相同的信息,不是作为空间函数,而是作为1 /空间函数。信息沿着从原点最高行和列指标的对角线按从低到高的频率排序。一个例子(在这里)

对于图像压缩,可以转换图像,舍弃一些较高频率的项,并将其余项反转换回图像,该图像比原始图像少了一些细节。虽然它会转换回相同大小的图像(用零替换已删除的项),但在频域中,它占用的空间更少。

另一种看待它的方式是将图像缩小到更小的尺寸。例如,如果您试图通过在每四个像素中抛弃其中三个以及每四行中抛弃其中三行来减小图像的大小,则将得到大小为1/4的数组,但图像看起来会很糟糕。在大多数情况下,这是通过二维插值器来实现的,该插值器通过对较大图像的像素进行矩形分组平均来生成新像素。这样做,插值会产生类似于在频率域中抛弃系列项的效果,只不过计算速度要快得多。
为了做更多的事情,我将以傅里叶变换作为例子。任何关于该主题的良好讨论都将说明傅里叶和余弦变换之间的关系。由于傅里叶变换由复数构成,所以无法直接查看傅里叶变换的图像。它已经分为两种信息,即数字的实部和虚部。通常,您将看到这些的图像或绘图。但是将复数分解为其幅度和相位角更有意义(通常)。这只是将复杂平面上的一个复数切换到极坐标。
对于音频信号,请考虑合并正弦和余弦函数,使其在参数中带有附加量以将函数前后移动(作为信号表示的一部分)。对于图像,相位信息描述了系列的每个术语在频率空间中相对于其他术语的偏移量。在图像中,边缘是(希望)如此明显,以至于它们可以通过频率域中最低频率项很好地表征。这不是因为它们是突然的转变,而是因为它们具有例如大量黑色区域与大量较轻区域相邻。考虑边缘的一维切片。灰度级别为零,然后过渡并保持在那里。想象一下正弦波,在其穿越信号转换的中点时将成为第一个近似项。该项的相位角度对应于图像空间中的位移。这的一个很好的说明在这里。如果您正在尝试查找形状并且可以制作参考形状,则这是一种识别它们的方法。

1

如果我没记错的话,这个矩阵允许你将数据保存到一个带压缩的文件中。

如果你往下读,你会发现从最终矩阵中读取数据的锯齿形式。最重要的数据在左上角,最不重要的在右下角。因此,如果你在某个点停止写入并将其余部分视为0,即使它们不是,你也会得到图像的有损近似。

你丢弃的值的数量增加了压缩,但代价是图像保真度的降低。

但我相信其他人可以给你一个更好的解释。


1
我建议你去买一本数字视频压缩,它是关于图像和视频压缩算法的非常好的概述。

1

我认为Anthony Cramp的回答很好。正如他所提到的,DCT将数据转换为频域。DCT在视频压缩中被广泛使用,因为人类视觉系统对高频变化不太敏感,因此将高频值归零会导致文件更小,对人类对视频质量的感知影响很小。

就使用DCT来比较图像而言,我想唯一的真正好处是如果你削减掉高频数据,因此有一个更小的数据集来搜索/匹配。像Harr小波之类的东西可能会给出更好的图像匹配结果。


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