点击上方“LiveVideoStack”关注我们
作者 Krishna Rao Vijayanagar
翻译 | Alex
技术审校 | 赵军
DCT
 Easy Tech
#001#
DCT(离散余弦变换)是现代图像和视频压缩最基本的工具。它将图像中的数据转换到频域,这样做是为了揭示像素中所包含的信息。本文将以一种通俗易懂的方式解释DCT。
从一个简单的练习开始
在我们研究信号处理中的变换这一“深奥”数学问题之前,首先让我们对变换的“原因”有一个直观的认识。为什么需要变换,变换的作用是什么?
免责声明:请不要介意图片美观度,毕竟我是视频工程师而不是PS专家🙂
请看下面图片,想象你正透过窗户看着3个球体,如果我问你哪个球体最大,你肯定能马上告诉我,对吧?
答案相当简单。左边的球体看上去是最小的,右边的是最大的,对不对?
你真的确定吗?
现在,让我们从上方鸟瞰这三个球体(假设使用一架无人机),你现在还认为右边是最大吗?不确定?让我们来看下。
在这张图片里,你可以看到:
  • 从上方可以看到3个球体。
  • 那条粗蓝线是从上方看到的窗户(因此看上去像是2D的)。
从上方看,这三个球体看起来一样大小。但实际上,它们与窗户之间的距离并不一样。从窗户向外望去:
  • 最左边的球体距离窗户非常遥远,所以看上去是最小的。
  • 右边的球体靠近窗户,所以看起来是最大的。
现在,你想更改之前的答案吗?
你看数据的视角发生了变化
让我们先花一分钟来思考一下我们刚刚做了什么,为什么我们的答案会改变?
我们拿到一份数据,通过改变我们的物理位置(分别从前面和上方观察数据),对数据形成两种观点或视角。
将这两种不同的视角结合起来更有助于我们理解数据,并迫使我们重新审视和面对所呈现信息的立场和想法。
好,现在我们先把这个例子放在一边,来看另外一个。在下面这个例子中,只要改变视角,你将收获更多关于数据的信息。
星空和星座
当你仰望星空,找到一个星座,扪心自问:星座中的所有恒星都在同一个平面上吗?它们彼此之间的距离会非常遥远吗?
这里有一段精彩的视频,展示了一个星座中的恒星是如何 "关联 "的。你会看到,这些星星彼此之间距离很远,但是它们似乎位于同一个平面上,并且呈现出一个特定的形状,这是因为我们是从地球以超远的距离看这些星星的。
所以,究竟是什么变换?
变换是一种将输入数据从一个领域(视角)转向另一个领域的数学函数,这样做的目的是:
  • 揭示数据的隐藏特点
  • 更好地理解数据
  • 突出或者弱化某些特定数据特征
我之所以花费时间来讲解什么是“变换”,是因为对很多人来说,变换是他们学习DCT或者其他数学变换(傅里叶、Z、拉普拉斯等)之路上经常遇到的障碍。
对信号处理中的“变换”理解之后,让我们一起来学习大名鼎鼎的DCT。
向5岁孩童解释DCT
学完所有数学和技术行话之后,让我们试着给一个5岁孩子讲解DCT(虽然很难)。
想象你正在和一个小孩玩“I Spy With My Little Eye”猜谜游戏。游戏玩法是这样的:一个人在房间中选定一件物品,在心中想着这件物品,不要告诉任何人,然后其他人通过提问(比如问20个问题)的方式来猜物品是什么。
现在,假设我心中正在想着墙上挂着的一幅画,画中是一艘小船,然后让这位小朋友问我问题,并猜猜我在想什么。
为了更好地讲解DCT,请允许我修改规则,提供20条线索🙂
你认为哪一个是最佳线索? 比如,该物品挂在墙上正对门的位置,而且在门铃下方。这样详细的线索肯定能帮助小朋友猜到答案,对不对?
下一条最佳线索可以是这样:这件物品是方形或者盒子形状。我们还可以说,其中有大海和小船。
如果你认真地给出线索,你会发现你根本不需要20条线索就能帮助小朋友找到答案,一般5~8条线索足矣。某些线索往往使小朋友更快猜到答案——这说明这些线索中包含了足够的信息量。
先暂停一会,来看看我们刚刚做了什么。
这些都是你刚刚做的事:
  • 将一些数据作为输入数据——画的位置
  • 将输入数据转换为20条线索(输出)
  • 根据重要性依次排列数据(线索中所包含信息的多少)
  • 发现只有少数线索可以确定这幅画的位置,其余线索负责添加细节
DCT实际上做了类似的事情:
  • 以一种形式获取数据
  • 将其转换为另一种形式,使得输出数据按重要性降序排列
  • 这时我们可以仅用到少数输出数据点就可以返回原始数据
我希望你已经理解了什么是DCT。
小朋友的游戏时间到此结束🙂
下面部分需要一点高中数学和编程知识(最好是MATLAB 或者 Octave)。
介绍DCT
离散余弦变换或者DCT广泛用于图像和视频压缩。维基百科给出的解释如下:
离散余弦变换以不同频率振荡的余弦函数之和来表示有限数据点序列。
大家还在吗?眼下你还无需担心DCT背后的数学知识。
简单来说,DCT获取到一组N个相关数据点,然后返回N个去相关数据点(系数),通过这种方式,能量被压缩在少数几个系数M中,其中M<<N。
如果你还没有明白的话,也可以这样理解:DCT将输入数据转换成另一种域的过程中做了两件非常重要的事:
1.去相关数据(去除任何相似或者有关联的数据点)
2.将能量/信息压缩进少数几个输出数据点中
总结一下就是,DCT将:
  • N个数据点作为输入
  • 返回N个数据点作为输出
  • 确保大多数输入信息集中在N个输出数据点中的少数几个
