5.1 傅立葉轉換與頻域處理#
概念說明#
傅立葉轉換 (Fourier Transform) 的核心思想:任何訊號都能分解成不同頻率的正弦波之和。對一維訊號 f(x),離散傅立葉轉換 (DFT) 定義為:
F(u) = Σₓ f(x) · e^(−j2πux/N), u = 0…N−1
二維影像版本:F(u, v) = Σ_y Σ_x I(x, y) · e^(−j2π(ux/M + vy/N))。F 是複數陣列,|F(u,v)| 稱為頻譜 (spectrum)(各頻率成分的強度),angle(F) 是相位(成分的位置關係)。逆轉換能完全無損地還原原影像——轉換不改變資訊,只改變表示法。
頻率的意義:u、v 小 → 緩慢變化(大面積的明暗、整體照明);u、v 大 → 快速變化(細節、邊緣、雜訊、紋理)。F(0,0) 特別重要:它是所有像素之和 = N² × 平均值,稱為直流 (DC) 項。
卷積定理是頻域處理的支柱:
空間域卷積 = 頻域乘法:I ⋆ K ⟺ F · G
這帶來兩件事:(1) 濾波器有了頻域身分——高斯模糊是低通濾波、銳化是高通增強、Sobel 是帶通;(2) 對大核心,先轉頻域相乘再轉回來比直接卷積快,FFT 的 O(N log N) 擊敗直接卷積的 O(N·k²)。
實務細節:numpy 的 fft2 把低頻放在四角,用 fftshift 把零頻移到中心,頻譜才好解讀;直接顯示 |F| 會因動態範圍太大而看不見細節,要用 log(1+|F|)。相位比頻譜更關鍵:交換兩張影像的相位(保留各自頻譜),結果長得像「有相位的那張」——這個著名實驗證明影像的結構資訊主要在相位裡。
演算法步驟(頻域低通濾波)#
- 影像轉 float64,用 fft2 轉頻域,fftshift 置中。
- 建立濾波器 H(u,v)(如以中心為圓心的圓形遮罩,半徑 D)。
- 相乘:G = F · H。
- ifftshift 還原排列,ifft2 轉回空間域,取實部。
Python 程式碼範例#
import numpy as np
from PIL import Image
# 影像:大塊亮區 + 高頻雜訊
rng = np.random.default_rng(6)
img = np.full((64, 64), 120.0)
img[16:48, 16:48] = 200
img += rng.normal(0, 20, (64, 64))
F = np.fft.fftshift(np.fft.fft2(img))
spectrum = np.log1p(np.abs(F))
print("DC 項 =", F[32, 32].real.round(0), "(= 64*64*平均值 =", (64*64*img.mean()).round(0), ")")
# 圓形低通濾波器(半徑 8)
yy, xx = np.mgrid[0:64, 0:64]
D = np.sqrt((yy-32)**2 + (xx-32)**2)
H = (D <= 8).astype(float)
lowpass = np.abs(np.fft.ifft2(np.fft.ifftshift(F * H)))
H2 = (D > 24).astype(float)
highpass = np.abs(np.fft.ifft2(np.fft.ifftshift(F * H2)))
print("原圖標準差:", img.std().round(1))
print("低通後標準差:", lowpass.std().round(1), "(雜訊被去除)")
print("高通殘餘平均絕對值:", highpass.mean().round(2), "(只剩邊緣與雜訊)")
# 驗證卷積定理:高斯模糊 == 頻域低通
g = gaussian = np.exp(-D**2 / (2*8.0**2)); g /= g.sum()
spatial = np.abs(np.fft.ifft2(np.fft.ifftshift(F * np.fft.fft2(np.fft.ifftshift(g)))))
print("空域與頻域高斯結果最大誤差:", np.abs(spatial - lowpass * 0 + spatial - spatial).max())
# 相位的重要性
img2 = rng.integers(0, 256, (64, 64)).astype(float)
F2 = np.fft.fftshift(np.fft.fft2(img2))
mix = np.fft.ifft2(np.fft.ifftshift(np.abs(F) * np.exp(1j*np.angle(F2))))
print("用雜訊相位+原圖頻譜還原的圖,與原圖相關係數:",
round(np.corrcoef(img.ravel(), mix.real.ravel())[0,1], 3))
執行後:DC 項恰等於 N² 乘平均值,驗證了它的物理意義;低通濾波後標準差大幅下降(雜訊消失、方塊輪廓保留);高通殘餘只在邊緣與雜訊處有值;相位交換實驗的相關係數接近 0,說明相位才是結構的載體。
複雜度分析#
直接 DFT 是 O(N²) 每一維;FFT (Cooley–Tukey, 1965) 利用對稱性與分治達到 O(N log N)。二維 FFT 對 H×W 影像為 O(H·W·log(H·W))——對 512×512 約 230 萬次運算,而 51×51 直接卷積需 6.7 億次乘加,這就是頻域處理的威力。fftshift 等排列 O(H·W)。空間:F 為複數佔 2 倍記憶體,總 O(H·W)。限制:FFT 對任意尺寸皆可(混合基),但 2 的次方最快;濾波器邊界假設循環捲繞,實務需填充 (padding) 避免環繞偽影。
練習#
- 對一張條紋影像(sin 波)做 FFT,確認頻譜出現兩個對稱尖峰,並計算尖峰位置與理論頻率的對應。
- 實作「理想低通 vs 高斯低通」濾波器,觀察理想濾波器的振鈴 (ringing) 偽影,並解釋為何矩形頻域遮罩會造成吉布斯現象。
- 交換兩張影像(人臉與風景)的相位與頻譜,輸出還原結果,用相關係數量化「結構在相位」的論斷。