代码原创:西安交大图像所 梁毅军 liang.yijun@live.cn //***********************Gauss平滑_加噪声.txt************************ //Gauss平滑 //****************************************************************** void Filter2D(byte[,]f,byte[,]g,float[,]mask) { int w = f.GetLength(0); int h = g.GetLength(1); int M = mask.GetLength(0)/2; int N = mask.GetLength(1)/2; for (int y=N;y<h-N;y++) for (int x=M;x<w-M;x++) { float r = 0; for (int m=-M;m<=M;m++) for (int n=-N;n<=N;n++) { r+=f[x+m,y+n]*mask[M+m,N+n]; } if (r>255) r = 255; if (r<0) r = 0; g[x,y] = (byte)r; } } float [,] MkGMask7X7(float r) { float [,] mask = new float[7,7]; for (int m=-3;m<=3;m++) for (int n=-3;n<=3;n++) { mask[3+m,3+n] = (float)Exp(-(m*m+n*n)/2.0/(r*r)); } float s = 0; for (int m=-3;m<=3;m++) for (int n=-3;n<=3;n++) { s+=mask[3+m,3+n]; } //归一化 for (int m=-3;m<=3;m++) for (int n=-3;n<=3;n++) { mask[3+m,3+n]=mask[3+m,3+n]/s; } return mask; } void main() { byte [,] f = LoadImg(); ShowImg("",f); int w = f.GetLength(0); int h = f.GetLength(1); //添加噪声 for (int n=0;n<1000;n++) { int x = (int)(Rand()*(w-1)); int y = (int)(Rand()*(h-1)); f[x,y] = 255; } ShowImg("Noise",f); //构造平均滤波器 float [,] mask = new float[5,5]; for (int m=0;m<mask.GetLength(0);m++) for (int n=0;n<mask.GetLength(1);n++) { mask[m,n] = 1.0f/25; } byte [,] g = new byte[w,h]; Filter2D(f,g,mask); ShowImg("Mean Filtering",g); Filter2D(f,g,MkGMask7X7(1)); ShowImg("Gauss Filtering 1",g); Filter2D(f,g,MkGMask7X7(2)); ShowImg("Gauss Filtering 2",g); }