關于matlab圖像濾波詳解(二維傅里葉濾波)
matlab圖像濾波詳解(二維傅里葉濾波)
在matlab中,圖像濾波有很多中
- 比如平滑濾波(smooth()函數)
- 中值濾波medfilt2()函數)
這些相對簡單,可以直接參考函數解釋,不做詳細解說
這里重點講解一下傅里葉濾波,在matlab中,常用的為快速傅里葉變換。進行濾波的難點就在于如何將圖像轉換到頻率域以及如何將頻率域的圖像逆變換為空間域中的圖像
第一步:讀取圖像并對圖像進行傅里葉變換
Path='images.jpg';
im=imread(Path);
img=rgb2gray(im);%將彩色圖變成二維灰度圖圖像
img2=double(img);%將數據改成double類型,方便進行數據變換
subplot(131)
imshow(img);
title('原始圖像')
f=fft2(img2);此時,f為圖像的二維頻譜,但是此時的零頻分量并不在中間,如果直接進行顯示的話,會出現如下結果(見左圖),matlab提供ffishift()函數,可以將圖像零頻分量移到中間
代碼見下:
subplot(121)
imshow(log(abs(f)+1),[]);%直接顯示圖像,未移動零頻分量
title('未移動零頻分量頻譜圖')
subplot(122)
f2=fftshift(f);
imshow(log(abs(f2)+1),[]);%直接顯示圖像,未移動零頻分量
title('移動零頻分量頻譜圖')這里有人肯定會疑問 log(abs(f)+1)中為什么要+1,不加也行,就是為了畫圖的時候,讓f為零 log(abs(f)+1),不加1的話 log(abs(f))會很大,圖像不好看
結果如下

第二步:濾波
濾波分為低通、高通、帶通、帶阻、高斯低通、高低高通濾波,其本質就是令頻譜F乘以濾波器H,針對不同的濾波器,H不同
低通濾波器【D(u,v)表示點(u,v)到中心的距離】

在此我們以高斯低通濾波器為例,利用matlab設計濾波器(設D0為10)
D0=10;
[M,N]=size(f2);
m=floor(M/2);
n=floor(N/2);%(n,m)為中心點
for i=1:M
for j=1:N
D=sqrt((i-m)^2+(j-n)^2);
H(i,j)=exp(-1/2*D^2/D0^2);
end
end
figure
subplot(121)
imshow(H);
title('高斯低通濾波器')濾波器與頻譜相乘,即得到濾波后的頻譜
subplot(122)
f3=f2.*H;
imshow(log(abs(f3)+1),[])
title('濾波后的頻譜')結果如下

第三步:傅里葉逆變換
進行逆變換時,要先將頻譜移動回原位置,即通過ifftshift( )函數實現,代碼如下
img3 = (ifft2(ifftshift(f3)));
img4 = uint8(real(img3));%real函數表示留下復數的實部
figure
subplot(121)
imshow(img);
title('原圖');
subplot(122)
imshow(img4);
title('逆變換');結果如下

這里要注意的是逆變換后的img3為復數,要刪除虛數部分,并轉換成uint8圖像格式數據才能用imshow顯示
總結
1. 其他濾波器原理只要在H函數定義部分稍微改動一下即可
2. 不必過多糾結log(abs(f3)+1)為什么取對數以及為何加1,只是單純的為了顯示更加直觀
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
使用python畫出邏輯斯蒂映射(logistic map)中的分叉圖案例
這篇文章主要介紹了使用python畫出邏輯斯蒂映射(logistic map)中的分叉圖案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
深入理解Python中的*args和**kwargs參數(示例代碼)
*args和**kwargs是Python函數編程中極其有用的特性,它們?yōu)楹瘮祬档奶幚硖峁┝藰O大的靈活性和強大的功能,這篇文章主要介紹了Python中的*args和**kwargs參數,需要的朋友可以參考下2024-06-06

