天天看點

圖像處理:頻域濾波_Matlab

學習筆記:數字圖像處理——頻域濾波matlab

相角的改變對圖像影響很大。

是以在濾波的時候,不改變相角,即等同影響實部和虛部,稱之為零相移濾波器。

零相移濾波器必須是關于原點對稱的。

基礎代碼:

%% 定義函數:二維傅裡葉變化 和 逆變化 (中心化)
F = @(x) fftshift(fft2(x));
Ft = @(x) ifft2(ifftshift(x));

%% 傅裡葉變化基礎
f = imread('rice.jpg');
f = rgb2gray(f);
F = fft2(f);       %傅裡葉變化,未中心化
Fc = fftshift(F);  %中心化
S = abs(Fc); %傅裡葉譜,強度
S2 = log(1+abs(Fc)); %友善顯示
phi = atan(imag(F),real(F)); %求相角
phi = angle(F);              %也是求相角
f = real(ifft2(F));  %原空間圖像

%% 頻域濾波
% 頻域的濾波實際上是周期性的,成為 循環卷積
%為了保證空間濾波 和 頻域濾波 結果相同,在進行濾波之前,對空域圖像填充0
% 有時候僅僅為了看簡單的效果,可以不填充0,直接空間濾波


% 函數paddedsize:matlab沒有自帶的,Gonzalez書中的:函數paddedsize,隻是計算大小的
% function PQ = paddedsize(AB,CD,PARAM)
% AB表示 f(x,y)的大小[A,B]
% CD表示 h(x,y)的大小[C,D]
% PQ表示 填充後的f大小[P,Q]
% PARAM 是幹嘛的,我也不知道

% 函數lpfilter:M不帶,生成一個低通濾波器,中心在邊緣
% function H = lpfilter(type, M, N, D0, n)
%   'ideal'     'btw'     'gaussian'
% 内含 dftuv ,計算距離

% 函數hpfilter:M不帶,生成一個高通濾波器,中心在邊緣

% 函數dftfilt:M不帶,接受輸入圖像和濾波器,輸出濾波後圖像,H中心在邊緣
% function g = dftfilt(f, H)

% bandfilter函數,帶阻,帶通濾波器


%頻域濾波
 PQ = paddedsize(size(f));
 Fp = fft2(f,PQ(1),PQ(2)); %padding方式計算fft,f自動填充到PQ的大小
 Hp =lpfilter('gaussian',PQ(1),PQ(2),(PQ(1))/6);%生成一個PQ大小的高斯濾波器
 Gp = Hp .* Fp;
 gp = ifft2(Gp);
 gpc = gp(1:size(f,1),1:size(f,2)); %修剪左上部分矩形大小為原始大小
 imshow(gpc,[])
 
 %頻域濾波 直接使用 dftfilt
 gpc = dftfilt(f, Hp);% Hp大小應該是填充後的大小PQ
 imshow(gpc,[])
 
 %空間濾波  都是matlab自帶
 h = fspecial('gaussian',15,7);  %先生成空間濾波器
 gs = imfilter(f,h);  %再濾波
 
%空域生成 頻域濾波函數
%h是空間濾波器,R C 是生成的頻域濾波器的行列
%H的中心在中心
%  H = freqz2(h,R,C);
H = freqz2(h,PQ(1),PQ(2));
H1 = ifftshift(H);
gf = dftfilt(f,H1);%頻域濾波後結果