天天看點

【圖像處理】圖像濾波

圖像濾波

目錄

  • 1、學習了解線性濾波的基本原理
  • 2、練習實作均值濾波和高斯濾波
  • 3、學習了解非線性濾波的原理
  • 4、練習實作中值濾波和雙邊濾波

空間濾波

定義

​ 空間濾波是一種采用濾波處理的影像增強方法。其理論基礎是空間卷積和空間相關。目的是改善影像品質,包括去除高頻噪聲與幹擾,及影像邊緣增強、線性增強以及去模糊等。分為低通濾波(平滑化)、高通濾波(銳化)和帶通濾波。處理方法有計算機處理(數字濾波)和光學資訊處理兩種。(摘自百度百科)

空間濾波器

​ 空間濾波器由一個鄰域(通常是一個較小的矩形)和對該鄰域所包圍圖像像素執行的預定義操作組成。

​ 濾波産生一個新像素,新像素的坐标等于鄰域中心的坐标,像素的值是濾波操作的結果。濾波器的中心通路輸入圖像中的每個像素後,就生成了出了(濾波)後的圖像。如果在圖像像素上執行的是線性操作,則該濾波器稱為線性空間濾波器,否則,濾波器就稱為非線性空間濾波器。

一、線性濾波

線性濾波也稱平滑線性濾波,使用濾波器模闆确定的鄰域内像素的平均灰階值代替圖像中每個像素的值,這種處理的結果降低了圖像灰階的“尖銳”變化。由于典型的随機噪聲由灰階級的急劇變化組成,是以,常見的平滑處理應用就是降低噪聲。

線性空間濾波表達式

使用大小為 m × n m\times n m×n的濾波器對大小為 M × N M\times N M×N的圖像進行線性空間濾波,可由下式表示:

g ( x , y ) = ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x + s , y + t ) g(x,y) = \sum_{s=-a}^a\sum_{t=-b}^bw(s,t)f(x+s,y+t) g(x,y)=s=−a∑a​t=−b∑b​w(s,t)f(x+s,y+t)

式中, x x x和 y y y是可變的,以便 w w w中的每個像素可通路 f f f中的每個像素。

[外鍊圖檔轉存失敗(img-AJGFBOzz-1564669921973)(F:\學習筆記\opencv學習\day3\20190730222952.png)]

線上性濾波中,需要使用算子(核)按照一定的步長去卷積圖像中的每個像素點,然後使用新得出的點來補充到原圖像中。

均值濾波

均值濾波使用3 * 3或者5 * 5 的濾波核來卷積每個像素,然後求其均值并填充到原圖像中,獲得新的圖像。

代碼示例:

​ 這是由一個歸一化卷積框完成的。他隻是用卷積框覆寫區域所有像素的平均值來代替中心元素。可以使用函數 cv2.blur() 和 cv2.boxFilter() 來完這個任務。我們需要設定卷積框的寬和高。下面是一個 5x5 的歸一化卷積框:

import cv2

img = cv2.imread("img.jpg")
#使用5*5的卷積核進行均值濾波
blur = cv2.blur(img,(5,5))
cv2.imshow("img",blur)
           

原圖:

【圖像處理】圖像濾波

平均濾波:

【圖像處理】圖像濾波

由效果圖可以看出,圖像變得更加模糊了,這樣就可以達到均值模糊的效果。

高斯濾波

​ 現在把卷積核換成高斯核(簡單來說,方框不變,将原來每個方框的值是相等的,現在裡面的值是符合高斯分布的,方框中心的值最大,其餘方框根據距離中心元素的距離遞減,構成一個高斯小山包。原來的求平均數現在變成求權重平均數,全就是方框裡的值)。我們需要指定高斯核的寬和高(必須是奇數)。以及高斯函數沿 X,Y 方向的标準差。如果我們隻指定了 X 方向的的标準差,Y 方向也會取相同值。如果兩個标準差都是 0,那麼函數會根據核函數的大小自己計算。高斯濾波可以有效的從圖像中去除高斯噪音。

代碼示例:

import cv2

img = cv2.imread("img.jpg")
#0 是指根據視窗大小( 5,5 )來計算高斯函數标準差
gass = cv2.GaussianBlur(img,(5,5),0)
cv2.imshow("img",gass)
           

原圖:

【圖像處理】圖像濾波

高斯濾波:

