在圖像處理、計算機視覺領域,我們有時需要對原始圖像進行預處理。圖像濾波是一種比較常用的方法,通過濾波操作,就可以突出一些特徵或者去除圖像中不需要的成分。通過選取不同的濾波器,在原始圖像上進行滑動和卷積,藉助相鄰的像素值就可以決定該像素最後的輸出。最常見的算子分爲兩類,一個是圖像平滑去噪功能、一個是邊緣檢測功能,下文中會對這兩類進行展開。
平滑濾波器
1. 高斯濾波
高斯濾波器是一種可以使圖像平滑的濾波器,用於去除噪聲。
高斯濾波器將中心像素周圍的像素按照高斯分佈加權平均進行平滑化。這樣的二維權值通常被稱爲卷積核(kernel)或者濾波器(filter)。
但是,由於圖像的長寬可能不是濾波器大小的整數倍,同時我們希望輸出圖像的維度與輸入圖像一致,因此我們需要在圖像的邊緣補0,具體補幾個0視濾波器與圖像的大小關係確定,這種方法稱作Zero Padding。同時,權值g(卷積核)要進行歸一化操作(∑g=1)。
按下面的高斯分佈公式計算權值: g(x,y,σ)=2πσ21 e−2σ2x2+y2
其中 x 和 y 的座標是以當前濾波器的中心點爲基準。例如中心點右上方各1格的座標對,是(1,-1)。
標準差σ=1.3的8−近鄰高斯濾波器近似如下: K=161 ⎣⎡121242121⎦⎤
2. 中值濾波
中值濾波器也是一種可以使圖像平滑的濾波器,一定程度上可以去除圖像的噪聲,同時圖像的細節也會變得模糊。這種濾波器是提取出濾波器範圍內(在這裏假設是3×3)像素點的中值。爲了保證輸出圖像的大小和輸入一樣,需要採用Zero Padding。
3. 均值濾波
與中值濾波相似,均值濾波也是用於圖像降噪的。唯一與中值濾波不同的是,均值濾波對於濾波器範圍內的像素點,計算他們的均值作爲輸出。
邊緣檢測濾波器
1. Sobel濾波器
Sobel濾波器可以提取特定方向(縱向或橫向)的邊緣,濾波器按下式定義:
水平Sobel算子: K=⎣⎡10−120−210−1⎦⎤ 豎直Sobel算子: K=⎣⎡121000−1−2−1⎦⎤
Sobel算子可以近似的計算出圖像相鄰像素之間的梯度。假設濾波器現在滑動到背景部分,那麼濾波器卷積計算得到的值就非常小;反之,如果濾波器在背景和前景分界出,那麼濾波器滑過得到的卷積數值就會比較大。因此可以較好的提取出圖像的邊緣信息。
2. Prewitt濾波器
Prewitt濾波器也是用於邊緣檢測的一種濾波器,使用下式定義:
水平Prewitt算子: K=⎣⎡−101−101−101⎦⎤ 豎直Prewitt算子: K=⎣⎡−1−1−1000−111⎦⎤
Prewitt算子與Sobel算子不同的是,Sobel算子考慮了權值的因素,即在中心點正上方或正下方(正左和正右)的權值爲2,因爲這個像素點離中心更近,而離中心遠一點的斜側方的權值爲1;而Prewitt中沒有這種設定。總的來說,Sobel算是對Prewitt的一種改進,效果也自然更好一點。
3. Laplacian濾波器
有別於Sobel算子和Prewitt算子這兩類一階微分濾波器,Laplacian濾波器是對圖像亮度進行二次微分從而檢測邊緣的濾波器。由於數字圖像是離散的,x方向和y方向的一次微分分別按照以下式子計算: Ix(x,y)=(x+1)−xI(x+1,y)−I(x,y)=I(x+1,y)−I(x,y) Iy(x,y)=(y+1)−yI(x,y+1)−I(x,y)=I(x,y+1)−I(x,y) 所以二次微分按照以下式子計算: Ixx(x,y) =(x+1)−xIx(x,y)−Ix(x−1,y)=Ix(x,y)−Ix(x−1,y)=[I(x+1,y)−I(x,y)]−[I(x,y)−I(x−1,y)]=I(x+1,y)−2 I(x,y)+I(x−1,y) 同理: Iyy(x,y)=I(x,y+1)−2 I(x,y)+I(x,y−1) 因此,Laplacian 表達式如下: ∇2 I(x,y) =Ixx(x,y)+Iyy(x,y) =I(x−1,y)+I(x,y−1)−4∗I(x,y)+I(x+1,y)+I(x,y+1) 把這個式子表示爲卷積核是下面這樣的: K=⎣⎡0101−41010⎦⎤
參考:https://github.com/gzr2017/ImageProcessing100Wen