1. 通俗理解傅里葉變換
可參考:
[1] 傅里葉分析之掐死教程

(圖片摘自傅里葉分析之掐死教程)
2. 通俗理解數字圖像傅里葉變換
傅里葉定理指出,任何信號都可以表示成一系列正弦信號的疊加。在一維領域,信號是一維正弦波的疊加,那么在二維領域,就是無數二維平面波的疊加。比如一幀圖像,不同點處的灰度值高低起伏變化,傅里葉變換就是用無數二維正弦波來擬合這種灰度值的起伏變化,灰度值的起伏變化平緩的地方,很低頻的二維正弦波即可擬合,灰度值的起伏變化很大的地方(比如圖像邊緣、噪點等),則需要高頻二維正弦波才能擬合。刻畫一維正弦波只需要一個頻率值$u$,刻畫二維正弦波則需要兩個頻率值$(u,v)$。
例如:

數字圖像傅里葉變換可參考:
[1] MOOC課程《遙感數字圖像處理》第四章 傅里葉變換
[2] 數字圖像處理,岡薩雷斯,第二版,第四章
[3] 圖像的傅里葉變換
[4] 如何理解 圖像傅里葉變換的頻譜圖
下圖摘自[1],在FFT功率譜圖中,高亮度表明該頻率特征明顯。


3. 從數學公式的角度理解傅里葉變換
本節的公式摘自岡薩雷斯的《數字圖像處理》第四章
3.1 1-Dimensional Fourier transform
1-D Fourier transform and inverse Fourier transfrom:

Using Euler's formula, Fourier transform can be expressed as

所以,當我們看到傅里葉變換公式中的$e^{-j2\pi \mu t}$時,我們應該想到的是一系列不同頻率的正弦波。
傅里葉變換公式可這樣理解:所謂傅里葉變換在其數學本質上無非是信號與正弦函數在時間軸上的卷積操作。根據一般的慣例,我們將信號與之作卷積操作的部分稱之為卷積核或核函數, 因此我們可以從頻率分解以外的視角來審視傅里葉變換,可以將其認為是信號與一個參數可變的核函數的卷積操作,其可變的核函數的參數就是頻率。(這段話摘自2-D Gabor 濾波器特征提取)
1-D discrete Fourier transform:

$x$ is integers, $M$ is the number of samples of $\mu$.
1-D inverse discrete Fourier transform:

3.2 2-Dimensional Fourier transform
2-D Fourier transform and inverse Fourier transfrom:


2-D discrete Fourier transform:


4. 用matlab實現傅里葉變換
傅里葉變換函數:
function F = FT_peng(I)
[m,n] = size(I);
F = zeros(m,n);
for u = 1:m
for v = 1:n
for x = 1:m
for y = 1:n
F(u,v) = F(u,v) + double(I(x,y)) * exp(-2*pi*1i*(u*x/m+v*y/n));
end
end
end
end
end
傅里葉逆變換函數:
function f = IFT_peng(I)
[m,n] = size(I);
f = zeros(m,n);
for x = 1:m
for y = 1:n
for u = 1:m
for v = 1:n
f(x,y) = f(x,y) + double(I(u,v)) * exp(2*pi*1i*(u*x/m+v*y/n));
end
end
end
end
f = f/(m*n);
end
主程序代碼:
clear;
I = imread('test_img.png');
I = imresize(I, [100,100]);
I = rgb2gray(I);
% using fft2 directly
I_fft2 = fft2(I);
I_fft2 = abs(I_fft2); % abs將負實數和虛數部分調整為正實數
I_fft2shift = fftshift(I_fft2); % 把四個角的高頻信息移動到最中間
I_fft2shift = uint8(I_fft2shift/256); % 除以256是為了縮小數值,能更好的顯示
% using function defined by us
I_FT = FT_peng(I);
I_FT2 = abs(I_FT);
I_FTshift = fftshift(I_FT2);
I_FTshift = uint8(I_FTshift/256);
% recover the image by inverse Fourier function defined by us
I_inv = IFT_peng(I_FT);
I_inv = uint8(I_inv);
% plot
subplot(221);
imshow(I); title('Original image');
subplot(222);
imshow(I_fft2shift); title('fft2 frequency image');
subplot(223);
imshow(I_FTshift); title('FT frequency image');
subplot(224);
imshow(I_inv); title('Recovered image');
運行結果:

注:程序參考了博客2D離散傅里葉變換及逆變換的matlab實現
