视频压缩中的离散余弦变换

离散余弦变换 (DCT)可以说是现代图像和视频压缩中最基本的工具。DCT 用于将像素域中的数据转换为频域,以揭示有关图像或视频帧的洞察力。

本文的目的是让您直观地了解 DCT,而无需所有疯狂的数学运算。

所以,我们走吧!

什么是变换(DCT 中的 T)?

在我们谈论信号处理中的变换之前,让我们直观地了解变换的“原因”。为什么需要转换,它们的作用是什么?

想象一下,您正在通过一个窗口查看三个球体/球(如下图所示)。您认为这些球体中哪个最大,哪个最小?

离散余弦变换
从窗口看三个球体的前视图

嗯,这看起来很容易。左边的球体看起来最小,右边的球体最大。正确的?

你确定吗?

现在,如果我向您展示这三个球体的鸟瞰图(使用无人机),您认为它会改变您的想法吗?没有把握?让我们来看看。

离散余弦变换
三个球体的俯视图

在此图像中,您正在查看

  • 上面的三个球体,
  • 粗蓝线是窗口的俯视图(因此,它看起来是二维的)

这些球体的大小都相同——但是,它们离窗户(房子)的距离不同。

  • 最左边的球体离窗口很远,因此看起来最小。
  • 右边的球体靠近窗户,因此它看起来最大!

很迷人,对吧?

您对数据的看法发生了转变

让我们花点时间了解一下我们刚刚做了什么以及为什么我们的答案发生了变化。

我们获取了一份数据,并 通过改变我们的物理位置形成了数据的两种视图或视角。也就是说,我们查看了数据

  • 从前面
  • 从上面

并且,这两种观点结合起来让我们更好地理解数据并帮助我们给出正确的答案。

好吧,现在让我们把这个例子放在一边,看看另一个例子,改变你的视角可以给你很多关于数据的信息。

星空和星座

当您在繁星点点的夜晚寻找一个星座时,问问自己这个问题——该星座中的所有星星都在同一个二维平面上吗?或者他们彼此相距很远?

这是一段精彩的视频,展示了星座中恒星的“相关性”。你会看到星星彼此相距很远,但是,它们似乎位于同一平面上,并且形状特殊,因为我们是从地球上看星星的。

当我们变换我们的“观察位置”以获得更多关于数据的信息时,星星之间的距离变得明显,这就是变换的作用。

好的——那么,什么是转换?

转换是一种数学函数,可 将 输入数据从一个 域(视图)转换(更改) 到另一个域(视图)。应用或使用转换有帮助,

  • 暴露数据的隐藏特征,或
  • 更好地(综合地)理解数据,或者
  • 突出或淡化数据的特定特征。

转换的例子包括

  • 离散余弦变换
  • 离散正弦变换
  • 小波变换
  • 傅里叶变换
  • 拉普拉斯变换
  • Z变换

现在,您知道了变换的作用,让我们了解著名的离散余弦变换。

像我五岁一样解释 DCT (ELIF)

在所有数学和技术术语之后,让我们尝试向 5 岁的孩子解释 DCT(这很难,但让我们尝试一下)。

想象一下,您正在和一个小孩玩“我用我的小眼睛监视”。这是一个游戏,一个人在他心目中的房间里选择一个项目,其他人必须通过提问来猜测这个项目(比如20个问题)。为了这个例子,让我们调整规则并自己提供 20 条线索。

现在,让我们假设我想到了一幅挂在墙上的船的画,请一个 5 岁的孩子猜猜我在想什么。

您认为我们可以提供的最佳线索是什么?(或者更确切地说,问)。

“物品挂在门对面的墙上,门铃下面”怎么样?如此详细的线索,保证能带领孩子接近奖品,对吧?

或者,我们可以结合使用两条线索——

  • 第一条线索:“该物品是方形或盒形的。”
  • 第二条线索:“它有一片海洋,里面有一艘船。”。

如果你仔细地做这件事,你不需要 20 条线索来引导孩子找到这幅画——很可能,5 到 8 条线索就足够了。一些线索可以比其他线索更快地引导孩子找到答案。这表明这些线索中包含的信息量。

所以,你所做的是,

  • 将一些数据作为输入(一幅画的位置),
  • 将其转换为一组 20 条线索(输出),
  • 按重要性排列线索(线索包含多少信息),
  • 并表明只有少数线索可以捕捉到这幅画的位置,而其余线索则为拼图添加了细节。

离散余弦变换

  • 以一种形式(像素域)获取数据
  • 将其转换为另一种形式,以便输出数据按重要性降序排列。(转换域)
  • 这使我们能够仅使用少数输出数据点,并且仍能返回到原始数据。

我希望您了解 DCT 试图实现的目标(本质上)。

因为孩子手套现在必须脱掉,ELI5 到此结束。剩下的部分需要高中数学和对编程的一些了解——最好是 MATLAB 或 Octave。

介绍离散余弦变换

离散余弦变换或 DCT 是一种广泛用于图像和视频压缩的变换。根据维基百科的定义如下:-

离散余弦变换根据以不同频率振荡的余弦函数之和表示有限的数据点序列。

还在我这儿?现在不要担心 DCT 背后的数学。

简单来说,离散余弦变换采用一组 N 相关的(相似的)数据点并返回 N 去相关的(不相似的)数据点(系数),使得能量仅在系数 M 在哪里 M << N

如果这没有意义,请尝试并记住这一点——DCT 获取输入数据并将其转换到另一个域,同时做两件非常重要的事情——

  1. 它使数据去相关(删除数据点之间的任何关系或相似性)
  2. 它将能量/信息压缩到仅几个输出数据点中