这就是 DCT 的能量压缩(或信息压缩)特性。
让我们用一个示例(使用MATLAB)来帮助你加深理解DCT。
如下图所示,这是一个填满数字255的8x8矩阵。如果需要8比特存储每个数字,那么你一共需要8 x 64= 512比特才能存储整个矩阵,对吧?
现在,让我们对整个矩阵应用8x8 2D-DCT,然后得到 8x8 个DCT系数。2D-DCT是用于二维数据(例如灰度图像)的DCT的二维形式。
8x8 矩阵上2D-DCT运算的输出如下所示:
看起来完全不同,对吧?
如果你仔细观察,就会发现矩阵的第一个系数元素([0, 0])不是0,而其他元素全部是0。这样大大减少了这个矩阵所需的存储空间。
这要归功于DCT的去相关和能量压缩特性。通常在技术文献中这样描述(会有一些难理解):
DCT将矩阵中的能量全部压缩到第一个元素——DC(直流)系数中,而余下的系数被称为AC(交流)系数。
这句话的意思是:
  • 输出的二维DCT的左上角被称为DC系数。它是DCT最重要的输出,包含了很多关于原始图像的信息。
  • 其余的系数被称为AC系数。如果你使用DCT对图像进行转换,AC系数包含了图像的更多细节。
现在,如果对这些 DCT系数应用2D-DCT反变换,将得到原始系数。
如果你想尝试一下,可以使用下面的MATLAB命令来重复上面的实验。
inputPixels = ones(8,8) * 255;dctCoeffs = dct2(inputPixels);reconstructedPixels = idct2(dctCoeffs);
DCT在图像和视频压缩中的应用
DCT的去相关和能量压缩两个特性非常适合图像和视频压缩。Karhunen-Loève Transform (K-L变换) 因其具有更好的去相关性而常被称为理想变换 但在计算上却难以实现。与之对应的则是,DCT 因为更容易编程,而在图像和视频压缩世界获得广泛应用。
下面是一个简单的MATLAB脚本,它展示了2D-DCT在应用于图像压缩(以及视频压缩)时的强大功能。
%read an image (MATLAB provides a few sample images)RGB = imread('autumn.tif');% convert to grayscaleI = rgb2gray(RGB);% compute the 2D DCTJ = dct2(I);% discard certain coefficients (set to zero)J(abs(J) < T) = 0;% recover the pixels using the inverse 2D DCTK = idct2(J);% matlab code to display the original and reconstructed imagefigureimshowpair(I,K,'montage')title('Original Grayscale Image (Left) and Reconstructed Image (Right)');
代码很简单:
  • 加载一张RGB图像,并转换为灰度
  • 计算2D-DCT,然后存储在J
  • 将所有幅度小于阈值T的系数设置为 0
  • 计算 2D-DCT 反变换并恢复像素(重建图像)
  • 比较原始图像和重建图像
下面让我们做两个实验:
实验一:让我们将阈值设置为50,并将所有幅度小于50的AC系数设置为0。然后,用DCT反变换重建图像。记住,在这个例子中我们不碰DC系数(其幅度远远大于50)。
下方右侧图片看上去很模糊,而且没有包含原始图片的所有特征。但惊人的事实在于,我们将绝大部分系数设置为了0,只保留了总系数 71070 中的3.45%。所以你看,只需要3.45%的系数,我们就能重建一张还看得过去的图像,虽然模糊,但还可以识别。
实验二:现在,让我们将阈值改为10,并将所有幅度小于10的系数设置为0 。这一次,非零系数的数量,即我们所保留的系数占总系数的23.45%。这是重建后的图像(2D-DCT反变换后)——看起来很神奇吧?
为什么会发生这两种情况?
  • 因为我们保护了DC系数,没有舍弃它。
  • 在第一个实验中,我们丢弃了很多AC系数,影响到了图像更精细的细节部分,所以它看上去很模糊。
  • 第二个实验中,我们在保留了更多AC系数的同时,也保留了图片中更精细的细节。
现在,如果你进一步降低阈值,则可以得到更高质量的图像。
最后,这些实验表明,即使舍弃超过 50% 的 系数,DCT 也能大幅压缩数据并恢复数据(以有损方式)。
 实验要点
这两个实验显示了DCT的强大功能,以及它的去相关和能量压缩两个特性。它们表明:即使你丢弃大部分 DCT 系数,仍然可以重建一定质量的图像。
     结语
我希望你已经对DCT以及它的特性在图像和视频压缩中所发挥的作用有了一个直观的理解。我没有在文章中深入研究其深奥的数学细节,如果你想深入挖掘,可以参考网上的各种文献资料。
特别说明:本文来自OTTVerse,已获得原作者Krishna Rao Vijayanagar授权翻译并发布,特此感谢。
原文链接:
https://ottverse.com/discrete-cosine-transform-dct-video-compression/#Explain_DCT_Like_Im_Five

扫描图中二维码或点击阅读原文
了解大会更多信息
喜欢我们的内容就点个“在看”吧!
继续阅读
阅读原文