Matlab之頻域濾波下三大LPF
阿新 • • 發佈:2018-11-25
目錄
Python中OpenCV2下實現參見這裡
一、初始知識
- 關於 distmatrix 的作用,見https://blog.csdn.net/qq_37385726/article/details/82697648,看原始碼可以知道函式的意義。
- 但是,不懂函式的意義也沒關係,只要記住,fftshift(distmatrix)生成的是各個座標到中心座標的距離即可
[M,N] = size(tif); D = distmatrix(M,N); dist = fftshift(D); %距離矩陣(距中心) figure subplot(1,2,1),mesh(D),title('distmatrix'); subplot(1,2,2),mesh(fftshift(D)),title('fftshift(distmatrix)');
- 關於傅立葉變換,知道頻域濾波就知道傅立葉變換實現的是時域(空域)到頻率域的轉變,對於2D傅立葉變換,座標(1,1) %Python中為(0,0)%是頻率為0的直流訊號,座標(u,v)是在x方向頻率為u,y方向頻率為v的訊號
二、理想LPF
由於生硬的過度,影象會產生振鈴偽影。
% idea LPF
H1 = zeros(M,N);
radius = 35;
ind = dist <= radius;
H1(ind) = 1;
Hd1 = double(H1);
三、高斯LPF
% Gaussion LPF sigma = 30; H2 = exp(-dist.^2/2/sigma^2); Hd2 = double(H2);
四、巴特沃斯(Butterworth)LPF
從函式圖上看,更圓滑,用冪係數n可以改變濾波器的形狀。n越大,則該濾波器越接近於理想濾波器
% Butterworth LPF
D0 = 30;
n = 3;
H3 = 1./(1+(dist/D0).^(2*n));
Hd3 = double(H3);
五、濾波器和頻譜的卷積
I_dft = fft2(tif); %原頻譜 fts = fftshift(I_dft); %shift後的頻譜 ft_img1 = fts .* Hd1; ft_img2 = fts .* Hd2; ft_img3 = fts .* Hd3;
六、完整程式碼
tif = imread('C:\\Program Files\\MATLAB\\R2017a\\toolbox\\images\\imdata\\AT3_1m4_01.tif');
tif = im2double(tif);
I_dft = fft2(tif); %原頻譜
fts = fftshift(I_dft); %shift後的頻譜
[M,N] = size(tif);
D = distmatrix(M,N);
dist = fftshift(D); %距離矩陣(距中心)
% idea LPF
H1 = zeros(M,N);
radius = 35;
ind = dist <= radius;
H1(ind) = 1;
Hd1 = double(H1);
% Gaussion LPF
sigma = 30;
H2 = exp(-dist.^2/2/sigma^2);
Hd2 = double(H2);
% Butterworth LPF
D0 = 30;
n = 3;
H3 = 1./(1+(dist/D0).^(2*n));
Hd3 = double(H3);
ft_img1 = fftshift(I_dft) .* Hd1;
ft_img2 = fftshift(I_dft) .* Hd2;
ft_img3 = fftshift(I_dft) .* Hd3;
subplot(1,4,1),imshow(tif),axis tight,title('initial');
subplot(1,4,2),imshow(real(ifft2(fftshift(ft_img1)))),axis tight,title('Ideal LPF');
subplot(1,4,3),imshow(real(ifft2(fftshift(ft_img2)))),axis tight,title('Guassion LPF');
subplot(1,4,4),imshow(real(ifft2(fftshift(ft_img3)))),axis tight,title('Butterworth LPF');
三類濾波器mesh後的形狀:
頻譜的變化如下: