简单枚举
对于任意的一个点x,即坐标为img[ i ][ j ],我们都可以通过改变横坐标i,和纵坐标j的值来得到其它方向的值,即
let step = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
此时 我们只需要将i和j和循环时每个方向上的坐标相加,就能得到该方向坐标的值,然后对于每一个img[i][j]维护一个数的总和和数量,将结果计算后添加进新数组就可以了。(注意边界情况。越过边界的值无效)
代码参考(JavaScript)
var imageSmoother = function(img) {
let oldImge = [];//结果二维数组
let m = img.length,n = img[0].length;//img长度
let step = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];//八个方向上的值
for(let i = 0;i<m;i++){//循环img长度
if(!oldImge[i]) oldImge[i] = [];//创建新数组
for(let j = 0;j<n;j++){//循环img[0]长度 也就是循环每个点
let num = img[i][j];//因为是9个值累加 所以需要首先加上自身的值
let sum = 1;//自身的步数
for(let k = 0;k<step.length;k++){//循环八个方向的值 step
let newx = i+step[k][0];//得到当前方向的横坐标的值
let newy = j+step[k][1];//得到当前方向的纵坐标的值
if(newx >= 0 && newx < m && newy >=0 && newy < n){//判断是否越过了边界 越过了就不能计算在其中
num += img[newx][newy];//当前方向上的值有效 累加数值
sum++;//累加步数
}
}
oldImge[i][j] = Math.floor(num/sum);//将当前点八个方向上和自身的平均值计算后放入结果数组
}
}
return oldImge;//返回结果数组
};