高斯模糊(英语:Gaussian Blur),也叫高斯平滑
是图片中的每一个点都根据二维正态分布公式将颜色取周围点的平均值,让图片降低本身的颜色层次.达到平滑的效果
思路:
- 利用高斯公式计算出权重矩阵
- 利用权重矩阵计算中心点的r,g,b三个通道的改变后的值
- 利用新的颜色值绘制出图片
二维空间正态分布公式:
σ是正态分布的标准偏差(<1的正数)
u是横坐标
v是纵坐标
/**
* 此方法用于计算并返回权重矩阵
* r就是权重矩阵的半径例如r为1,就是3*3矩阵
* @return
*/
private double[][] getMatricx(){
double matricx[][] = new double[2*r+1][2*r+1];//定义一个9*9的二维数组存放权重
double sum = 0f;
for (int i = -r; i <=r; i++) {
for (int j = -r; j <= r; j++) {
matricx[i+r][j+r] = Math.pow(Math.E, (-i*i-j*j)/(2*k*k))/(2*Math.PI*k*k);
sum+=matricx[i+r][j+r];
}
}
//各权重相加之和必须为1
if(sum!=1){
for (int i = 0; i < 2*r+1; i++) {
for (int j = 0; j < 2*r+1; j++) {
matricx[i][j] /= sum;
//System.out.println(matricx[i][j]);
}
}
}
return matricx;
}
权重矩阵
半径为1
σ=1.5时
根据公式计算出权重矩阵为
但是权重之和为0.4787148085297054不等于1
所以矩阵中每一个数都要/0.4787148085297054
颜色改变
计算某点的颜色值时,以该点作为中心点,创建矩阵,每一个点的权重值*颜色值相加就是中心点的颜色值
/**
* 获取传入坐标的高斯模糊后的颜色
* @param x
* @param y
* @return:高斯模糊后的颜色
*/
private Color getMiddleColor(int x,int y){
//获取以该点为中心的权重矩阵
double rsum = 0,gsum = 0,bsum = 0;
for (int i = -r; i <=r; i++) {
for (int j = -r; j <=r; j++) {
if(x+i>=0&&y+j>=0&&x+i<data.length&&y+j<data[x+i].length){
Color c = new Color(data[x+i][y+j]);
int re=c.getRed();int g=c.getGreen();int b=c.getBlue();
rsum += matricx[i+r][j+r]*re;
gsum += matricx[i+r][j+r]*g;
bsum += matricx[i+r][j+r]*b;
}
}
}
Color color = new Color((int)(rsum),(int)(gsum),(int)(bsum));
return color;
}