天天看點

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

本節書摘來自異步社群《精通matlab數字圖像處理與識别》一書中的第6章,第6.5節,作者 張铮 , 倪紅霞 , 苑春苗 , 楊立紅,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

精通matlab數字圖像處理與識别

在頻譜中,低頻主要對應圖像在平滑區域的總體灰階級分布,而高頻對應圖像的細節部分,如邊緣和噪聲。是以,圖像平滑可以通過衰減圖像頻譜中的高頻部分來實作,這就建立了空間域圖像平滑與頻域低通濾波之間對應關系。

1.理論基礎

最容易想到的衰減高頻成份的方法就是在一個稱為“截止頻率”的位置“截斷”所有的高頻成份,将圖像頻譜中所有高于這一截止頻率的頻譜成份設為0,低于截止頻率的成份設為保持不變。能夠達到這種效果的濾波器如圖6.16所示,我們稱之為理想低通濾波器。如果圖像的寬度為m,高度為n,那麼理想低通頻域濾波器可形式化地描述為

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

其中d 0表示理想低通濾波器的截止頻率,濾波器的頻率域原點在頻譜圖像的中心處,在以截止頻率為半徑的圓形區域之内的濾鏡元素值全部為1,而該圓之外的濾鏡元素值全部為0。理想低通濾波器的頻率特性在截止頻率處十分陡峭,無法用硬體實作,這也是我們稱之為理想的原因,但其軟體程式設計的模拟實作較為簡單。

理想低通濾波器可在一定程度上去除圖像噪聲,但由此帶來的圖像邊緣和細節的模糊效應也較為明顯,其濾波之後的處理效果比較類似于5.3.1中的平均平滑。實際上,理想低通濾波器是一個與頻譜圖像同樣尺寸的二維矩陣,通過将矩陣中對應較高頻率的部分設為0,較低頻率的部分(靠近中心)設為1,可在與頻譜圖像相乘後有效去除頻譜的高頻成份(由于是矩陣對應元素相乘,頻譜高頻成份與濾波器中的0相乘)。其中0與1的交界處即對應濾波器的截止頻率。

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

2.matlab實作

利用我們編寫的imidealflpf函數可以得到截止頻率為freq的理想低通濾波器。

上述程式的運作效果如圖6.17和圖6.18所示。

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器
《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

從圖6.17和圖6.18可見,當截止頻率非常低時,隻有非常靠近原點的低頻成份能夠通過,圖像模糊嚴重;截止頻率越高,通過的頻率成份就越多,圖像模糊的程度越小,所獲得的圖像也就越接近原圖像。但可以看出,理想低通濾波器并不能很好地兼顧噪聲濾除與細節保留兩個方面,這和空域中采用平均模闆時的情形比較類似。下面,我們将介紹頻域的高斯低通濾波器,并比較它與理想低通濾波器的處理效果。

高斯低通濾波器的頻率域二維形式由下式給出。

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

高斯函數具有相對簡單的形式,而且它的傅立葉變換和傅立葉反變換都是實高斯函數。為了簡單起見,下面僅給出一個一維高斯函數的傅立葉變換和傅立葉反變換作為例子,式(6-52)告訴我們一維高斯函數的傅立葉反變換和正變換仍為高斯函數,該式的證明留給有興趣的讀者自己完成(提示:可以利用高斯分布的機率密度函數在定義域上積分為1的性質)。

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

式中:σ是高斯曲線的标準差。

頻域和與之對應的空域一維高斯函數的圖形如圖6.19所示。

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器
《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

從圖6.19可以發現,當σ增大時,h(u)的圖像傾向于變寬,而h(x)的圖像傾向于變窄和變高。這也展現了頻率域和空間域的對應關系。頻率域濾波器越窄,濾除的高頻成份越多,圖像就越平滑(模糊);而在空間域,對應的濾波器就越寬,相應的卷積模闆越平坦,平滑(模糊)效果就越明顯。

我們在圖6.20中分别給出σ取值為3和1時的頻域二維高斯濾波器的三維曲面表示,可以看出頻域下的二維高斯濾波器同樣具有上述一維情況時的特點。

《精通Matlab數字圖像處理與識别》一6.5 頻域低通濾波器

f<code>`</code>javascript

unction out = imgaussflpf(i, sigma)

% imgaussflpf函數 構造頻域高斯低通濾波器

% i參數 輸入的灰階圖像

% sigma參數 高斯函數的sigma參數

[m,n] = size(i);

out = ones(m,n);

for i=1:m

end

i = imread('../baby_noise.bmp'); %讀入原圖像

% 生成濾鏡

ff = imgaussflpf (i, 20);

% 應用濾鏡

out = imfreqfilt(i, ff);

figure (1);

subplot(2,2,1);

imshow(i);

title('source');

% 計算fft并顯示

temp = fft2(double(i));

temp = fftshift(temp);

temp = log(1 + abs(temp));

figure (2);

imshow(temp, []);

subplot(2,2,2);

imshow(out);

title('gauss lpf, sigma=20');

temp = fft2(out);

title(' gauss lpf, sigma=20');

ff = imgaussflpf (i, 40);

subplot(2,2,3);

title('gauss lpf, sigma =40');

title(' gauss lpf, sigma =40');

ff = imgaussflpf (i, 60);

subplot(2,2,4);

title('gauss lpf, sigma =60');

title(' gauss lpf, sigma =60');

繼續閱讀