[LeetCode] 661. Image Smoother

CNoodle發表於2024-11-18

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).
Image

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:
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:
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

圖片平滑器。

影像平滑器 是大小為 3 x 3 的過濾器,用於對影像的每個單元格平滑處理,平滑處理後單元格的值為該單元格的平均灰度。

每個單元格的 平均灰度 定義為:該單元格自身及其周圍的 8 個單元格的平均值,結果需向下取整。(即,需要計算藍色平滑器中 9 個單元格的平均值)。

如果一個單元格周圍存在單元格缺失的情況,則計算平均灰度時不考慮缺失的單元格(即,需要計算紅色平滑器中 4 個單元格的平均值)。

思路

這道題不涉及演算法,就是二維矩陣的遍歷。

複雜度

時間O(mn)
空間O(1)

程式碼

Java實現

class Solution {
	public int[][] imageSmoother(int[][] img) {
		int m = img.length;
		int n = img[0].length;
		int[][] res = new int[m][n];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				int cur = helper(img, i, j);
				res[i][j] = cur;
			}
		}
		return res;
	}

	private int helper(int[][] img, int i, int j) {
		int sum = 0;
		int count = 0;
		for (int x = i - 1; x <= i + 1; x++) {
			for (int y = j - 1; y <= j + 1; y++) {
				if (x >= 0 && x < img.length && y >= 0 && y < img[0].length) {
					sum += img[x][y];
					count++;
				}
			}
		}
		return sum / count;
	}
}