【圖像處理】二維付立葉變換和濾波 (Two-Dimensional Fourier Transform and Filtering)

實驗要求

  該實驗的目的是開發一個2-D FFT 程序包。要求程序能完成下面的功能:

  (1.a) 用因子 (-1)x+y 乘以輸入圖像,以實現濾波的中心化變換;

  (1.b) 計算付立葉變換;

  (1.c) 用一個實矩陣乘以一個複數矩陣,即用實矩陣中的元素同時乘以複數矩陣對應位置上的複數的實部與虛部。可以通過調用兩個圖像的乘法程序來實現對應元素的相乘;

  (1.d) 計算反付立葉變換;

  (1.e) 結果乘以 (-1)x+y,並取其實部;

  (1.f) 計算頻譜。

  (1.g) 計算圖4.41(a)的中心化後的付立葉譜;

  (1.f) 使用二維圖像和三維圖形兩種形式顯示計算的幅度譜和相位譜;該實驗主要實現4.7.3 節的算法。若試驗中使用MATLAB 語言實現, 則在(1.b)和(1.d)中二維付立葉變換和反變換程序可以使用Matlab 的函數FFT2 和IFFT2。

  (2.a) 編寫一個實現公式(4.8-6)所示的高斯低通濾波器的程序。

  (2.b) 對圖4.41(a)進行高斯低通濾波以獲得圖4.48(c)。

  (3.a) 如公式(4.9-1)所示,原始圖像減去實驗(2.b)中的圖像得到銳化後的圖像。觀察結果圖像與圖4.56 中得到的高斯高通濾波結果圖的差異, 並解釋其中的原因。

  (3.b) 調整高斯低通濾波器變量,使(3.a)中的減法銳化圖與圖4.56(c)接近爲止,並解釋你的結果。


技術論述

1、傅里葉變換2-D FFT

  頻率域濾波由修改一幅圖像的傅里葉變換然後計算其反變換得到處理後的結果組成。

  給定一幅大小爲 M×N 的數字圖像f(x,y),其基本率濾波公式爲:

這裏寫圖片描述

  其中,F(u,v)是輸入圖像的DFT,H(u,v)是濾波函數即濾波器,g(x,y)是濾波後的輸出圖像。函數F、H和g是大小與輸入圖像相同的 M×N 陣列。使用中心化可以顯著簡化H(u,v)的技術條件,它要求F(u,v)也被中心話,通過計算變換前使用(-1)x+y乘以輸入圖像來完成。

頻率域濾波可以總結爲以下步驟

(1) 給定一幅大小爲M×N的輸入圖像f(x,y),設定填充參數爲 P=2M 和 Q=2M;

(2) 對f(x,y)添加必要數量的0,形成大小爲P×Q的填充後的圖像fp(x,y);

(3) 用因子 (-1)x+y 乘以輸入圖像,以實現濾波的中心化變換;

(4) 計算付立葉變換;

(5) 用一個實矩陣乘以一個複數矩陣,即用實矩陣中的元素同時乘以複數矩陣對應位置上的複數的實部與虛部,可以通過調用兩個圖像的乘法程序來實現對應元素的相乘;

(6) 計算反付立葉變換;

(7) 結果乘以 (-1)x+y,並取其實部。

(8) 從結果圖像的左上象限提取M×N區域,得到最終處理結果g(x,y)。

2、高斯低通濾波器

  高斯低通濾波器的二維形式爲:

這裏寫圖片描述

  其中,D0是截止頻率,D(u,v)是距頻率矩形中心的距離。高斯濾波器的寬度由參數 D0 表徵,決定了平滑程度,而且 D0越大,高斯濾波器的頻帶就越寬,平滑程度就越好。因爲噪聲主要集中在高頻段,所以通過高斯低通濾波器可以濾除噪聲信息、平滑圖像,但與此同時會濾除圖像的細節信息,使圖像變得模糊。

這裏寫圖片描述

3、高斯高通濾波器

  截止頻率處在距頻率矩形中心距離爲 D0的高斯高通濾波器(GHPF)的傳遞函數爲:

這裏寫圖片描述

  其中,D(u,v)是距頻率矩形中心的距離。

  通過高斯高通濾波器可以銳化圖像,增強細節信息,提升圖像的高頻分量,減少低頻分量,對微小物體和細線條也能很好地增強顯示。

這裏寫圖片描述


實驗結果

這裏寫圖片描述

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述


