图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)

时间:2022-04-09 08:33:45

描述:高斯平滑滤波器被使用去模糊图像,和均值滤波器差不多,但是和均值滤波器不一样的地方就是核不同。均值滤波器的核每一个值都是相等,而高斯平滑滤波器的核内的数却是呈现高斯分布的。

对于二维高斯分布:

图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)


它的分布图如下:

图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)

作为高斯平滑滤波器的核就应该呈现出上图的布局,例如:

图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)


上图分布凸显出了高斯该有的特点,因此,一般而言,高斯平滑滤波器要优于均值滤波器。


Code:


  /**
* Takes an input image and a gaussian distribution, calculates
* an appropriate kernel and applies a convolution to gaussian
* smooth the image.
*
* @param input the input image array
* @param w the width of the image
* @param h the height of the image
* @param ks the size of the kernel to be generated
* @param theta the gaussian distribution
* @return smoothed image array
*/
public static int [] smooth_image(int [] input, int w, int h,
int ks, double theta){
double [][] input2D = new double [w][h];
double [] output1D = new double [w*h];
double [][] output2D = new double [w][h];
int [] output = new int [w*h];
//extract greys from input (1D array) and place in input2D
for(int j=0;j<h;++j){
for(int i=0;i<w;++i){
input2D[i][j] = (new Color(input[j*w+i])).getRed();
}
}
//now smooth this new 2D array
output2D = smooth(input2D,w,h,ks,theta);

for(int j=0;j<h;++j){
for(int i=0;i<w;++i){
output1D[j*w+i]=output2D[i][j];
}
}
for(int i=0;i<output1D.length;++i){
int grey = (int) Math.round(output1D[i]);
if (grey > 255) { grey = 255;}
if (grey < 0) { grey = 0;}
//System.out.println(grey);
output[i] = (new Color(grey,grey,grey)).getRGB();
}

return output;
}

}


Input Image


图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)


Output Image:

经过一个均值为0,方差了1的高斯核(5*5)进行处理得到下图:

图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)


经过一个均值为0,方差为2的高斯核(9*9)处理得到下图:

图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)


再经过一个均值为0,方差为4的高斯核(15*15)处理得到下图:

图像处理滤波器(三)——高斯平滑滤波器(Gaussian Smoothing Filter)


总结:高斯平滑滤波器平滑效果比均值滤波器更好明显。