如何给5岁孩子解释DCT?
點擊上方“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 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 反變換并恢復像素(重建圖像)
比較原始圖像和重建圖像
?
下面讓我們做兩個實驗:
?
實驗一:讓我們將閾值設置為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
掃描圖中二維碼或點擊閱讀原文
了解大會更多信息
喜歡我們的內容就點個“在看”吧!
總結
以上是生活随笔為你收集整理的如何给5岁孩子解释DCT?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【公开课预告】:六款开源LL-HLS/L
- 下一篇: 06 / LiveVideoStack主