高斯濾波的C 實現與優化

2021-09-01 11:25:36 字數 3322 閱讀 1468

\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

1​e−

2σ2(

i−k−

1)2+

(j−k

−1)2

​,然後在實現生成高斯模板時,又有兩種形式,即整數和小數,對於小數形式的就是按照公式直接計算,不需要其他處理,而整數形式的需要歸一化,將模板左上角的值歸一化為1,。使用整數的模板時,需要在模板前面加乙個係數,這個係數為1∑(

i,j)

∈wwi

,j

\fracw_}

∑(i,j)

∈w​w

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的鄰域,稱作濾波器,掩模或核。利用給定畫素鄰域內的畫素值與掩模做卷積,從而決定該畫素的最終輸出值。介紹高斯濾波之前,先從均值濾...