離散餘弦轉換(Discrete Cosine Transform,DCT)簡介
與傅立葉轉換(Fourier Transform)類似,但只使用實數做運算,同樣可將影像轉換至頻率域(Frequency domain),便可觀察這張影像的紋理狀態。
前言
之前文章中提到過傅立葉轉換(Fourier transform),FT 的算法中包含複數運算,其運算複雜度和存儲所需的空間都超過實數運算。
為了簡化前述計算過程,在 1974 年,由 N. Ahmed, T. Natarajan, K.R. Rao 等人提出離散餘弦轉換(Discrete Cosine Transform),改以實部運算代替 FT 中的虛部運算,藉此達到簡化目的,且轉換後的效果更好。
因此常被應用於信號和圖像處理,可將從前密度均勻的時間域或空間域資訊分佈,變換為密度不同的頻率域資訊分佈,也就可對數據進行有損壓縮。
離散餘弦轉換
假設我們有一張影像是N * N,在座標 (x, y) 的灰階值為 f(x, y),則 DCT 公式如下:
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 產生一些影響。