影像濾波演算法整理--均值、中值、高斯、拉普拉斯運算元、梯度運算元:

高立帥發表於2020-12-01

首先分為平滑空間濾波器和銳化空間濾波器來進行介紹。平滑空間濾波器主要用於模糊處理和降低噪聲,主要兩類:均值濾波器和中值濾波器。銳化空間濾波器主要是:拉普拉斯運算元和梯度運算元。

一、均值濾波方法:對高斯噪聲的抑制效果較好。

       假設我們有一個3*3的模板,係數全為1,那麼欲求的中心點畫素值就是以該模板為中心的9個畫素的平均值來代替。根據定義可知,該濾波器具有模糊邊緣的負面效應。通過空間均值處理來模糊影像,可以突出感興趣的物體,即將部分影像融入背景中 ,部分影像‘突出顯示’出來,達到平滑影像的作用,重點理解平滑對於影像的意義。

MATLAB程式碼:

set(gca,'Fontname','Monospaced');
I=imread('a.tif');   
subplot(231),imshow(I), title('origin image');  
%I=rgb2gray(I);  
%I1=imnoise(I,'salt & pepper',0.02);  
%subplot(2 3 2)  
%imshow(I1)  
%title('新增椒鹽噪聲的影像');
I1 = I;
k1=filter2(fspecial('average',3),I1)/255; %進行3*3模板平滑濾波
k2=filter2(fspecial('average',5),I1)/255; %進行5*5模板平滑濾波  
k3=filter2(fspecial('average',7),I1)/255; %進行7*7模板平滑濾波  
k4=filter2(fspecial('average',9),I1)/255; %進行9*9模板平滑濾波  
k5=filter2(fspecial('average',15),I1)/255; %進行15*15模板平滑濾波  
subplot(232),imshow(k1);title('3*3 smoothing filtering');  
subplot(233),imshow(k2);title('5*5 smoothing filtering');  
subplot(234),imshow(k3);title('7*7 smoothing filtering');  
subplot(235),imshow(k4);title('9*9 smoothing filtering');  
subplot(236),imshow(k5);title('15*15 smoothing filtering');  

結果:可以看出,在模板逐漸擴大的過程中,影像的鋸齒邊緣被模糊掉,顆粒狀的噪聲也沒有了,達到了我們想要的效果,但是在9*9甚至更大的模板,影像開始失真,影像過度模糊了。所以我們在影像平滑的時候,要選最佳的模板尺寸。 

二、中值濾波方法:對椒鹽噪聲的抑制效果較好。

中值濾波器是一種統計排序濾波器,即影像畫素等於周圍畫素排序後的中值,加入模板為3*3,則目標點的畫素等於排序後的第五個畫素的值。中值濾波器特別適用於椒鹽噪聲由定義知,中值濾波器對於孤立點特別敏感,還可以保持影像的邊緣特性。由中值濾波擴充套件出來的還有最大值濾波器和最小值濾波器。

MATLAB程式碼:

%=======second part======
I = imread('book_XRaySalt.tif');
subplot(131),imshow(I);title('原椒鹽噪聲影像');
 
k1=filter2(fspecial('average',3),I)/255; 	%進行3*3模板平滑濾波
 
k2=medfilt2(I,[3,3]); 						%進行3*3模板中值濾波
 
subplot(132),imshow(k1);title('3*3模板均值濾波');  
subplot(133),imshow(k2);title('3*3模板中值濾波');
I(100:110,100:110),
k2(100:110,100:110),

結果:

三、高斯濾波方法

        高斯濾波器是利用高斯核與輸入影像的每個點進行卷積。提到高斯,就想到‘草帽’,更能記住它。高斯濾波器是一種平滑線性濾波器,使用高斯濾波器對影像進行濾波,其效果是降低影像灰度的“尖銳”變化,也就是使影像“模糊”了。高斯濾波對於抑制服從正態分佈的噪聲效果非常好,其代價是使影像變得“模糊”。當然,有時對影像進行平滑濾波的目的就是讓影像變得模糊。

一維高斯分佈函式:                                                                                二維高斯分佈函式:

                                          

它們的影像分別為:

            

其3*3與5*5的卷積核對應如下:

MATLAB實現:

