離散餘弦轉換(Discrete Cosine Transform,DCT)簡介

與傅立葉轉換(Fourier Transform)類似,但只使用實數做運算,同樣可將影像轉換至頻率域(Frequency domain),便可觀察這張影像的紋理狀態。

Ken Huang
電腦視覺
Oct 25, 2020

--

前言

之前文章中提到過傅立葉轉換(Fourier transform),FT 的算法中包含複數運算,其運算複雜度和存儲所需的空間都超過實數運算。

為了簡化前述計算過程,在 1974 年,由 N. Ahmed, T. Natarajan, K.R. Rao 等人提出離散餘弦轉換(Discrete Cosine Transform),改以實部運算代替 FT 中的虛部運算,藉此達到簡化目的,且轉換後的效果更好。

因此常被應用於信號和圖像處理,可將從前密度均勻的時間域或空間域資訊分佈,變換為密度不同的頻率域資訊分佈,也就可對數據進行有損壓縮。

離散餘弦轉換

假設我們有一張影像是N * N,在座標 (x, y) 的灰階值為 f(x, y),則 DCT 公式如下:

i ≥ 0, j ≤ ( N — 1 )

D(i, j) 是頻率域(Frequency domain)上位於影像 ( i, j ) 位置的頻率係數值。DCT 也和 FT 一樣有反函數,IDCT (Inverse DCT),公式如下:

轉換後的頻譜圖能判斷紋理方向及強弱,實際對應到圖像上的分區如下:

實作應用

透過 python 的 Open-CV 可將影像轉換頻率域,再透過遮罩的手法就可以把高頻的像素濾除,我以這張圖為範例:

經過下方的 code 將上方這張原圖轉換為頻譜,並且用遮罩過濾高頻後,再做 IDCT 轉換回圖像,以下是結果:

從上方兩張圖可以看出,DCT 相較 FT 來說,具有更好的「能量集中」特性,經過 DCT 轉換的頻率資訊會集中在低頻部分(以影像來說就會是左上角)。接著我用長寬 1/5 的遮罩保留頻譜左上角的低頻資訊,再使用反函數(IDCT)將過濾後的頻譜輸出為右下角圖像,出現些微白點、影像灰階也比較明顯一點,但基本上不影響人眼判斷其資訊,可見人眼是低通濾波器。

生活中最明顯的例子就是我們日常用的 JPEG 影像格式,其中對於影像進行有損壓縮的環節便是採用 DCT。因為對於人眼而言,影像的低頻部分資訊量是大於高頻部分的。因此刪除高頻資訊,對於人眼視覺所能辨別的資訊量來說,損失是非常少的,但可大幅減少資料傳輸量。以下是我實作的 code,有興趣可以調整遮罩那邊的大小或乘上的係數,都會對最終做完 IDCT 產生一些影響。

--

--

Ken Huang
電腦視覺

在網路上自學的過程中,體會到開放式資源的美好,希望藉由撰寫文章記錄研究所的學習過程,同時作為回饋網路世界的一種方式。Email : kenhuang2019iii@gmail.com ,如果有任何問題都歡迎與我聯繫。