1. 程式人生 > >Matlab Chap3 頻率域濾波

Matlab Chap3 頻率域濾波

主要的reference:《數字影象處理 MATLAB 岡薩雷斯》

1. 二維傅立葉變換

F(u,v)=M1x=0N1y=0f(x,y)ej2π(ux/M+yv/N) (DFT)

f(x,y)=1MNM1u=0N1v=0F(u,v)ej2π(ux/M+vy/N) (IDFT)

F(0,0)為直流分量,F(0,0)=1MNM1u=0N1v=0f(x,y) F(0,0)f(x,y)平均值的MN倍。

功率譜P(u,v)=F(u,v)2 .

1.若f(x,y)是實函式,F(u,v)仍然是複數,但關於原點共軛對稱。F(u,v) = F*(-u,-v);

2.頻譜(幅度)也關於原點對稱F(u,v) = |F(-u,-v)|

3.F(u,v) = F(u+k1M,v+k2N)。DFT在u,v方向上每隔M,N個長度週期重複。

同理,f(x,y)(IDFT)也是每隔M,N週期重複。

4.fftshift=DFT1x+yf(x,y)=F(uM/2,vN/2) 頻移特性,可使得頻譜中心在矩陣中心,而非第一個元素。

5.頻譜拉伸:舉例,lena.bmp圖片的第一個通道G分量(0~255)其頻譜fft2(f)=F的範圍為(1.9034,~48159521)。對於imshow(abs(F),[])是把F的範圍擴充套件到0`255,顯然截斷了大部分資訊。故使用log(1+abs(F))變為(0~17.69),再用imshow(,[])灰度拉伸到0~255.

2. 填零補充問題

由於離散傅立葉變換是,週期。空域卷積是迴圈卷積,在做DFT的時候,會導致上邊沿模糊,而左右邊沿不模糊。是因為沒有填零週期複製。為了填0,採用填充處理。如書中圖所示,會導致左右邊沿,上邊沿均模糊。而與此類似的處理,是直接imfilter(f,h),直接在空域做。頻域做:如下程式碼。可以直接把如下程式碼整合為一個子函式,見:

g = dftfil(f,H,classout);%classout = 'original'or'fltpoit'

f = imread('lena.bmp');
f = f(:,:,1);
F = fft2(f);
PQ=paddedsize(size
(f)); Fp = fft2(f,PQ(1),PQ(2)); Hp = lpfilter('gaussian',PQ(1),PQ(2),2*sig); % PQ=[512 512] % figure;imshow(fftshift(Hp),[]) Gp = Hp.*Fp; gp = ifft2(Gp); gpc = gp(1:size(f,1), 1:size(f,2));%擷取

chap3.4從空間濾波器到頻域濾波器

關鍵程式碼:freqz(h);freqz(h,PQ(size(f,1), PQ(size(f,2))));dftfilt(f,H1);

f = imread('lena.bmp');
f = f(:,:,1);
h = fspecial('sobel')'; % 增強垂直邊緣
%      1     0    -1
%      2     0    -2
%      1     0    -1
figure(1),freqz2(h); title('與空域Sobel對應的頻率中的H');
% uses [n2 n1] = [64 64].
% size_h = size(temp)

PQ = paddedsize(size(f));
H = freqz2(h,PQ(1),PQ(2)); % 產生的濾波器原點在矩陣中心處
H1 = ifftshift(H); % 遷移原點到左上角
figure,mesh(abs(H1(1:10:512,1:10:512)));
%生成濾波後的影象,空域與頻域處理相比較
gs = imfilter(double(f),h);
gf = dftfilt(f,H1);%零填充處理
figure(1);imshow(gs,[]);%gs,gf中有大量負值
figure(2);imshow(gf,[]);

figure(3);imshow(abs(gs),[]);
figure(4);imshow(abs(gf),[]);

figure(5);imshow(abs(gs) > 0.2*abs(max(gs(:))))%閾值化了,只顯示比閾值大的畫素
figure(6);imshow(abs(gf) > 0.2*abs(max(gf(:))))

d = abs(gs-gf);
max(d(:))
min(d(:))
%由d可知,頻域處理結果與空域處理結果,是一樣的。

chap3.5在頻率域中直接生成濾波器

距離函式

實現迴圈對稱濾波器,首先是距離函式。使得到原點的距離相等的點具有相同的距離。[U,V] = dftuv(M,N);就是實現這樣的功能。只是原點在左上角。

然後用距離函式生成別的濾波器函式。

使用lpfilter生成濾波器函式(頻率域的中心在左上角的) H = lpfilter(type,M,N,D0,n) 把函式整合為了而已,沒有什麼高深的程式碼。

type =‘ideal’理想低通濾波器,or ‘btw’巴特沃斯低通濾波器 or ‘gaussian’高斯低通濾波器

D0是截止頻率在距離中心為D0的地方;n是巴特沃斯濾波器的階數,其餘兩個不需要此引數。

M,N為矩陣大小

F1 = fft2(f); % 注意 F1 和 下面 F 的區別
figure(1);imshow(log(1+abs(fftshift(F1))),[])
title('傅立葉頻譜影象')

PQ = paddedsize(size(f));
[U V] = dftuv(PQ(1),PQ(2));%生成距離函式
D0 = 0.05*PQ(2);%截止頻率所在的距離處
F = fft2(f,PQ(1),PQ(2));%零填充之後的頻譜
figure(2);imshow(log(1+abs(fftshift(F))),[]);
title('傅立葉頻譜影象 零填充')

H = exp(-(U.^2+V.^2)/(2*(D0^2)));
figure(3);imshow(fftshift(H),[]);
title('高斯低通濾波器頻譜影象');
g = dftfilt(f,H);
figure(4);imshow(g,[])
title('高斯低通處理後圖像')
% figure;mesh(fftshift(abs(H(1:20:1024,1:20:1024))));%高斯低筒濾波器的三維網狀圖

mesh的使用(surf與此類似)

mesh(fftshift(abs(H(1:20:1024,1:20:1024))));%
%控制整個圖的顯示
axis([0 D0 0 D0 0 1]);
colormap([0 0 0])%顏色變為黑白
axis off; grid off;%關閉網格線和座標軸
view(-25,30);view(-25,0);%改變視角(方位角,仰角)

高通濾波的情況

由於hpfilter = 1-lpfilter;故這樣得到的濾波器,

最後,所有原始碼

f = imread('Fig0405(a)(square_original).tif');
F =fft2(f);
Fc = fftshift(F);
S = log(1+abs(Fc));
[M,N]=size(f);
%高斯低通濾波器
sig = 10;
H = lpfilter('gaussian',M,N,sig); % max(H(:)) = 1
% imshow(1-H,[]) % 顯示錶明濾波器影象未置中
title('濾波器頻譜(取反)影象');
G = H.*F;
%注:此處g含有負值
g = ifft2(G);%G是實對稱的,ifft就會檢驗到G是實對稱,則g是實數
% imshow(g,[]);
title('不使用填充的頻域低通濾波處理後的影象')
%PQ = 2*size(f)
PQ = paddedsize(size(f)); % size(f)=[256 256]
%對原始影象的周圍進行0填充
Fp = fft2(f, PQ(1),PQ(2));
Hp = lpfilter('gaussian',PQ(1),PQ(2),2*sig); % PQ=[512 512]
% figure;imshow(fftshift(Hp),[])
Gp = Hp.*Fp;
gp = ifft2(Gp);
% figure;imshow(gp,[]);
title('使用填充的頻域低通濾波處理後的影象')
gpc = gp(1:size(f,1), 1:size(f,2));%擷取
% imshow(gpc,[]);

h = fspecial('gaussian',15,7);
gs = imfilter(f,h);
% imshow(gs,[]);
title('使用空間濾波器處理後的影象');
% figure,mesh(abs(Hp(1:10:512,1:10:512)));

g = dftfilt(f,H);  % 幾步合併為一步 % 要求 H 原點在左上角
% figure;imshow(g,[]);

%%chap3.4從空間濾波器到頻域濾波器
f = imread('lena.bmp');
f = f(:,:,1);
h = fspecial('sobel')'; % 增強垂直邊緣
%      1     0    -1
%      2     0    -2
%      1     0    -1
figure(1),freqz2(h); title('與空域Sobel對應的頻率中的H');
% uses [n2 n1] = [64 64].
% size_h = size(temp)

PQ = paddedsize(size(f));
H = freqz2(h,PQ(1),PQ(2)); % 產生的濾波器原點在矩陣中心處
H1 = ifftshift(H); % 遷移原點到左上角
figure,mesh(abs(H1(1:10:512,1:10:512)));
%生成濾波後的影象,空域與頻域處理相比較
gs = imfilter(double(f),h);
gf = dftfilt(f,H1);%零填充處理
figure(1);imshow(gs,[]);%gs,gf中有大量負值
figure(2);imshow(gf,[]);

figure(3);imshow(abs(gs),[]);
figure(4);imshow(abs(gf),[]);

figure(5);imshow(abs(gs) > 0.2*abs(max(gs(:))))%閾值化了,只顯示比閾值大的畫素
figure(6);imshow(abs(gf) > 0.2*abs(max(gf(:))))

d = abs(gs-gf);
max(d(:))
min(d(:))
%由d可知,頻域處理結果與空域處理結果,是一樣的。

%%chap3.5在頻率域中直接生成濾波器
% [U,V] = dftuv(7,5);
% % [U,V] = dftuv(8,5);
% D = U.^2 + V.^2;
% fftshift(D);

F1 = fft2(f); % 注意 F1 和 下面 F 的區別
figure(1);imshow(log(1+abs(fftshift(F1))),[])
title('傅立葉頻譜影象')
%低通濾波,高斯低通濾波
PQ = paddedsize(size(f));
[U V] = dftuv(PQ(1),PQ(2));%生成距離函式
D0 = 0.05*PQ(2);%截止頻率所在的距離處
F = fft2(f,PQ(1),PQ(2));%零填充之後的頻譜
figure(2);imshow(log(1+abs(fftshift(F))),[]);
title('傅立葉頻譜影象 零填充')

H = exp(-(U.^2+V.^2)/(2*(D0^2)));
figure(3);imshow(fftshift(H),[]);
title('高斯低通濾波器頻譜影象');
g = dftfilt(f,H);
figure(4);imshow(g,[])
title('高斯低通處理後圖像')
% figure;mesh(fftshift(abs(H(1:20:1024,1:20:1024))));%高斯低筒濾波器的三維網狀圖

%%高通濾波的情況
PQ = paddedsize(size(f));
D0 = 0.05*PQ(1);
HBW = hpfilter('btw',PQ(1),PQ(2),D0,2);
% mesh(fftshift(HBW(1:40:1024,1:40:1024)));
H = 0.5+2*HBW;%偏離了直流項,高頻強調濾波
gbw = dftfilt(f,HBW);%頻域處理
% 使用了 gscale(gbw) 之後,imshowMy(gbw) 等價於 imshowMy(gbw,[])
gbw = gscale(gbw); 
figure(1);imshow(gbw,[])
title('高通濾波後的影象')
gbe = histeq(gbw,256);%直方圖均衡化
figure(2);imshow(gbe,[])
title('高通濾波並經過直方圖均衡化後的影象')
ghf = dftfilt(f,H);%頻域濾波處理
ghf = gscale(ghf);
figure(3);imshow(ghf,[])
title('高頻強調濾波後的影象')

ghe = histeq(ghf,256);
figure(4);imshow(ghe,[])
title('高頻強調濾波並經過直方圖均衡化後的影象')