二維高斯分佈公式:
int k = 2;
int row = 2*k + 1;
int col = 2*k + 1;
double sigma = 1;
double *array = new double[row*col];
double dFenzi = 0.0;
double pi = 3.1415926;
for (int j=1; j<=row; j++)
{
for (int i=1; i<=col; i++)
{
dFenzi = pow((i-k-1), 2) + pow((j-k-1), 2);
array[(j-1)*row+i-1] = exp(-dFenzi/(2*sigma))/(2*pi*sigma);
printf("%0.4f\t",array[(j-1)*row+i-1]);
}
printf("\n");
}
//把高斯模版轉爲整數
int *iarray = new int[row*col];
for (int j=1; j<=row; j++)
{
for (int i=1; i<=col; i++)
{
iarray[(j-1)*row+i-1] = floor(array[(j-1)*row+i-1] * (1 / array[0]));
printf("%-5d\t",iarray[(j-1)*row+i-1]);
}
printf("\n");
}
別人寫的,寫的蠻好的:
void GetGaussianKernel(double **gaus, 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++)
{
gaus[i][j]=(1/(2*PI*sigma*sigma))*exp(-((i-center)*(i-center)+(j-center)*(j-center))/(2*sigma*sigma));
sum+=gaus[i][j];
}
}
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
gaus[i][j]/=sum;
cout<<gaus[i][j]<<" ";
}
cout<<endl<<endl;
}
return ;
}
假定σ=1.5,則模糊半徑爲1的權重矩陣如下:
這9個點的權重總和等於0.4787147,如果只計算這9個點的加權平均,還必須讓它們的權重之和等於1,因此上面9個值還要分別除以0.4787147,得到最終的權重矩陣:
有了權重矩陣,就可以計算高斯模糊的值了。
中心點以及周邊n個點,每個點乘以自己的權重值並將這些值相加,就是中心點的高斯模糊的值。對所有點重複這個過程,就得到了高斯模糊後的圖像。