數字圖像基本處理——空間濾波(spatial filtering)


空間濾波器主要包括平滑濾波器和銳化濾波器,下面從理論和實踐兩個部分闡述。

理論

空間濾波的公式如下:

 

 空間濾波的過程也就是不斷用一個filter(一般為3X3)在圖像上與同樣大小的局部patch作用,作用結果更新在中心點上,所以需要m,n為奇數。

在2維時域信號上做卷積與此公式稍有不同,如下:

 可以看到,空間濾波公式中兩個+變成了-,對應於空間濾波中的filter旋轉180度之后的filter相作用,所以當filter為對角線對稱的時候,空間濾波與2維卷積是一樣的,而通常filter是對角線對稱的。區別於卷積,一般將空間濾波描述為correlation,即看filter和圖片上local patch的相關性。


 

1、平滑濾波器

平滑濾波器的兩個主要作用是模糊化和降噪(如美顏相機中的磨皮操作)

 分母除以一個數保證變換后強度不會大增。

 1.1 線性濾波

常用的線性濾波有均值濾波(頻域上的低通濾波器)和高斯濾波。下圖分別是均值濾波器(左)和高斯濾波器(右)示例:

一個例子就是處理如下左圖,只想保留較大的點,通過平滑過濾器模糊化,將小點融合,該地方有個trick就是因為該圖對比度比較明顯,可以通過加閾值來截斷亮點和暗點。

 

1.2 非線性濾波

常用的線性濾波有中值濾波和最大值濾波。

中值濾波器:

 從上式很容易看出中值濾波就是在輸入圖像的patch上用中值代替該點。中值濾波器適用於突變的噪聲點,尤其是impluse noise和pepper noise。


 

2、銳化

銳化就是突出邊緣信息,而邊緣會有像素點上的突變,所以可以用導數來檢測邊緣。

一維空間中一階導數和二階導數如下:(一階導數就是導數的定義,二階導數利用一階導數的公式求解得,需要替換一次自變量)

 二維空間中,需要對x,y求偏導

 求和得到2維空間中的2階導數(這也就是拉普拉斯算子):

 上式也可以寫成一個3X3的spatial filter(系數對應filter中的值):

 這個濾波器叫做Laplacian Filter Masks,類似的還有:

 由於Laplacian Filter Masks對應的是二階導數,可以檢測出邊緣信息,但是導數相較於原圖,損失了強度,所以銳化需要疊加上原圖的信息,只需再加上一個只有中間值為1的filter,也即在Laplacian Filter Masks中間的值上+1(如4+1)/-1(如-8-1)。


 

實踐

下圖是一個overall的結果,后續的結果都基於此進行調整:

 可以看出平滑后的船體要稍微模糊一些。基於此,我們可以增加low pass filter的尺寸來觀察結果,我們將原來的3X3,改為5X5,結果如下:

 

 可以看出,增大低通filter size,圖像更加模糊。

我們可以看出第一張圖的subplot5只得到了圖像的邊緣,為了恢復圖像的原本信息,需要疊加上原始圖像信息,更改后結果如下:

 為了更清楚的看到中值濾波的效果,更換測試圖片:

 我們可以看出中值濾波器對於椒鹽噪聲效果非常好。下面測試一下不同的filter size對中值濾波器結果的影響:

 filter size從左到右分別為:[3 3]; [11 1]; [1 11]。我們可以看出后面兩種情況可以分別消除橫紋或縱紋。

 本實踐部分代碼如下:

addpath('E:\Digital_img_processing\Lecture_5_discussion_spatial_filter');
fig0=imread('ex_median.jpg');
% smooth filter
LP=1/9*[1 1 1; 1 1 1; 1 1 1];
LP1=1/49*[1 1 1 1 1 1 1; 1 1 1 1 1 1 1; 1 1 1 1 1 1 1; 1 1 1 1 1 1 1; 1 1 1 1 1 1 1; 1 1 1 1 1 1 1; 1 1 1 1 1 1 1];
GP=1/16*[1 2 1; 2 4 2; 1 2 1];
if length(size(fig0))==3 % 如果為彩色的,需要轉為灰色的,否則不變,由中值濾波使用;也可以調用3D函數,這樣就不需要轉換
    fig0_gray=rgb2gray(fig0);
else
    fig0_gray=fig0;
end
fig1=imfilter(fig0,LP);
fig2=imfilter(fig0,GP);
% median filter
fig3=medfilt2(fig0_gray,[3 3]);
% fig4=medfilt2(fig0_gray,[6 6]); 奇數
fig5=medfilt2(fig0_gray,[11 1]);
fig6=medfilt2(fig0_gray,[1 11]);
% sharpening filter 值可能為負,所以需要轉成double
SF=[-1 -1 -1; -1 8 -1; -1 -1 -1];
SF1=[-1 -1 -1; -1 9 -1; -1 -1 -1]; % Add the original intensity
fig7=imfilter(im2double(fig0),SF1);
% plot
figure; 
subplot(2,3,1);imshow(fig0,[]);title('original')
subplot(2,3,2);imshow(fig1,[]);title('low pass filter')
subplot(2,3,3);imshow(fig2,[]);title('gaussian filter')
subplot(2,3,4);imshow(fig5,[]);title('median filter')
subplot(2,3,5);imshow(im2uint8(fig7));title('sharpening filter')

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM