\quad
首先高斯函式的定義為h(x
,y)=
e−x2
+y22
σ2
h(x, y) = e^}
h(x,y)
=e−2
σ2x2
+y2
,其中(x,y)是影象中的點的座標,σ
\sigma
σ為標準差,高斯模板就是利用這個函式來計算的,我們來看高斯模板,假設大小為(2k+1)*(2k+1)為什麼長寬都為奇數,這主要是保證整個模板有唯一中心元素,便於計算。高斯模板中的元素值為:hi,
j=12
πσ2e
−(i−
k−1)
2+(j
−k−1
)22σ
2h_=\frac}e^}
hi,j=
2πσ2
1e−
2σ2(
i−k−
1)2+
(j−k
−1)2
,然後在實現生成高斯模板時,又有兩種形式,即整數和小數,對於小數形式的就是按照公式直接計算,不需要其他處理,而整數形式的需要歸一化,將模板左上角的值歸一化為1,。使用整數的模板時,需要在模板前面加乙個係數,這個係數為1∑(
i,j)
∈wwi
,j
\fracw_}
∑(i,j)
∈ww
i,j
1,就是模板係數和的導數。
生成小數高斯模板**如下:
#define pi 3.1415926
//生成小數形式的高斯模板
void generategaussiantemplate(double window[11], int ksize, double sigma)
}//歸一化左上角的數為1
double k = 1 / window[0][0];
for(int i = 0; i < ksize; i++)
}}
整數部分基本一樣,就不說了。對於ksi
ze=3
ksize=3
ksize=
3,σ=
0.8\sigma=0.8
σ=0.
8的高斯模板結果為,
1.00000 2.71828 1.00000
2.71828 7.38906 2.71828
1.00000 2.71828 1.00000
這裡想說一下σ
\sigma
σ的作用,當σ
\sigma
σ比較小的時候,生成的高斯模板中心的係數比較大,而周圍的係數比較小,這樣對影象的平滑效果不明顯。而當σ
\sigma
σ比較大時,生成的模板的各個係數相差就不是很大,比較類似於均值模板,對影象的平滑效果比較明顯。
1、按照公式暴力高斯濾波
//o(m * n * ksize^2)
void gaussianfilter(const mat &src, mat &dst, int ksize, double sigma)
generategaussiantemplate(gaussiantemplate, ksize, sigma);
//padding
int border = ksize / 2;
copymakeborder(src, dst, border, border, border, border, border_constant);
int channels = dst.channels();
int rows = dst.rows - border;
int cols = dst.cols - border;
for(int i = border; i < rows; i++);
for(int a = -border; a <= border; a++)else if(channels == 3)}}
for(int k = 0; k < channels; k++)
if(channels == 1)else if(channels == 3);
dst.at(i, j) = rgb;}}
}for(int i = 0; i < ksize; i++)
delete gaussiantemplate[i];
delete gaussiantemplate;
}
2、分兩步進行高斯濾波,先在水平方向高斯濾波,然後垂直方向高斯濾波,在核的size較大的情況下有很大的優化作用,**如下
//分離實現高斯濾波
//o(m*n*k)
void separategaussianfilter(const mat &src, mat &dst, int ksize, double sigma)
for(int i = 0; i < ksize; i++) matrix[i] /= sum;
int border = ksize / 2;
copymakeborder(src, dst, border, border, border, border, border_constant);
int channels = dst.channels();
int rows = dst.rows - border;
int cols = dst.cols - border;
//水平方向
for(int i = border; i < rows; i++);
for(int k = -border; k<=border; k++)else if(channels == 3)
}for(int k = 0; k < channels; k++)
if(channels == 1)
dst.at(i, j) = static_cast(sum[0]);
else if(channels == 3);
dst.at(i, j) = rgb;}}
}//豎直方向
for(int i = border; i < rows; i++);
for(int k = -border; k<=border; k++)else if(channels == 3)
}for(int k = 0; k < channels; k++)
if(channels == 1)
dst.at(i, j) = static_cast(sum[0]);
else if(channels == 3);
dst.at(i, j) = rgb;}}
}delete matrix;
}
OpenCV 高斯濾波實現
高斯濾波是一種線性平滑濾波,適用於消除高斯雜訊,廣泛應用於影象處理的減噪過程。通俗的講,高斯濾波就是對整幅影象進行加權平均的過程,每乙個畫素點的值,都由其本身和鄰域內的其他畫素值經過加權平均後得到。在影象處理中高斯濾波一般有兩種實現方式 一種是用離散化視窗滑窗卷積,另一種是通過傅利葉變換。最常見的就...
python實現高斯濾波
一,定義 核是 3 3 均值濾波 二,高斯函式 y方向的方差與x方向的一致。處理後影象看起來更模糊 濾波明顯 的話,核要更大。三 實現 四 核計算 五 影象產生高斯雜訊迴圈 實現 1 def clamp pv 使我們的隨機值在0 255之間 2if pv 255 3return 255 4if pv...
高斯濾波之FPGA實現
濾波,即強調影象中的某些特徵,或者去除影象中不需要的資訊。例如 影象去燥 影象增強 邊緣檢測等。濾波是乙個鄰域操作運算元。通常,鄰域選擇3x3,5x5等,這些3x3或者5x5的鄰域,稱作濾波器,掩模或核。利用給定畫素鄰域內的畫素值與掩模做卷積,從而決定該畫素的最終輸出值。介紹高斯濾波之前,先從均值濾...