高斯模糊,又称高斯平滑,是在Photoshop等图像处理软件中广泛使用的处理效果,
通常用它来减少图像噪声以及降低细节层次。
图片高斯模糊进行之后就像通过一层薄薄的毛玻璃观察的图片;
因为从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。
由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。
其算法就是每个像素的最新值等于该像素周围相邻像素的加权平均值,相邻像素随着离该像素越远,
权重也越小;
本文中的算法只做了某一像素周围8个像素点的加权平均值;也就是高斯半径为1。
设:像素中心的坐标为(x,y),则
其中公式算法为:
R_new=(R(j-1,i-1)+ 2*R(j-1,i)+ R(j-1 ,i+1)+2*R(j,i-1)+4*R(j,i)+2*R(j,i+1)+R(j+1,i-1)+2*R(j+1,i)+R(j+1,i+1))/16
G_new=(G(j-1,i-1)+ 2*G(j-1,i)+ G(j-1 ,i+1)+2*G(j,i-1)+4*G(j,i)+2*G(j,i+1)+G(j+1,i-1)+2*G(j+1,i)+G(j+1,i+1))/16
B_new=(B(j-1,i-1)+ 2*B(j-1,i)+ B(j-1 ,i+1)+2*B(j,i-1)+4*B(j,i)+2*B(j,i+1)+B(j+1,i-1)+2*B(j+1,i)+B(j+1,i+1))/16
其中:2* 代表权重为2倍,4*代表权重为4倍,因为中心的权重最大,所以取4;除以16,是因为总权重为16;
原图如下:
效果图如下:
核心代码如下:
@Component(value = "gaussColorFilter")
public class GaussColorFilter extends AbstractPictureFilter {
/**
* 对像素color 进行处理
*
* @param color 原color
* @return 新color
*/
@Override
public Color filterColor(Color color) {
return null;
}
/**
* 对图片增加滤镜
*
* @param image 图片
* @return 增加滤镜之后的图片
*/
@Override
public BufferedImage pictureAddFilter(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
int[] colors = new int[width * height];
colors = image.getRGB(0, 0, width, height, colors, 0, width);
int[] guassBlur = new int[width * height];
BufferedImage guassImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int temp = width * (j) + (i);
if ((i == 0) || (i == width - 1) || (j == 0) || (j == height - 1)) {
guassBlur[temp] = 0;
} else {
int i0 = width * (j - 1) + (i - 1);
int i1 = width * (j - 1) + (i);
int i2 = width * (j - 1) + (i + 1);
int i3 = width * (j) + (i - 1);
int i4 = width * (j) + (i);
int i5 = width * (j) + (i + 1);
int i6 = width * (j + 1) + (i - 1);
int i7 = width * (j + 1) + (i);
int i8 = width * (j + 1) + (i + 1);
int red = new Color(colors[i0]).getRed() + 2 * new Color(colors[i1]).getRed() + new Color(colors[i2]).getRed() + 2 * new Color(colors[i3]).getRed() + 4 * new Color(colors[i4]).getRed() + 2 * new Color(colors[i5]).getRed() + new Color(colors[i6]).getRed() + 2 * new Color(colors[i7]).getRed() + new Color(colors[i8]).getRed();
int green = new Color(colors[i0]).getGreen() + 2 * new Color(colors[i1]).getGreen() + new Color(colors[i2]).getGreen() + 2 * new Color(colors[i3]).getGreen() + 4 * new Color(colors[i4]).getGreen() + 2 * new Color(colors[i5]).getGreen() + new Color(colors[i6]).getGreen() + 2 * new Color(colors[i7]).getGreen() + new Color(colors[i8]).getGreen();
int blue = new Color(colors[i0]).getBlue() + 2 * new Color(colors[i1]).getBlue() + new Color(colors[i2]).getBlue() + 2 * new Color(colors[i3]).getBlue() + 4 * new Color(colors[i4]).getBlue() + 2 * new Color(colors[i5]).getBlue() + new Color(colors[i6]).getBlue() + 2 * new Color(colors[i7]).getBlue() + new Color(colors[i8]).getBlue();
red = red/16;
green = green/16;
blue = blue/16;
guassBlur[temp] = new Color(red,green,blue).getRGB();
}
}
}
guassImage.setRGB(0,0,width,height,guassBlur,0,width);
return guassImage;
}
}