ARTS Week 19
Algorithm 本周的算法题为 661. 图片平滑器 图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。 如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。 给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像 。 示例 1: 输入:img = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[0, 0, 0],[0, 0, 0], [0, 0, 0]] 解释: 对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0 对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0 对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0 实现代码如下: var imageSmoother = function (img) { const m = img.length; const n = img[0].length; const result = new Array(m).fill(0).map(() => new Array(n).fill(0)); for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { result[i][j] = calculate(i, j); } } return result; function calculate(i, j) { let totalValue = 0; let count = 0; for (let x = Math.max(0, i - 1); x <= Math.min(i + 1, m - 1); x++) { for (let y = Math.max(0, j - 1); y <= Math.min(j + 1, n - 1); y++) { totalValue += img[x][y]; count++; } } return totalValue / count >> 0; } } 解题思路: 首先,代码初始化了两个变量 m 和 n,分别表示输入二维数组 img 的行数和列数。然后,创建了一个与 img 相同大小的二维数组 result,用于存储平滑后的图像。 ...