實驗程序

% 主函數

img = imread('Fig4.41(a).jpg');                 % 原圖像

img_low = FFT_2D(img,30);                       % 2-D FFT 程序包
img_sub = subtract(img,img_low);                % 相減得到銳化圖像
img_high = imread('img_gaussian_high.jpg');     % 高斯高通濾波圖像:D0=30
img_low1 = FFT_2D(img,50);                      % 調整參數
img_sub1 = subtract(img,img_low1);              % 相減得到銳化圖像與img_high接近

figure;
subplot(2,2,1);imshow(img);title('原圖像');
subplot(2,2,2);imshow(img_sub);title('相減圖像');
subplot(2,2,3);imshow(img_high);title('高斯高通濾波圖像');
subplot(2,2,4);imshow(img_sub1);title('調整參數:D0=50');
function img_out = FFT_2D(img,D0,low_high)
% 開發一個2-D FFT 程序包
% img爲輸入圖像,D0爲高斯低通濾波器的截止頻率

[M,N] = size(img);
img = double(img);

% 填充圖像
P = 2 * M;
Q = 2 * N;
img_fill = zeros(P,Q);
for m = 1:M
    for n = 1:N
        img_fill(m,n) = img(m,n);
    end
end

% 用因子(-1)^(x+y) 乘以輸入圖像,以實現濾波的中心化變換
img_shift = zeros(P,Q);
for p = 1:P
    for q = 1:Q
        img_shift(p,q) = power(-1,p+q) * img_fill(p,q);
    end
end

% 計算傅里葉變換
F_img = fft2(img_shift);

% 用一個實矩陣乘以一個複數矩陣,使用高斯低通濾波器        
H = gaussian_low_pass(img,D0);     
Y = H.* F_img;

% 計算反傅里葉變換
y = ifft2(Y);

% 結果乘以(-1)^(x+y),並取其實部
for p = 1:P
    for q = 1:Q
        y(p,q) = power(-1,p+q) * y(p,q);
        y(p,q) = real(y(p,q));
    end
end
y = uint8(y);

% 輸出圖像
img_out = zeros(M,N);
for m = 1:M
    for n = 1:N
        img_out(m,n) = y(m,n);
    end
end
img_out = uint8(img_out);

% 計算頻譜
F_y = fftshift(fft2(y));

% 計算圖4.41(a)的中心化後的傅里葉譜;
FF_img = fftshift(fft2(img));

% 使用二維圖像和三維圖形兩種形式顯示計算的幅度譜和相位譜
figure;
subplot(2,2,1);imshow(abs(FF_img),[]);title('二維幅度譜');
subplot(2,2,2);imshow(angle(FF_img));title('二維相位譜');
subplot(2,2,3);mesh(1:M,1:N,abs(FF_img));title('三維幅度譜');
subplot(2,2,4);mesh(1:M,1:N,angle(FF_img));title('三維相位譜');

imwrite(img,'img.jpg');
imwrite(img_fill,'img_fill.jpg');
imwrite(img_shift,'img_shift.jpg');
figure;imshow(abs(H),[]);title('高斯低通濾波器頻譜');
imwrite(y,'y.jpg');
imwrite(img_out,'img_out.jpg');

% figure;
% subplot(3,2,1);imshow(img);title('原圖像');
% subplot(3,2,2);imshow(img_fill);title('填充圖像');
% subplot(3,2,3);imshow(img_shift);title('乘以(-1)的(x+y)次方');
% subplot(3,2,4);imshow(abs(H),[]);title('高斯低通濾波器頻譜');
% subplot(3,2,5);imshow(y);title('ifft2後乘以(-1)的(x+y)次方');
% subplot(3,2,6);imshow(img_out);title('輸出圖像');
function H = gaussian_low_pass(img,D0)
% 高斯低通濾波器

[M,N] = size(img);
H = zeros(2*M,2*N);

for u = 1:2*M
    for v = 1:2*N
        D_square = (u-M) * (u-M) + (v-N) * (v-N); 
        H(u,v) = exp(-D_square/(2*D0*D0));        
    end
end

end
function img_out = subtract(img1,img2)
% 兩幅大小相同的圖像相減

[M,N] = size(img1);
img_out = zeros(M,N);

for m = 1:M
    for n = 1:N
        img_out(m,n) = img1(m,n) - img2(m,n);
    end
end
img_out = uint8(img_out);

end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章