常見的圖像濾波算法

本文介紹五種常見的圖像濾波方式:線性濾波(方框濾波、均值濾波、高斯濾波);非線性濾波(中值濾波、雙邊濾波)。提醒,本文主要是算法公式,沒有具體完整的代碼。算法

 

1、線性濾波數組

總的來講,這三種線性濾波原理:每一個像素的輸出值是輸入像素的加權和。其處理方式都是將圖像像素與相應的核進行卷積,核便是權重(下圖中中間3*3大小的圖就是核),其做用是將原圖像素按權重進行分配。簡單講,卷積就是選取原圖像與核相同大小的部分(下圖左側對照部分),而後與覈對應相乘相加,所得的值賦給原圖中的錨點(下圖是中心點,右側對照部分)(有關卷積的講解可參考下圖的轉載連接)。app

卷積(圖像轉自https://blog.csdn.net/zouxy09/article/details/49080029,侵刪)函數

因此說,這三種濾波方式的區別在於卷積核的不一樣,下面分別敘述。url

 

1.1方框濾波和均值濾波的卷積核spa

以下圖,K即爲方框濾波的核,能夠看到不管a爲什麼值,矩陣內的每個元素都相等,卷積時對像素的權重都同樣。均值濾波是方框濾波歸一化後的特殊處理,下圖中,當normalize = ture時的K爲均值濾波的核。我的以爲,方框濾波和均值濾波沒有實質上的區別。.net

 

1.2高斯濾波的卷積核3d

咱們先來看一下一維高斯函數,以下圖,a表明尖峯高度,b表明尖峯中心的x座標,c是標準方差,表明尖峯的寬度。圖3表示「3σ」原則,意思是,雖然定義域的範圍是正無窮到負無窮,可是曲線的絕大部分都在「-3σ - 3σ」之間。code

     ​   

                         一維高斯函數(圖一、2轉載自https://blog.csdn.net/jorg_zhao/article/details/52687448,侵刪)orm

接下來咱們看看二維高斯函數,其服從當ρ=0時的二維正態分佈,即x、y不相關。一樣,參照一維高斯函數,A是幅值,即高度;x。y。是中心點座標;σσy是方差,表明底面的兩個方向上的寬度。

          ​     

                       二維高斯函數(轉載自https://blog.csdn.net/jorg_zhao/article/details/52687448,侵刪)

在計算高斯核時,因爲在x、y兩個方向上咱們所須要的寬度是徹底一致的,因此咱們能夠取σx = σy,這時公式變爲

                                      A=\frac{1}{2\pi \sigma^{2}}                   G(x,y)=Aexp(-(\frac{(x-x_{0})^{2} + (y-y_{0})^{2}}{2\sigma ^{2}}))

由上述公式,咱們就能夠求出高斯核,代碼以下

//******************高斯卷積核生成函數************************* //第一個參數Guass是存高斯卷積核的二維數組 //第二個參數size是高斯卷積核的尺寸大小; //第三個參數sigma是卷積核的標準差 //*************************************************************
void CDisplay::GetGaussianKernel(double **Guass, const int size, const double sigma) { const double PI = 4.0*atan(1.0); //圓周率π賦值
    int center = size / 2; double sum = 0; for (int i = 0; i<size; i++) { for (int j = 0; j<size; j++) { Guass[i][j] = (1 / (2 * PI*sigma*sigma))*exp(-((i - center)*(i - center) + (j - center)*(j - center)) / (2 * sigma*sigma)); sum += Guass[i][j]; } } for (int i = 0; i<size; i++)    //歸一化
 { for (int j = 0; j<size; j++) { Guass[i][j] /= sum; } } }

sigma與size值的選取:通常其狀況,size = sigma*3+1,由於「3σ」原則。

 

2、非線性濾波

2.1中值濾波

基本思想:用像素點鄰域灰度值的中值來代替該像素點的灰度值。

以下圖,將中心點周圍被稱爲鄰域的像素點(包括自身)進行排序,取排序後9個像素值中間值做爲當前新的像素值。

                    中值濾波原理圖(圖片轉載自https://blog.csdn.net/qq_36359022/article/details/80116137,侵刪)

 

 2.2雙邊濾波

基於空間分佈的高斯濾波函數,其核爲一個與空間距離相關的高斯函數與一個灰度距離相關的高斯函數相乘所得。簡單說就是高斯濾波的增強版,在高斯濾波中,只有關於空間距離的權重,離中心點越遠,權重越小,而雙邊濾波在此基礎上添加了關於灰度距離的權重,鄰域中的像素灰度值越接近中心點灰度值,權重越大。

下面開始來說權重的計算獲取。

空間距離:指的是當前點與中心點的歐式距離。空間域高斯函數其數學形式爲:

                                                    d(i,j,k,l)=exp(-\frac{(i-k)^{2}+(j-l)^{2}}{2\sigma _{d}^{2}}) 

(i, j)表明輸出點;(k, l)表明(多個)輸入點;sigma爲空間域標準差。

這也叫定義域核的表示形式,叫這個名字的緣由,我的理解是:這裏的權重只和平面位置距離有關,只和x、y有關。同時能夠發現,這公式其實就是高斯濾波的公式。

灰度距離:指的是當前點灰度與中心點灰度的差的絕對值。值域高斯函數其數學形式爲:

                                       r(i,j,k,l)=exp(-\frac{\left \| f(i,j)^{2}-f(k,l)^{2} \right \|}{2\sigma_{r} ^{2}})

(i, j)表明輸出點;(k, l)表明(多個)輸入點;sigma爲值域標準差。

一樣,這也叫值域核的表示形式,理由和上面相似,其所求結果r只與灰度值有關。

將上述兩公式相乘就能夠獲得,依賴數據的雙邊濾波權重函數:

                     \omega (i,j,k,l)=exp(-\frac{(i-k)^{2}+(j-l)^{2}}{2\sigma_{d} ^{2}}-\frac{\left \| f(i,j)^{2}-f(k,l)^{2} \right \|}{2\sigma_{r} ^{2}})

至此,即獲得了雙邊濾波的權重,最後在將權重與像素對應相乘相加再除以權重和,即求出最後輸出像素值。

                                             g(i,j)=\frac{\sum _{k,l}f(k,l)\omega (i,j,k,l)}{\sum _{k,l}\omega (i,j,k,l)}

再求出權重後,若是先歸一化,最後這一步實際上是在求卷積。我的認爲,雙邊濾波的算法流程也是先求出一個核,只是這個核是在高斯核的基礎上乘了一個表明灰度類似程度的一個權重,最後在進行相似卷積操做。

 

以上,即是部分了。本人小白一枚,有錯還請指出,歡迎探討。

相關文章
相關標籤/搜索