【圖像處理】圖像濾波

二、非線性濾波

​ 從連續的(或離散的)輸入資料中濾除噪聲和幹擾以提取有用資訊的過程稱為濾波,而相應的裝置稱為濾波器。根據濾波器的輸出是否為輸入的線性函數,可将它分為線性濾波器和非線性濾波器兩種。非線性濾波的原始資料與濾波結果是一種邏輯關系,即用邏輯運算實作。

中值濾波

基本思想:用像素點鄰域灰階值的中值代替該像素的灰階值,該方法用去除脈沖噪聲,椒鹽 噪聲的同時又能保留圖像的邊緣細節 中值濾波是基于排序統計理論的一種能有效抑制噪聲的非線性信号處理技術。用中值代替鄰域中的點的像素值,進而消除獨立的噪聲點,對于斑點噪聲(speckle noise)和椒鹽噪聲(salt-and–pepper noise)。

代碼示例:

import cv2

img = cv2.imread("img.jpg")
median = cv2.medianBlur(img,5)
cv2.imshow("img",median)
           

原圖:

【圖像處理】圖像濾波

中值濾波:

【圖像處理】圖像濾波

雙邊濾波

結合圖像中的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域資訊和灰階相似性,達到了保邊去噪的目标。 雙邊濾波是基于空間分布的高斯濾波函數,是以在邊緣附近,離得較遠的像素不會對邊緣上的像素值影響太多。但是隻能對低頻資訊進行較好地濾波。

g ( i , j ) = ∑ k , l f ( k , l ) ω ( i , j , k , l ) ∑ k , l ω ( i , j , k , l ) g(i,j) =\frac{\sum_{k,l}f(k,l)\omega(i,j,k,l)}{\sum_{k,l}\omega(i,j,k,l)} g(i,j)=∑k,l​ω(i,j,k,l)∑k,l​f(k,l)ω(i,j,k,l)​

權重系數ω(i,j,k,l)ω(i,j,k,l)取決于定義域核和值域核的乘積

定義域核的表示如下:

d ( i , j , k , l ) = e x p ( − ( i − k ) 2 + ( j − l ) 22 σ 2 d ) d ( i , j , k , l ) = e x p ( − ( i − k ) 2 + ( j − l ) 22 σ d 2 ) d(i,j,k,l)=exp(−(i−k)2+(j−l)22σ2d)d(i,j,k,l)=exp(−(i−k)2+(j−l)22σd2) d(i,j,k,l)=exp(−(i−k)2+(j−l)22σ2d)d(i,j,k,l)=exp(−(i−k)2+(j−l)22σd2)

值域核的表示如下

r ( i , j , k , l ) = e x p ( − ∣ ∣ f ( i , j ) − f ( k , l ) ∣ ∣ 22 σ 2 r ) r(i,j,k,l)=exp(−||f(i,j)−f(k,l)||22σ2r) r(i,j,k,l)=exp(−∣∣f(i,j)−f(k,l)∣∣22σ2r)

代碼示例:

​ 函數 cv2.bilateralFilter() 能在保持邊界清晰的情況下有效的去除噪音。但是這種操作與其他濾波器相比會比較慢。我們已經知道高斯濾波器是求中心點鄰近區域像素的高斯權重平均值。這種高斯濾波器隻考慮像素之間的空間關系,而不會考慮像素值之間的關系(像素的相似度)。是以這種方法不會考慮一個像素是否位于邊界。是以邊界也會别模糊掉,而這正不是我們想要。雙邊濾波在同時使用空間高斯權重和灰階值相似性高斯權重。空間高斯函數確定隻有鄰近區域的像素對中心點有影響,灰階值相似性高斯函數確定隻有與中心像素灰階值相近的才會被用來做模糊運算。是以這種方法會確定邊界不會被模糊掉,因為邊界處的灰階值變化比較大。

import cv2

img = cv2.imread("img.jpg")
#9 鄰域直徑,兩個 75 分别是空間高斯函數标準差,灰階值相似性高斯函數标準差
blur = cv2.bilateralFilter(img,9,75,75)
cv2.imshow("img",blur)
           

原圖:

【圖像處理】圖像濾波

雙邊濾波:

【圖像處理】圖像濾波

學識有限隻能總結到此,如有新見解,及時更新。。。

參考:《數字圖像處理》第三版

OpenCV-Python 中文教程----段力輝