图片平滑器:
图像平滑器 是大小为 3 x 3
的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/image-smoother
//具体地,对于位置 (i,j)(i,j),我们枚举其周围的九个单元是否存在,对于存在的单元格,我们统计其数量num 与总和 sum,那么该位置平滑处理后的结果即为 sum / num
public class ImageSmoother {
public static int[][] imageSmoother(int[][] img) {
int m = img.length, 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 sum = img[i][j];
int num = 1;
if (i > 0 && j > 0) {
sum += img[i - 1][j - 1];
num++;
}
if (i > 0) {
sum += img[i - 1][j];
num++;
}
if (i > 0 && j < n - 1) {
sum += img[i - 1][j + 1];
num++;
}
if (j > 0) {
sum += img[i][j - 1];
num++;
}
if (j < n - 1) {
sum += img[i][j + 1];
num++;
}
if (i < m - 1 && j > 0) {
sum += img[i + 1][j - 1];
num++;
}
if (i < m - 1) {
sum += img[i + 1][j];
num++;
}
if (i < m - 1 && j < n - 1) {
sum += img[i + 1][j + 1];
num++;
}
res[i][j] = sum / num;
}
}
return res;
}
public static void main(String[] args) {
int[][] img = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
for (int[] ints : imageSmoother(img)) {
for (int i : ints) {
System.out.print(i + " ");
}
System.out.println();
}
}
}