返回介绍

solution / 0600-0699 / 0661.Image Smoother / README_EN

发布于 2024-06-17 01:03:35 字数 6574 浏览 0 评论 0 收藏 0

661. Image Smoother

中文文档

Description

An image smoother is a filter of the size 3 x 3 that can be applied to each cell of an image by rounding down the average of the cell and the eight surrounding cells (i.e., the average of the nine cells in the blue smoother). If one or more of the surrounding cells of a cell is not present, we do not consider it in the average (i.e., the average of the four cells in the red smoother).

Given an m x n integer matrix img representing the grayscale of an image, return _the image after applying the smoother on each cell of it_.

 

Example 1:

Input: img = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[0,0,0],[0,0,0],[0,0,0]]
Explanation:
For the points (0,0), (0,2), (2,0), (2,2): floor(3/4) = floor(0.75) = 0
For the points (0,1), (1,0), (1,2), (2,1): floor(5/6) = floor(0.83333333) = 0
For the point (1,1): floor(8/9) = floor(0.88888889) = 0

Example 2:

Input: img = [[100,200,100],[200,50,200],[100,200,100]]
Output: [[137,141,137],[141,138,141],[137,141,137]]
Explanation:
For the points (0,0), (0,2), (2,0), (2,2): floor((100+200+200+50)/4) = floor(137.5) = 137
For the points (0,1), (1,0), (1,2), (2,1): floor((200+200+50+200+100+100)/6) = floor(141.666667) = 141
For the point (1,1): floor((50+200+200+200+200+100+100+100+100)/9) = floor(138.888889) = 138

 

Constraints:

  • m == img.length
  • n == img[i].length
  • 1 <= m, n <= 200
  • 0 <= img[i][j] <= 255

Solutions

Solution 1

class Solution:
  def imageSmoother(self, img: List[List[int]]) -> List[List[int]]:
    m, n = len(img), len(img[0])
    ans = [[0] * n for _ in range(m)]
    for i in range(m):
      for j in range(n):
        s = cnt = 0
        for x in range(i - 1, i + 2):
          for y in range(j - 1, j + 2):
            if 0 <= x < m and 0 <= y < n:
              cnt += 1
              s += img[x][y]
        ans[i][j] = s // cnt
    return ans
class Solution {
  public int[][] imageSmoother(int[][] img) {
    int m = img.length;
    int n = img[0].length;
    int[][] ans = new int[m][n];
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        int s = 0;
        int cnt = 0;
        for (int x = i - 1; x <= i + 1; ++x) {
          for (int y = j - 1; y <= j + 1; ++y) {
            if (x >= 0 && x < m && y >= 0 && y < n) {
              ++cnt;
              s += img[x][y];
            }
          }
        }
        ans[i][j] = s / cnt;
      }
    }
    return ans;
  }
}
class Solution {
public:
  vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
    int m = img.size(), n = img[0].size();
    vector<vector<int>> ans(m, vector<int>(n));
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        int s = 0, cnt = 0;
        for (int x = i - 1; x <= i + 1; ++x) {
          for (int y = j - 1; y <= j + 1; ++y) {
            if (x < 0 || x >= m || y < 0 || y >= n) continue;
            ++cnt;
            s += img[x][y];
          }
        }
        ans[i][j] = s / cnt;
      }
    }
    return ans;
  }
};
func imageSmoother(img [][]int) [][]int {
  m, n := len(img), len(img[0])
  ans := make([][]int, m)
  for i, row := range img {
    ans[i] = make([]int, n)
    for j := range row {
      s, cnt := 0, 0
      for x := i - 1; x <= i+1; x++ {
        for y := j - 1; y <= j+1; y++ {
          if x >= 0 && x < m && y >= 0 && y < n {
            cnt++
            s += img[x][y]
          }
        }
      }
      ans[i][j] = s / cnt
    }
  }
  return ans
}
function imageSmoother(img: number[][]): number[][] {
  const m = img.length;
  const n = img[0].length;
  const locations = [
    [-1, -1],
    [-1, 0],
    [-1, 1],
    [0, -1],
    [0, 0],
    [0, 1],
    [1, -1],
    [1, 0],
    [1, 1],
  ];

  const res = [];
  for (let i = 0; i < m; i++) {
    res.push([]);
    for (let j = 0; j < n; j++) {
      let sum = 0;
      let count = 0;
      for (const [y, x] of locations) {
        if ((img[i + y] || [])[j + x] != null) {
          sum += img[i + y][j + x];
          count++;
        }
      }
      res[i].push(Math.floor(sum / count));
    }
  }
  return res;
}
impl Solution {
  pub fn image_smoother(img: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
    let m = img.len();
    let n = img[0].len();
    let locations = [
      [-1, -1],
      [-1, 0],
      [-1, 1],
      [0, -1],
      [0, 0],
      [0, 1],
      [1, -1],
      [1, 0],
      [1, 1],
    ];

    let mut res = vec![];
    for i in 0..m {
      res.push(vec![]);
      for j in 0..n {
        let mut sum = 0;
        let mut count = 0;
        for [y, x] in locations.iter() {
          let i = (i as i32) + y;
          let j = (j as i32) + x;
          if i < 0 || i == (m as i32) || j < 0 || j == (n as i32) {
            continue;
          }
          count += 1;
          sum += img[i as usize][j as usize];
        }
        res[i].push(sum / count);
      }
    }
    res
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文