比如使用5*5的模板,(sigma=1.4)得到的是歸一化的高斯濾波模板,高斯函數最開始的公式計算出來的是小數,因為小數計算過程更緩慢,所以為了提高運算效率,將其寫成整數模板的形式,另一方面小數模板在實際的像素上面也沒有實際意義,因為圖片的像素點都是整數的形式。
使用:
I=fspecial('gaussian',[5,5],1.4);
得到的是如下的模板
Q:至於這個整數如何選擇還真心不太清楚,希望大神能夠指點小白!
斯模板實際上也就是模擬高斯函數的特征,具有對稱性並且數值由中心向四周不斷減小,這個模板剛好符合這樣的特性,並且非常簡單,容易被大家接受,於是就比較經典!
double weight; double sum = 0; double Sigmma = 1; double Gaussian_Temp[SIZE][SIZE] = {0}; int i,j; weight = 2*PI*Sigmma*Sigmma; for(i =0;i <SIZE;i++) { for(j = 0;j < SIZE;j++) { Gaussian_Temp[i][j] =weight* exp(-((i-SIZE/2)*(i-SIZE/2)+(j-SIZE/2)*(j-SIZE/2))/(2.0*Sigmma*Sigmma)); sum += Gaussian_Temp[i][j]; } } for(i = 0; i < SIZE;i++) { for(j = 0;j < SIZE;j++) { Gaussian_Temp[i][j] = Gaussian_Temp[i][j]/sum;//歸一化處理 printf("%f ",Gaussian_Temp[i][j]); } printf("\n"); }
以5*5高斯模板為例,計算出來的高斯模板值為:
計算出來的結果與上圖5*5的高斯模板有一定差異,為什么會不一樣呢?查閱資料,解釋到:高斯模板實際上也就是模擬高斯函數的特征,具有對稱性並且數值由中心向四周不斷減小,上述圖像中的5*5這個模板剛好符合這樣的特性,並且非常簡單,容易被大家接受,於是就比較經典。也就是說上述圖像中5*5的高斯模板只是對二維高斯函數理論上計算出來的值的一種近似處理,如何從理論上的計算出來的值得到圖片中5*5的高斯模板呢?我是這么理解高斯模板中各個參數得由來,如何從理論值得到高斯模板中的值還不太清楚!!
此外,計算高斯模板參數時,需要歸一化處理,為什么需要進行歸一化處理呢?我的理解如下:
這是一維高斯函數概率密度函數圖像。橫軸表示可能得取值x,豎軸表示概率分布密度F(x),由高斯概率密度函數可知,那么不難理解這樣一個曲線與x軸圍成的圖形面積為1。在實際應用中,在計算離散近似的時候,在大概3σ距離之外的像素都可以看作不起作用,這些像素的計算也就可以忽略。也就是說,為了盡可能的模擬高斯函數的相關性質,計算高斯模板的時候,計算出來的高斯模板中各個數值其和必須為1,這也就
是為什么需要進行歸一化的原因。
高斯函數計算出來的模板之所以歸一化,另外一種解釋是:歸一化之后,通過卷積計算出來的模板中心像素被限制到了0-255的灰度區間中。假若某一鄰域內所有像素的灰度值為255,利用該模板進行卷積之后,求得的模板中心像素灰度值仍然為255;假若計算出來的高斯模板參數之和小於1,那么通過該模板進行卷積之后,模板中心像素的灰度值將小於255,偏離了實際的灰度值,產生了誤差。
參考文獻:
可以參見百度提問里面的:https://zhidao.baidu.com/question/1731699825590652867.html
http://lps-683.iteye.com/blog/2251180
http://blog.csdn.net/lz0499/article/details/54015150
http://www.360doc.com/content/10/1118/21/2226925_70546589.shtml