大三上學期學的數字信號處理,Matlab大實驗可以自選題,想到老師上課說的IIR、FIR的區別,藉助圖像觀察兩種濾波器的區別。當然,現在大家使用的圖像處理算法是現代濾波器,與經典濾波器分析問題的角度不同,但本質上還是對圖像的濾波。本文爲我基於Matlab語言實現的IIR、FIR濾波。
一、實驗任務
1. 利用 Matlab 實現簡單的圖像操作
2. 爲圖像加上噪聲,並用Matlab製作FIR、IIR帶限濾波器,觀察處理效果
3. 利用 Simulink 搭建簡單的圖像處理工程
4. 探究 Matlab 和 ModelSim 結合的FPGA圖像處理仿真平臺
二、主要實驗儀器及材料
Windows 10操作系統、Matlab2018a
三、基於Matlab的圖像濾波
1.圖像的讀入
實驗內容:
通過Matlab讀入彩色圖像,並獲得其長,寬等基本信息。
實驗步驟:
在Matlab工程目錄下,保存一幅彩色圖片,命名爲`image.jpg`。
使用imread函數可讀入圖像,並返回一個對象;使用size函數可返回函數的長寬信息;由於圖像要通過濾波器,使用rgb三通道需要分別設計三種濾波器,爲實驗過程增加了不必要的工作量,所以本次實驗處理灰色圖像,使用rgb2gray函數可將rgb圖像轉化成灰度圖。
%% 圖像的讀取以及轉換
rawImg=imread('image.jpg'); %讀取jpg圖像
grayImg=rgb2gray(rawImg); %生成灰度圖像
[row,col]=size(grayImg); %求圖像長寬
生成的灰度圖像如下圖所示:
2.添加噪聲
實驗內容:
爲原圖像添加噪聲,爲驗證帶限濾波器和非帶限濾波器(中值濾波、卡爾曼
濾波)的特點、分別加入以下兩類噪聲。
1)多個單頻率的正弦波噪聲疊加。頻率分別爲:350Hz、400Hz、450Hz;
2)高斯白噪聲;‘
實驗步驟:
首先規定掃描頻率和掃描時間間隔。再分別生成三種頻率的正弦波,其長度需要與圖像的像素點數匹配,併疊加成噪聲:
fz1=350;fz2=400;fz3=450;% 三個噪聲頻率
noise=0.4*sin(2*pi*fz1*n*T)+...
0.7*sin(2*pi*fz2*n*T)+...
0.5*sin(2*pi*fz3*n*T);% 噪聲序列
爲了將正弦波噪聲疊加到圖像上,首先需要將二維圖像的數據作歸一化處理,然後映射到一維。
normImgMartix=im2double(grayImg); % 圖像數據進行歸一化
rawMartix=zeros(1,row*col); % 初始化一維矩陣
for i=1:row
for j=1:col
rawMartix(col*(i-1)+j)=normImgMartix(i,j);
end
end %將M*N維矩陣變成1維矩陣
再進行灰度圖像和噪聲信號的疊加,並將一維變換到二維。
rawMartixWithNoise=rawMartix+noise;% 加入噪聲的序列
noiseMartix=zeros(row,col);
% 一維變M*N矩陣
for i=1:row
for j=1:col
noiseMartix(i,j)=rawMartixWithNoise(col*(i-1)+j);
end
end
加入單頻混疊干擾的圖像如下圖所示:
再然後,再原始圖像上加入高斯白噪聲,Matlab內置了噪聲函數,調用語法如下。
whiteNoiseImg=imnoise(grayImg); % 加高斯噪聲,給simulink用
加入高斯白噪聲的圖像如下圖所示:
3.設計數字濾波器
實驗內容:
設計IIR、FIR數字低通濾波器。
低通濾波器性能指標,,,,。
觀察兩種濾波器對加入了單頻混疊噪聲的圖像的濾除效果,比較兩者的優缺點。再觀察兩種低通濾波器對加入了高斯白噪聲的圖像的屢出效果,分析原因。
實驗步驟:
首先,設計IIR低通濾波器,用直接設計數字濾波器法設計巴特沃斯低通濾波器。再用hamming窗設計FIR低通濾波器,相關設計代碼如下:
%% 設計IIR濾波器並分析相關指標
wp=250*2/fs;ws=300*2/fs;Rp=3;Rs=20;
[Nm,Wc]=buttord(wp,ws,Rp,Rs);
[b,a]=butter(Nm,Wc);
H=freqz(b,a,f*2*pi/fs);
mag=abs(H);pha=angle(H);
mag1=20*log((mag+eps)/max(mag));
%% 設計FIR濾波器並分析相關指標
wc=280*2/fs;
%6dB截止頻率280kHz
fx=[0 wc wc 1];
m=[1 1 0 0];
%理想頻幅響應
b1=fir2(40,fx,m,hamming(41));
H1=freqz(b1,1,f*2*pi/fs);
mag2=abs(H1);pha1=angle(H1);
mag3=20*log((mag2+eps)/max(mag2));
觀察設計出的兩種濾波器的特性。
分別用IIR、FIR濾波器濾除圖像中的單頻混疊噪聲,並且爲了便於觀察圖像的頻譜變化,做一次中心變換。
rawMartixWithNoiseWithIIR=filter(b,a,rawMartixWithNoise);
rawMartixWithNoiseWithIIRFFT=fft(rawMartixWithNoiseWithIIR);
rawMartixWithNoiseWithIIRFFTShift=fftshift(rawMartixWithNoiseWithIIRFFT);
其中,b,a爲設計出的濾波器的分子分母系數,將其帶入爲IIR、FIR濾波器相應係數即可。觀察其濾除後的圖像。
對上述結果作簡單分析:經過兩個低通濾波器,高頻干擾被濾除了。但是圖像有部分失真,體現在圖像的左邊有小塊黑點,這些黑點原本是屬於圖像的右側。原因在於同一個像素點,經過濾波器會產生一定的延時,階數越高,延時越大,由於相同指標下,FIR的階數比IIR的階數要高,所以其產生的延時越大,效果也越差一點。但是由於FIR是線性相位,每一個點的延時都是相同的, 所以很好進行修正。下面探討修正的方法。
4.對濾波後的圖像進行相位修正
實驗內容:
由於信號通過兩類濾波器像素點會產生延時,會出現圖像部分像素點偏移的
情況,現在探討如何對這種情況進行修正。利用Matlab自帶的grpdelay函數能夠獲得濾波器的延時情況。根據情況,給出解決方案。
實驗步驟:
求解濾波器延時調用代碼格式爲:
grd=grpdelay(b,a,f*2*pi/fs);
上述代碼中,b,a爲對應濾波器的分子分母系數。由於結果過於長,這裏不列出。僅給出結論。對於IIR濾波器,不同的像素點輸入後的羣延時不同,對於FIR濾波器,每一個像素點的延時都是定值,在本實驗中,該值爲20,所以我們只需要將FIR濾波器處理後的圖像向前推移20位即可。編寫代碼如下:
K=round(mean(grd));
rawMartixWithNoiseWithFIRFixed=[rawMartixWithNoiseWithFIR((K+1):L),rawMartixWithNoiseWithFIR(1:K)];
再將圖像轉換成二維矩陣顯示,處理後的結果如下圖所示:
但是對於IIR濾波器,由於延時不同,其失真不可挽回,且對於每個像素點都要減去相應的延時。即使能夠勉強恢復圖像,耗費的時間也是很大的。所以可以得出結論對於圖像處理來說FIR濾波器比IIR濾波器更適合。
5.比較濾波前後圖像的頻譜
實驗內容:
在一個窗口裏畫出圖像經過Matlab處理過程中的頻譜圖,反應頻譜變化。
實驗步驟:
各狀態的頻譜圖如下圖所示:
可以看到濾波器工作正常,各頻率成分有被很好的濾除。調用sound函數回放聲音,感受聲音的變化。
5.高斯白噪聲的濾除
實驗內容:
對於高斯白噪聲,首先嚐試FIR、IIR濾波器的濾除方法,觀察效果。後結
合Simulink給出更好的解決方案。
實驗步驟:
首先,嘗試用IIR、FIR濾波器對摻入噪聲的圖片進行濾波,效果如下圖。
可以發現,結果中看不到原始圖像的特徵。分析原因:高斯白噪聲的頻帶覆蓋了整個頻譜,會將原始圖像的頻譜淹沒。如果此時仍然使用帶通濾波器很難再將原有的圖像恢復。在網絡上查閱資料不難發現,高斯白噪聲較好的濾除方法是中值濾波。
中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點。從其算法原理來看,對於上述人爲添加的高頻混疊干擾來說,中值濾波起不到很好效果,但對於高斯白噪聲這一類隨機噪聲,能夠起到較好的過濾作用。
接下來,在SimuLink裏搭建圖像處理平臺與中值濾波環境。簡單介紹一下使用到的模塊:
Image From Workspace: 獲取工作區的圖像類型,獲取白噪聲。
Median Filter:中值濾波。
Video Viewer:能夠將圖像矩陣可視化顯示的模塊。
在SimuLink中搭建工程如下圖所示:
運行後,結果如下圖所示:
可見,相對於帶限濾波器而言,中值濾波對白噪聲的處理有更好的效果。