img = imread('lena.tif');
w = fspecial('gaussian',[5,5],0.5);
%replicate:影像大小通過賦值外邊界的值來擴充套件
%symmetric 影像大小通過沿自身的邊界進行映象對映擴充套件
I = imfilter(img,w,'replicate');
subplot(1,2,1);title('原影像');imshow(img);
subplot(1,2,2);title('高斯濾波後的影像');imshow(I);

從結果可以看出,影像整體模糊平滑了,特別是頭髮和帽子部分,是影像的尖銳變化被降低了吧。

 

參考影像銳化(增強)和邊緣檢測:https://blog.csdn.net/mghhz816210/article/details/37820483

四、拉普拉斯演算法進行影像銳化

       拉普拉斯運算元是一種二階微分運算元,其強調的是影像中灰度的突變,通過將原影像和拉普拉斯影像加在一起,可以達到銳化影像的作用,最終在保留影像的背景資訊的前提下從而突出細節。拉普拉斯銳化模板在邊緣檢測中非常有用。因為影像的邊緣就是那些灰度跳變厲害的的區域。

拉普拉斯運算元模板:

實現程式碼:

%=============================================================
f=imread('moon.jpg');
subplot(2,3,1),imshow(f);  
title('原影像'); 
 
w4=fspecial('laplacian',0),
g1=imfilter(f,w4,'replicate');
subplot(2,3,2),imshow(g1); title('拉普拉斯模板濾波後的影像'); 
 
f2=im2double(f);%將f轉換歸一化的double類影像,然後進行濾波
g2=imfilter(f2,w4,'replicate');
% imshow(img,[low high])  [low high]用於指定影像顯示的灰度範圍 對於double資料認為是0-1範圍內
subplot(2,3,3),imshow(g2,[]);   title('含有負值的濾波結果'); 
 
g=f2-g2;
subplot(2,3,4),imshow(g);title('原圖-含有負值的濾波結果');
 
%w8=[0 1 0;1 -4 1;0 1 0],
w8=[1 1 1;1 -8 1;1 1 1],
g8=f - imfilter(f,w8,'replicate');
subplot(2,3,5),imshow(g8);title('對角線中心為8的拉普拉斯模板');
 
 
%=============================================================

五、梯度運算元進行影像銳化

     相比於拉普拉斯二階微分運算元,梯度運算元一一階微分運算元,更為簡單。其實個人覺得,把梯度運算元放在‘ 邊緣檢測’更為合適。

f(x,y)在X方向和Y方向的梯度:

經典模板:

車道線檢測之-sobel運算元邊緣檢測原理:https://blog.csdn.net/aiailab/article/details/82849158

程式碼實現:

程式碼中增加註釋,很詳細的介紹了求梯度運算元銳化的過程。

%   soble algorithm
%   ZhangFL at SWPU  2017.04.26
%   Sobel運算元中的垂直模板得到的梯度圖,由於梯度方向與邊緣走向垂直,所以該梯度圖對水平邊緣有較強的響應,從而水平細節資訊非常清晰。
%   sobel運算元中的水平模板得到的梯度圖,它對垂直邊緣有較強的響應,垂直細節非常清晰。
%   Sobel運算元水平和垂直方向疊加的梯度圖,水平和垂直細節都非常清晰。
 A=imread('house.tif');  
 %I=rgb2gray(A);
  I=A;
 
 subplot(2,2,1); 
 imshow(I);  
 title('原圖'); 
 
  k2=filter2(fspecial('average',5),I)/255; %進行5*5模板平滑濾波
  I=k2;
  hx=[-1 -2 -1;0 0 0 ;1 2 1],  %產生sobel垂直梯度模板
  hy=hx',                    %產生sobel水平梯度模板
  
  gradx=filter2(hx,I,'same');
  gradx=abs(gradx); %計算影像的sobel垂直梯度
  subplot(2,2,2);
  imshow(gradx,[]);
  title('影像的sobel垂直梯度');
  
  
  grady=filter2(hy,I,'same');
  grady=abs(grady); %計算影像的sobel水平梯度
  subplot(2,2,3);
  imshow(grady,[]);
   title('影像的sobel水平梯度');
   
   grad=gradx+grady;  %得到影像的sobel梯度
   subplot(2,2,4);
   imshow(grad,[]);
   title('影像的sobel梯度(使用5*5模板平滑濾波)');
   

 

相關文章