Matlab Chap3 頻率域濾波
主要的reference:《數字影象處理 MATLAB 岡薩雷斯》
1. 二維傅立葉變換
功率譜
1.若
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.
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('高頻強調濾波並經過直方圖均衡化後的影象')