影象處理中的高斯濾波器
技術標籤:影象處理
-
1 一維高斯分佈
-
1.1 一維高斯分佈的定義
若連續型隨機變數X的概率密度為:
其中,為常數,則稱X服從引數為,的正態分佈或高斯分佈,記為
-
1.2 一維高斯分佈的曲線
橫軸表示可能的取值x,豎軸表示概率分佈密度F(x),那麼不難理解這樣一個曲線與x軸圍成的圖形面積為1。因其曲線呈鐘形,因此人們又經常稱之為鐘形曲線。正態分佈的期望值決定了曲線的位置,標準差決定了分佈的幅度。
越大,則圖形越寬,分佈越分散,尖峰越小;
越小,則圖形越窄,分佈越集中,尖峰越大;
-
1.3 標準一維高斯分佈
當,時稱隨機變數X服從標準正態分佈:
-
2 二維高斯分佈
-
2.1 二維高斯分佈的定義
二維高斯分佈函式為X,Y兩個方向的一維高斯函式的乘積:
根據二維高斯函式具有旋轉對稱性得出:
當時,二維高斯函式如下:
-
2.2 二維高斯分佈的曲線
-
3 二維高斯濾波器
-
3.1 高斯濾波器簡介
高斯濾波器是一種線性濾波器,能夠有效的抑制噪聲,平滑影象。其作用原理和均值濾波器類似,都是取濾波器視窗內的畫素的均值作為輸出。但其視窗模板的係數和均值濾波器不同,均值濾波器的模板係數都是相同的為1,而高斯濾波器的模板係數則隨著距離模板中心的增大而減小。所以,高斯濾波器相比於均值濾波器對影象個模糊程度較小。
-
3.2 生成高斯濾波器模板(掩模)
要產生一個3×3的高斯濾波器模板,以模板的中心位置為座標原點進行取樣。模板在各個位置的座標,如下所示(x軸水平向右,y軸豎直向下)。
其中(x,y)為點座標,在影象處理中可認為是整數,是標準差。將各個位置的座標帶入到高斯函式中,得到的值就是模板的係數,模板中各個元素值的計算公式如下:
當=0.8時,計算出來的模板有兩種形式:小數和整數
1)小數形式的模板,就是直接計算得到的值,沒有經過任何的處理;
2)整數形式的模板需要進行歸一化處理,即將模板左上角的值歸一化為1。
取整後為:
使用整數的模板時,需要在模板的前面加一個係數,該係數為模板係數和的倒數,最終得到模板如下:
注意:由於最後要進行歸一化處理,因此在計算模板中各個元素的值時,可以去掉高斯函式的係數
-
3.3 值的意義及選取
通過上述的實現過程發現,生成高斯濾波器模板最重要的引數就是高斯分佈的標準差,標準差代表著資料的離散程度。
越小,模板的中心繫數越大,周圍的係數越小,這樣對影象的平滑效果就不是很明顯;
越大,模板的各個係數相差就不是很大,比較類似均值模板,對影象的平滑效果比較明顯。
-
3.4高斯函式的五個性質
高斯平滑濾波器,無論在空間域還是在頻率域都是十分有效的低通濾波器,高斯函式具有五個十分重要的性質:
(1)二維高斯函式具有旋轉對稱性,即濾波器在各個方向上的平滑程度是相同的。一般來說,一幅影象的邊緣方向是事先不知道的,因此,在濾波前是無法確定一個方向上比另一方向上需要更多的平滑。旋轉對稱性意味著高斯平滑濾波器在後續邊緣檢測中不會偏向任一方向。
(2)高斯函式是單值函式。這表明,高斯濾波器用畫素鄰域的加權均值來代替該點的畫素值,而每一鄰域畫素點權值是隨該點與中心點的距離單調增減的。這一性質是很重要的,因為邊緣是一種影象區域性特徵,如果平滑運算對離運算元中心很遠的畫素點仍然有很大作用,則平滑運算會使影象失真。
(3)高斯函式的傅立葉變換頻譜是單瓣的。正如下面所示,這一性質是高斯函式的傅立葉變換等於高斯函式本身(但幅值和方差發生了變化,尤其是方差變為倒數)這一事實的直接推論。影象常被不希望的高頻訊號所汙染(噪聲和細紋理)。而所希望的影象特徵(如邊緣),既含有低頻分量,又含有高頻分量。高斯函式傅立葉變換的單瓣意味著平滑影象不會被不需要的高頻訊號所汙染,同時保留了大部分所需訊號。
(4)高斯濾波器寬度(決定著平滑程度)是由引數σ表徵的,而且σ和平滑程度的關係是非常簡單的。σ越大,平滑程度就越好。通過調節平滑程度引數σ,可在影象特徵過分模糊(過平滑)與平滑影象中由於噪聲和細紋理所引起的過多的不希望突變數(欠平滑)之間取得折中。
(5)由於高斯函式的可分離性,大高斯濾波器可以得以有效地實現。二維高斯函式卷積可以分兩步來進行,首先將影象與一維高斯函式進行卷積,然後將卷積結果與方向垂直的相同一維高斯函式卷積。因此,二維高斯濾波的計算量隨濾波模板寬度成線性增長而不是成平方增長。
-
4. Opencv中的高斯函式
opencv中只給出了構建一維垂直方向上的高斯卷積核的函式:
-
Mat getGaussianKernel( int ksize, //一維垂直方向上高斯核的行數
-
double sigma,
//標準差
-
int ktype = CV_64F
//返回值的資料型別
-
)
對於一維水平方向上的高斯卷積核,可以通過對垂直方向上的卷積核進行轉置得到。對於二維的高斯卷積核可以通過兩個一維的卷積核卷積得到。(opencv中沒有找到合適的卷積的函式,這裡用乘積代替)
一維垂直方向 一維水平方向 二維卷積核
-
//構建一維垂直方向上的卷積核
-
Mat y = getGaussianKernel(
3,
1);
-
//構建一維水平方向上的卷積核
-
Mat x = getGaussianKernel(
3,
1);
-
x = x.t();
//轉置
-
//構建二維卷積核
-
Mat K = y*x;