总而言之,DCT 需要

  • N 个数据点作为输入
  • 返回 N 个数据点作为其输出
  • 并确保大部分输入信息仅集中在 N 个输出数据点中的少数几个。

这称为 DCT 的能量压缩(或信息压缩)属性。

让我们通过一个使用 MATLAB 的例子来理解这一点。

取一个 8x8 填充有数字的矩阵, 255 如下所示。如果需要 8 位来存储每个数字,则需要 8 x 64 = 512 位来存储整个矩阵。目前很好?

离散余弦变换

好的,现在,让我们 8x8 对这个矩阵应用 2D-DCT 并获得 8x8 DCT 系数。2D-DCT 是用于 2D 数据(例如灰度图像)的 DCT 的二维形式。

矩阵上的 2D-DCT 运算的输出 8x8 如下所示。

离散余弦变换

输出看起来不一样,不是吗?

如果您仔细观察,矩阵的第一个系数 ( [0, 0]) 元素不为零,其余元素为零。这大大减少了该矩阵所需的存储空间。

这是由于 DCT 的去相关和能量压缩特性。这通常在技术文献中描述如下,可能有点难以理解——

DCT 将矩阵的能量压缩到第一个元素中,称为 DC 系数。其余系数称为 AC 系数

这意味着 –

  • 输出 2D DCT 的左上角称为 DC 系数。它是 DCT 最重要的输出,包含了很多关于原始图像的信息。
  • 其余系数称为 AC 系数。如果您使用 DCT 变换图像,则 AC 系数包含图像的更精细的细节。

现在,如果我采用这些 DCT 系数并对它应用逆二维 DCT,我将取回原始系数。

如果您想尝试一下,这里是用于复制上述实验的 MATLAB 命令。

inputPixels = ones(8,8) * 255;
dctCoeffs = dct2(inputPixels);
reconstructedPixels = idct2(dctCoeffs);

离散余弦变换在图像和视频压缩中的应用

DCT 的解相关和能量压缩特性使其对图像和视频压缩极具吸引力。Karhunen–Loève 变换 (KLT) (通常称为理想变换) 具有更好的去相关属性,但在计算上难以处理。另一方面,DCT 易于编程,并捕获了图像和视频压缩领域,非常接近 KLT 的输出。

这是一个简单的 MATLAB 脚本 ,演示了 2D-DCT 在应用于图像压缩(以及视频压缩的扩展)时的强大功能。

% read an image (MATLAB provides a few sample images)
RGB = imread('autumn.tif');

% convert to grayscale
I = rgb2gray(RGB);

% compute the 2D DCT
J = dct2(I);

% discard certain coefficients (set to zero)
J(abs(J) < T) = 0;

% recover the pixels using the inverse 2D DCT
K = idct2(J);

% matlab code to display the original and reconstructed image
figure
imshowpair(I,K,'montage')
title('Original Grayscale Image (Left) and Reconstructed Image (Right)');

代码很简单——

  • 加载图像(RGB)并将其转换为灰度
  • 计算 2D-DCT 并将其存储在 J
  • 将所有幅度小于阈值的系数设置 T 为 0
  • 计算逆 2D-DCT 并恢复像素(重建)
  • 比较两个图像——原始图像和重建图像。

现在,让我们进行两个实验。

实验 1: 让我们将阈值设置为 50 并将所有幅度小于的 AC 系数设置 50 为 0。并且,然后使用逆 DCT 重建图像。请记住,我们在这个例子中没有触及 DC 系数(其幅度远大于 50)。

如果您看一下下图,您会发现它很模糊并且没有包含所有特征。但是,这是令人惊奇的部分——我们将大量系数设置为零,我们 只保留了总 71070 系数的 3.45%。 因此,仅使用 3.45% 的系数,我们就可以重建一张看起来“还不错”的图像——非常模糊,但您可以识别出该图像。

离散余弦变换
仅使用 3.45% 的 DCT 系数重建图像

实验 2: 现在,让我们将阈值更改为 10 并将所有幅度小于的系数设置 10 为 0。这一次,非零系数的数量,即我们保留的系数是 总数的 23.45%。这是重建的图像(在逆 2D-DCT 之后)——看起来很神奇吧??

离散余弦变换
使用 23.45% 的 DCT 系数重建图像

为什么这两种情况都会发生?这里有一些原因——

  • 这是因为我们保护了直流系数并没有丢弃它。
  • 在第一种情况下,我们丢弃了很多 AC 系数,这会影响模糊度所看到的图像的更精细细节。
  • 在第二种情况下,我们保留了更多的 AC 系数并帮助保留了一些更精细的细节。

现在,如果进一步降低阈值,就可以提高图像质量。

最终,这些示例表明 DCT 可用于大幅压缩数据并(以有损方式)恢复数据,即使丢弃超过 50% 的 DCT 输出也是如此。

这些实验的收获

这两个示例展示了离散余弦变换的强大功能及其去相关和能量压缩的双重属性。他们证明您可以丢弃大部分 DCT 系数,并且仍然能够以合理的质量重建图像。

结论

我希望您对离散余弦变换及其属性如何帮助图像和视频压缩有一个直观的了解。我没有深入研究深入的数学细节,但如果您想深入研究,网上有大量文献。

作者:Krishna Rao Vijayanagar
原文链接:https://ottverse.com/discrete-cosine-transform-dct-video-compression/

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/16464.html

(0)

相关推荐

发表回复

登录后才能评论